Android 实现视频的悬浮窗

Android 实现视频的悬浮窗如微信视频或者斗鱼直播一样,在应用切换到后台后,手机桌面还可以显示一个可以移动的小窗口,播放正在播放的内容。利用的就是android里面的WindowManager,原理逻辑就是在视频界面切换到后台后,调用实现悬浮窗的service服务,在判断了权限后,就可以悬浮在其余应用之上了。先来看效果,点击悬浮窗进入对应的视频播放界面,触摸悬浮窗会移动,点击右键关闭会关闭悬浮窗。构建悬浮窗的服务下面的代码就是悬浮窗服务的全部代码。在这个服务中,onCreate定义了这个悬浮窗口
摘要由CSDN通过智能技术生成

Android 实现视频的悬浮窗

如微信视频或者斗鱼直播一样,在应用切换到后台后,手机桌面还可以显示一个可以移动的小窗口,播放正在播放的内容。利用的就是android里面的WindowManager,原理逻辑就是在视频界面切换到后台后,调用实现悬浮窗的service服务,在判断了权限后,就可以悬浮在其余应用之上了。先来看效果,点击悬浮窗进入对应的视频播放界面,触摸悬浮窗会移动,点击右键关闭会关闭悬浮窗。
在这里插入图片描述

构建悬浮窗的服务

下面的代码就是悬浮窗服务的全部代码。在这个服务中,onCreate定义了这个悬浮窗口的大小、类型等等。onStartCommand接收了该服务启动时接收的播放器路径啊,视频id等等参数。showFloatingWindow是自定义的悬浮窗口,里面包含了我们自己定义的layout布局。布局中用的是七牛的播放控件,因为我的项目是用的七牛的PLVideoTextureView ,这里就根据大家的自己需求来使用自己的合适的播放控件。我这里自定义实现了点击事件View.OnClickListener的一个FloatingOnClickListener;然后也触摸事件View.OnTouchListener的一个FloatingOnTouchListener 。在点击事件中实现了悬浮窗的点击关闭功能,在触摸事件中实现了窗口的移动功能,并且为了解决同一个控件触摸事件与点击事件的冲突,直接在触摸事件的MotionEvent.ACTION_UP中,去处理了窗口的点击事件,这样就不会存在事件的冲突了。

public class FloatingWindowService extends Service {
   

    private WindowManager windowManager;
    private WindowManager.LayoutParams layoutParams;
    private View display;
    private PLVideoTextureView plVideoTextureView;
    private ImageView icon_little_close;
    private FrameLayout fl_play;

    private boolean show=true;
    private int qiehuan=0;

    private long startTime=0;
    private long endTime=0;

    private boolean isclick=false;

    private String videoPath; //播放路径
    private int videoId;     //直播间id


    public FloatingWindowService() {
   
    }

    @Override
    public void onCreate() {
   
        super.onCreate();
        windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
        layoutParams = new WindowManager.LayoutParams();

        // 设置图片格式,效果为背景透明
        layoutParams.format = PixelFormat.RGB_565;

        G.look("悬浮窗 Build.VERSION.SDK_INT" + Build.VERSION.SDK_INT);
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.O) {
   
            // android 8.0及以后使用
            layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        } else {
   
            // android 8.0以前使用
            layoutParams.type = WindowManager.LayoutParams.TYPE_PHONE;
        }
        layoutParams.gravity = Gravity.LEFT | Gravity.CENTER;
        //该flags描述的是窗口的模式,是否可以触摸,可以聚焦等
        layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
        // 设置视频的播放窗口大小
        layoutParams.width = Utils.getWindowScreenWidth(FloatingWindowService.this)/3;
        layoutParams.height = Utils.getWindowScreenWidth(FloatingWindowService.this)/3;
        layoutParams.x = 700;
        layoutParams.y = 0;
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
   
        if (show) {
   
            videoPath = intent.getStringExtra(
  • 4
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
实现Android 悬浮中播放视频,可以采用以下步骤: 1. 在 AndroidManifest.xml 中添加 SYSTEM_ALERT_WINDOW 权限,以获取悬浮权限。 ```xml <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/> ``` 2. 创建一个 Service,并在 onCreate() 方法中创建一个悬浮口。可以使用 WindowManager 来创建悬浮口,并将其添加到 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 类型的口上。同时,为了能够拖动和调整悬浮口的大小,需要设置 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE 和 WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 标志。 ```java public class FloatingVideoService extends Service { private WindowManager windowManager; private View floatingView; @Override public void onCreate() { super.onCreate(); windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); floatingView = LayoutInflater.from(this).inflate(R.layout.floating_video_layout, null); WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams( WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.TYPE_SYSTEM_ALERT, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, PixelFormat.TRANSLUCENT); windowManager.addView(floatingView, layoutParams); } ... } ``` 3. 在悬浮口中添加一个 VideoView,并设置要播放的视频路径。 ```java VideoView videoView = floatingView.findViewById(R.id.video_view); videoView.setVideoPath(videoPath); videoView.start(); ``` 4. 为悬浮口添加关闭按钮,并在按钮的 onClick() 方法中关闭悬浮口。 ```java Button closeButton = floatingView.findViewById(R.id.close_button); closeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { windowManager.removeView(floatingView); stopSelf(); } }); ``` 5. 最后,在 AndroidManifest.xml 中注册 Service。 ```xml <service android:name=".FloatingVideoService"/> ``` 需要注意的是,由于 Android 6.0 以上版本的权限机制的变化,需要在运行时获取悬浮口权限。可以在 onCreate() 方法中请求权限,并在回调方法中判断用户是否授权。 ```java if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, CODE_DRAW_OVER_OTHER_APP_PERMISSION); } else { // 权限已经被授予 startFloatingVideo(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == CODE_DRAW_OVER_OTHER_APP_PERMISSION) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.canDrawOverlays(this)) { // 权限已经被授予 startFloatingVideo(); } else { // 权限被拒绝 Toast.makeText(this, "悬浮权限被拒绝", Toast.LENGTH_SHORT).show(); } } else { super.onActivityResult(requestCode, resultCode, data); } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值