Realize the service services of audio playback floating window

Let me explain first, the code to realize the floating window is borrowed from other people's code, but I can't find his link, so I can contact you if I know it.
FileVideoPlayService implements the function. By passing the url, the code of the url is played. At the same time, the floating window can move up, down, left, and right, and it can be modified on the original basis. The code to achieve up, down, left, and right is

floatWindowLayoutUpdateParam.x = (int) ((x - event.getRawX()) + px);
floatWindowLayoutUpdateParam.y = (int) ((y + event.getRawY()) - py);

The code looks like this:

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();
	}



}

Guess you like

Origin blog.csdn.net/qq_51108920/article/details/130402853