从服务Android M请求位置权限

stu*_*d91 37 android android-permissions android-6.0-marshmallow

我正在使用启动时启动并开始检查位置更新的服务.一旦我拒绝在权限弹出窗口上进行位置访问,感谢Android M我的服务在手机启动后崩溃了.

因为我已经没有活动在这种情况下,调用requestPermissions()返回一个ClassCastException作为我的服务Context能不能被转换为一个活动.

我的方法调用:

ActivityCompat.requestPermissions((Activity) mContext, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_COARSE_LOCATION);
Run Code Online (Sandbox Code Playgroud)

到目前为止是否有任何解决方案或者我是否必须撤销服务权限以免在这种状态下运行.

Joa*_*rom 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;
 }
Run Code Online (Sandbox Code Playgroud)

并在一项活动中:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @VitaliyA该服务可以检查权限,但不会请求它,因为它没有UI. (4认同)
  • 如果你不能解决Manifest.permission.ACCESS_COARSE_LOCATION或精细位置使用android前缀...像这样:android.Manifest.permission.ACCESS_COARSE_LOCATION (2认同)

Vit*_*y A 10

您可以使用应用程序上下文检查没有Activity的权限,但在请求permitions时您将需要Activity.要获取应用程序上下文,只需调用getApplicationContext()并检查权限使用ContextCompat.checkSelfPermission().

还有很好的信息如何以正确的方式使用运行时权限:

要检查您是否拥有权限,请调用该ContextCompat.checkSelfPermission()方法.例如,此代码段显示了如何检查活动是否具有写入日历的权限:

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,
        Manifest.permission.WRITE_CALENDAR);
Run Code Online (Sandbox Code Playgroud)

如果应用程序具有权限,则该方法返回PackageManager.PERMISSION_GRANTED,并且应用程序可以继续操作.如果应用程序没有权限,则该方法返回 PERMISSION_DENIED,并且应用程序必须明确要求用户许可.

编辑:检查服务的权限后,您将需要活动来请求permition:

public static void requestPermissions (Activity activity, String[] permissions, int requestCode)
Run Code Online (Sandbox Code Playgroud)