解决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


    
    
    



        
            
        
    
        ...

版权声明:
作者:主机优惠
链接:https://www.techfm.club/p/45858.html
来源:TechFM
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>