最近公司的录屏项目需要的一个功能,有一个悬浮窗功能,点击悬浮窗按钮就能直接录屏,需求很简单,但是遇到一个很蛋疼的问题,就是请求android的录屏权限必须要是使用startActivityForResult,如果直接在桌面请求会有一个问题,那就是悬浮窗在桌面时,点击悬浮窗会后台唤起app,这就很不友好了,在网上查阅了各种资料也无果,最后终于想到了一个方法,自己新建一个申请权限的activity,并把它的主题设置为透明,然而还是不行,最后又一波百度谷歌,给activity加了一个单例的启动模式后终于成功,我主要贴出了PermissionActivity的代码,后面有github的完整代码。

Manifest清单文件

<activity android:name=".activity.PermissionActivity"                  android:launchMode="singleInstance"                  android:theme="@style/NoActivity">        </activity>

PermissionActivity

class PermissionActivity : Activity() {    private var projectionManager: MediaProjectionManager? = null    /** 屏幕录制控制 */    private var mRecordService: RecordService.RecordBinder? = null    /** 服务绑定回调 */    private var mServiceConnection: ServiceConnection = object : ServiceConnection {        override fun onServiceDisconnected(name: ComponentName?) {            mRecordService = null            Log.d("record","服务解绑")        }        override fun onServiceConnected(name: ComponentName, service: IBinder) {            mRecordService = service as RecordService.RecordBinder            Log.d("record","服务绑定")        }    }    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        projectionManager = getSystemService(Context.MEDIA_PROJECTION_SERVICE) as MediaProjectionManager        val intent = Intent(this, RecordService::class.java)        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK        bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE)        val captureIntent = projectionManager?.createScreenCaptureIntent()        startActivityForResult(captureIntent, RECORD_REQUEST_CODE)    }    override fun onDestroy() {        super.onDestroy()        unbindService(mServiceConnection)    }    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {        mRecordService?.onRequestResult(requestCode, resultCode, data)        finish()    }}

透明主题

<style name="NoActivity" parent="android:Theme.Translucent.NoTitleBar.Fullscreen">        <item name="android:windowBackground">@android:color/transparent</item>        <item name="android:colorBackgroundCacheHint">@null</item>        <item name="android:windowIsTranslucent">true</item>        <item name="android:windowAnimationStyle">@android:style/Animation</item>        <item name="android:windowNoTitle">true</item>        <item name="android:windowContentOverlay">@null</item>    </style>

https://github.com/song234876/ScreenDemo

如果这篇文章帮到了你,麻烦点个赞!

简书文章地址: https://www.jianshu.com/p/a10dc202faa0

更多相关文章

  1. Android之Http通信——2.详解Http的消息头与响应头
  2. android的服务进程Service的创建及启动
  3. android用okhttp搭建网络通讯(附服务器端代码)
  4. Android基础笔记(十一)- Service基础和注意事项以及Activity与Serv
  5. 随Android生命周期解绑Rxjava订阅的简单流式方法
  6. 野人学Android基础篇之网络通讯第二课--本地apache服务器与Andro
  7. android 可拖动排序的源码示例
  8. Android(安卓)_实现SSL解决不受信任的证书问题
  9. Android中的单例模式

随机推荐

  1. Android与WebView的同步和异步访问机制
  2. Android(安卓)开发者从0到1发布一个微信
  3. Activity生命周期详解
  4. Android(安卓)HAL实现的三种方式(1) - 基
  5. Android(安卓)VS iOS:2011年的死亡竞技赛
  6. Android实现远程控制PC(Android[客户端]+
  7. Android多媒体开发 Pro Android(安卓)Med
  8. Android中的HashMap原理实践探索,重写equa
  9. [Android官方API阅读]___
  10. Android(安卓)API Levels