先说明下,实现悬浮窗窗的代码我是借鉴别人的代码,但是我找不到他的链接,知道可以联系一下。
FileVideoPlayService 实现功能,通过传递url,将url的代码进行播放,同时悬浮窗能够实现上下左右移动,在原有的基础上修改一下。实现上下左右代码为
floatWindowLayoutUpdateParam.x = (int) ((x - event.getRawX()) + px);
floatWindowLayoutUpdateParam.y = (int) ((y + event.getRawY()) - py);
代码如下所示:
import static com.iprima.primasip.Constants.FILE_VIDEO_PLAY_NAME;
import static com.iprima.primasip.Constants.FILE_VIDEO_PLAY_URL;
import android.app.ActionBar;
import android.app.Service;
import android.content.Intent;
import android.graphics.PixelFormat;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.os.IBinder;
import android.provider.Settings;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.iprima.interfacemanager.SharedPreferenceUtil;
import com.iprima.primasip.R;
import java.util.Timer;
import java.util.TimerTask;
import butterknife.BindView;
/**
* 悬浮窗的服务
*
* @author an.rustfisher.com
* @date 2022-01-05 23:53
*/
public class FileVideoPlayService extends Service implements View.OnClickListener{
private static final String TAG = "rfDevFloatingService";
//这边是控件的初始化,使用了onBindView框架
@BindView(R.id.video_pause)
public ImageView mPauseVideoImage;
@BindView(R.id.video_close)
public ImageView mCloseVideoImage;
@BindView(R.id.video_name)
public TextView mVideoNameView;
@BindView(R.id.video_time)
public TextView mVideoTimeView;
private String mVideoName;
private String mVideoTime;
private String mVideoUrl;
private MediaPlayer mMediaPlayer;
private int mCurrentPosition;
private WindowManager mWindowManager;
private View mFloatView;
private TimerTask mTimerTask;
private Timer mTimer = new Timer();
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mVideoName = intent.getStringExtra(FILE_VIDEO_PLAY_NAME);
Log.d(TAG, "onStartCommand: " + mVideoName);
mVideoUrl = intent.getStringExtra(FILE_VIDEO_PLAY_URL);
if (mFloatView == null) {
Log.d(TAG, "onStartCommand: 创建悬浮窗");
initUi();
}
initData();
return super.onStartCommand(intent, flags, startId);
}
private void initData() {
initView(mFloatView);
mVideoNameView.setText(mVideoName);
mVideoTimeView.setText(mVideoTime);
mPauseVideoImage.setImageResource(R.mipmap.icon_file_video_play);
mPauseVideoImage.setOnClickListener(this);
mCloseVideoImage.setOnClickListener(this);
//播放
if (mMediaPlayer == null){
startPlay();
}else if (mMediaPlayer.isPlaying()){
stopPlay();
startPlay();
}else {
stopPlay();
startPlay();
}
}
private void stopPlay() {
if (mMediaPlayer != null) {
mMediaPlayer.stop();
mMediaPlayer.reset();
mMediaPlayer.release();
}
}
private void startPlay() {
String videoUrl = SharedPreferenceUtil.getInstance(this).getString(SharedPreferenceUtil.INFO_SP, SharedPreferenceUtil.FILE_VIIDEO_PUBLIC_SETTING_URL) + mVideoUrl;
Log.d(TAG, "setOnclickListener: " + videoUrl);
mMediaPlayer = new MediaPlayer();
mMediaPlayer = MediaPlayer.create(this, Uri.parse(videoUrl));
//异步处理,添加监听
// mMediaPlayer.prepareAsync();
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mMediaPlayer.start();
}
});
mMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
Log.d(TAG, "onCompletion: " + mp);
mPauseVideoImage.setImageResource(R.mipmap.icon_file_video_pause);
}
});
mMediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mp, int what, int extra) {
mPauseVideoImage.setImageResource(R.mipmap.icon_file_video_pause);
return false;
}
});
//设置定时器,更新音频播放时长
mTimerTask =new TimerTask() {
@Override
public void run() {
if (mMediaPlayer.isPlaying()){
int minTime = (mMediaPlayer.getCurrentPosition()) / 60000 ;
int sTime = (mMediaPlayer.getCurrentPosition() - minTime * 60000) / 1000;
String showTime = String.format("%02d", minTime) + " : " + String.format("%02d", sTime);
mVideoTimeView.setText(showTime);
}
}
};
//每隔1秒检测一下播放进度
mTimer.schedule(mTimerTask, 100, 1000);
}
@Override
public void onDestroy() {
Log.d(TAG, "onDestroy");
super.onDestroy();
}
private void initUi() {
DisplayMetrics metrics = getApplicationContext().getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;
mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
LayoutInflater inflater = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
mFloatView = (ViewGroup) inflater.inflate(R.layout.file_dialog_video_play, null);
int layoutType;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
layoutType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
layoutType = WindowManager.LayoutParams.TYPE_TOAST;
}
WindowManager.LayoutParams floatLp = new WindowManager.LayoutParams(
// R.dimen.file_dialog_video_width_220dp,
// R.dimen.file_dialog_video_width_105dp,
(int) (width * (0.18f)),
(int) (height * (0.15f)),
layoutType,
WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON,
PixelFormat.TRANSLUCENT
);
floatLp.gravity = Gravity.RIGHT ;
floatLp.x = 100;
floatLp.y = 800;
if (Build.VERSION.SDK_INT >= 23) {
if (!Settings.canDrawOverlays(this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
//startActivityForResult(intent, 1);
}
}
mWindowManager.addView(mFloatView, floatLp);
mFloatView.setOnTouchListener(new View.OnTouchListener() {
final WindowManager.LayoutParams floatWindowLayoutUpdateParam = floatLp;
double x;
double y;
double px;
double py;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = floatWindowLayoutUpdateParam.x;
y = floatWindowLayoutUpdateParam.y;
px = event.getRawX();
py = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
//实现左右移动,需要变成如下代码所示
floatWindowLayoutUpdateParam.x = (int) ((x - event.getRawX()) + px);
floatWindowLayoutUpdateParam.y = (int) ((y + event.getRawY()) - py);
mWindowManager.updateViewLayout(mFloatView, floatWindowLayoutUpdateParam);
break;
}
return false;
}
});
}
private void initView(View mFloatView) {
mPauseVideoImage = mFloatView.findViewById(R.id.video_pause);
mCloseVideoImage = mFloatView.findViewById(R.id.video_close);
mVideoNameView = mFloatView.findViewById(R.id.video_name);
mVideoTimeView = mFloatView.findViewById(R.id.video_time);
mPauseVideoImage.setImageResource(R.mipmap.icon_file_video_play);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.video_pause:
videoPlayClick();
break;
case R.id.video_close:
videoCloseAClick();
break;
}
}
private void videoPlayClick() {
Log.d(TAG, "videoPlayClick: ");
if (mMediaPlayer.isPlaying()){
mPauseVideoImage.setImageResource(R.mipmap.icon_file_video_pause);
mCurrentPosition = mMediaPlayer.getCurrentPosition();
mMediaPlayer.pause();
}else {
String videoUrl = SharedPreferenceUtil.getInstance(this).getString(
SharedPreferenceUtil.INFO_SP, SharedPreferenceUtil.FILE_VIIDEO_PUBLIC_SETTING_URL) + mVideoUrl;
mPauseVideoImage.setImageResource(R.mipmap.icon_file_video_play);
mMediaPlayer = MediaPlayer.create(this, Uri.parse(videoUrl));
mMediaPlayer.seekTo(mCurrentPosition);
mMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mMediaPlayer.start();
}
});
}
}
private void videoCloseAClick() {
stopPlay();
stopSelf();
mWindowManager.removeView(mFloatView);
mTimer.cancel();
}
}