提交代码时,提示我清单文件中的Service是导出的,应该提供一个权限,于是我给服务增加了权限,步骤是先声明一个自定义权限,然后在Service标签上声明使用这个权限。这样,第三方App在绑定我们这个服务的时候,如果它没有在清单文件中声明我们的服务需要的权限,则无法绑定我们的服务,这样就限制了任意应用都能打开我们服务的问题,其实我觉得这样也没什么用,你加了权限,那别人一下你的应用,拿到清单文件一看,需要权限,那人家也声明权限就可以绑定服务了。

重要的是,使用了权限的服务有一个坑,就是先安装第三方应用,此时Android系统会查找我们的自定义权限,然而并没有,所以第三方应用虽然声明了权限,但是并未获得权限。此时装上我们的服务应用,这时Android系统上就有了我们的自定义权限,但是第三方应用已经提前安装了,它在安装的时候没有申请到这个自定义权限,因为那时候系统上没有这个权限,当我们的应用安装后虽然有这个自定义权限了,但是第三方应用启动的时候并不会再次申请权限,所以绑定服务的时候就绑定不了。这说明权限是在App安装的时候就授权了,所以解决方案就是安装上我们服务的App后,第三方App卸载重装即可。想到,就想到权限动态申请,把自定义权限的等级设置为“dangerous”,这样的权限就需要动态权限申请了,这样谁先安装也不怕了。别高兴太早,还是有坑的,如果手机安装在Android6.0以下版本呢?低版本是没有动态权限申请功能的,所有权限都是在安装的时候就授权了,所以还是有那个先安装后安装的问题。

另外,如果两个应用都声明相同的权限,这样不论谁先安装都是可以的,但是使用不同的签名打包后,发现安装了一个之后,另一个就安装不了,提示已经有一个应用拥有了此权限。也就是不能有两个不同签名的程序声明有同一个权限。

解决方案:不要给服务设置权限!!

后续(2021-01-29):另一个解决方案,声明一个系统自带的权限即可,可以使用一个不需要动态申请的权限,且很偏门很少人使用的那种权限,比如:android.permission.ACCESS_LOCATION_EXTRA_COMMANDS