我正在使用启动时启动并开始检查位置更新的服务。一旦我拒绝在权限弹出窗口上进行位置访问,感谢Android M我的服务在手机启动后崩溃。
由于我在这种情况下没有活动,因此requestPermissions()
的调用会返回ClassCastException
,因为我的服务Context
无法投放到某个活动中。
我的方法电话:
ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION);
到目前为止是否有任何解决方案或者我是否必须撤销服务权限以便在这种状态下运行。
答案 0 :(得分:45)
您无法通过服务请求权限,因为服务不依赖于UI,这种情况很有意义。由于服务上下文不是活动,因此您获得的异常是有意义的。
您可以检查服务中是否有权限,并在活动中请求权限(是的,您需要活动)。
在服务中:
public static boolean checkPermission(final Context context) {
return ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED;
}
并在活动中:
private void showPermissionDialog() {
if (!LocationController.checkPermission(this)) {
ActivityCompat.requestPermissions(
this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION},
PERMISSION_LOCATION_REQUEST_CODE);
}
}
答案 1 :(得分:10)
您可以使用应用程序上下文检查不带Activity的权限,但在请求permitions时需要Activity。
要获取应用上下文,只需致电getApplicationContext()
,然后使用ContextCompat.checkSelfPermission()
来检查权限。
还有很好的信息如何在correct way中使用运行时权限:
要检查您是否拥有权限,请调用
ContextCompat.checkSelfPermission()
方法。例如,这个片段 显示如何检查活动是否有权写入 日历:// Assume thisActivity is the current activity int permissionCheck = ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_CALENDAR);
如果该应用具有该权限,则该方法会返回
PackageManager.PERMISSION_GRANTED
,然后该应用可继续执行 操作。如果应用程序没有权限,则返回该方法PERMISSION_DENIED
,应用必须明确要求用户 权限。
编辑:检查服务权限后,您需要活动来请求权限:
public static void requestPermissions (Activity activity, String[] permissions, int requestCode)