解决targetSdk>30 bindService()返回false的问题
问题:在使用aidl进行跨进程通信的时候,通过bindService()绑定远程service,但一直返回false
// AndroidManifest.xml
...
// Client
bindService(Intent().apply {
component = ComponentName("com.benny.app.a", "com.benny.app.a.service.MyService")
}, object : ServiceConnection {
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
Log.d(TAG, "onServiceConnected")
IMyAidlInterface.Stub.asInterface(service).setUIType(111)
}
override fun onServiceDisconnected(name: ComponentName?) {
Log.d(TAG, "onServiceDisconnected")
}
}, Context.BIND_AUTO_CREATE).let {
Log.d(TAG, "bindService: $it")
}
2022-10-18 18:34:23.264 15569-15569/com.benny.app.b D/ZP: bindService: false
原因:Google在API30以后加强了包可见性限制,如果需要跨进程访问某个应用,需要在AndroidManifest中声明要访问的应用。详情参考https://developer.android.google.cn/guide/topics/manifest/queries-element?hl=en--
解决方案:
第一种方案:
修改client targetSdk版本到30以下。
第二种方案:
targetSdk版本在30以上,在AndroidManifest中,按照Google要求需要在Client注册需要使用的包名。
// AndroidManifest.xml
...
共有 0 条评论