在Android Marshmallow中,应在需要时在运行时请求权限,而不是在安装应用程序时立即请求所有权限。但是,我似乎只能向活动请求权限,这是一个问题,因为我的应用程序仅包含服务。(为什么会这样,您可能会问?该应用程序捆绑了一个Android Wear表盘,并且所有手机所做的只是查找附近的照片以发送至手表-无需进行“活动”。但它确实需要位置权限。)
因此,有什么方法可以向服务请求权限吗?还是以某种方式强制像过去一样在安装时授予权限?
在Android Marshmallow中,应在需要时在运行时请求权限,而不是在安装应用程序时立即请求所有权限。但是,我似乎只能向活动请求权限,这是一个问题,因为我的应用程序仅包含服务。(为什么会这样,您可能会问?该应用程序捆绑了一个Android Wear表盘,并且所有手机所做的只是查找附近的照片以发送至手表-无需进行“活动”。但它确实需要位置权限。)
因此,有什么方法可以向服务请求权限吗?还是以某种方式强制像过去一样在安装时授予权限?
Answers:
requestPermission()
只能从Activity
和而不是Service
(不同于checkPermission()
仅要求PackageManager
)调用。因此,您需要做一些额外的工作来解决此问题;您确实需要Activity
在应用程序中提供,例如,您Service
可以检查所需的权限,如果尚未授予权限,它可以创建通知,并可以向用户提供描述性的简短消息,说明为什么存在通知以及他们单击该通知时需要进行的操作等。
Context
也可以实现的方法中调用它OnRequestPermissionsResultCallback
。功能类似于标准requestPermission()
。
看看PermissionEverywhere库。它允许您从任何上下文请求权限。
它创建一个通知,单击该通知将打开一个活动以请求许可。
库的github页面中的示例代码:-
@Override
protected Boolean doInBackground(Void... params) {
PermissionResponse response = PermissionEverywhere.getPermission(getApplicationContext(),
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQ_CODE,
"Notification title",
"This app needs a write permission",
R.mipmap.ic_launcher)
.call();
//waits..
boolean isGranted = response.isGranted();
if(isGranted){ //changed from isGrante to isGranted
// Do stuff
}
}
PermissionEverywhere
,请确保您在清单中声明了helper活动,并确保在声明时将其绑定到正确的包(如果使用PermissionEverywhere
单独的包)。我花了很长时间才意识到我实际上并没有PermissionEverywhere
在清单中指定软件包。
PermissionEverywhere
演示应用程序,但没有用。
您可以ResultReceiver
用来创建用户答案的接收者,然后将其作为回调通过通知的传递给Activity PendingIntent
。
参考