Android中悬浮小窗播放视频的实现方案

现在有不少的直播或者带有直播功能的APP除了正常的可全屏竖屏的播放页面外,常常附带一个功能:在退出播放页面(通常是直播)后,显示悬浮的小窗口继续播放直播流,这个小窗口一般可拖动,在应用退到后台后仍然可以显示。这几天刚好做到这种功能,刚开始也不知道怎么做,到网上想找实现思路,个人认为关键的在于如何不断开流继续播放这点,其实这个也就很简单,不过奇葩的是到github和各大博客网站上都没找到合适的demo,不知是关键字没找对还是本身这就属于偏门功能。总之,这里贴出自己再摸索后的实现代码。代码也不复杂,不过应该算是一种可行的方案。

github地址:https://github.com/FairlyMavis/FloatSmallVideoDemo

 

转载于:https://www.cnblogs.com/chitanta/p/9714436.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现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); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值