实现音频播放悬浮窗的服务services

先说明下,实现悬浮窗窗的代码我是借鉴别人的代码,但是我找不到他的链接,知道可以联系一下。
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();
	}



}

猜你喜欢

转载自blog.csdn.net/qq_51108920/article/details/130402853