如何从Android Marshmallow中的服务请求权限

Ton*_*ham 97 android android-permissions android-6.0-marshmallow wear-os

在Android Marshmallow中,应在运行时在需要时请求权限,而不是在安装应用程序时立即请求权限.但是,我似乎只能从Activity请求权限,这是一个问题,因为我的应用程序只包含服务.(为什么会这样,你可能会问?该应用程序内部捆绑了一个Android Wear手表,所有手机都会查看附近的照片以发送到手表 - 无需任何活动.但它确实需要位置权限.)

那么,有没有办法从服务请求权限?或者以某种方式强制在安装时授予权限,就像过去一样?

Ali*_*daf 42

requestPermission()只能从a Activity而不是a 调用Service(不像checkPermission()只需要PackageManager).所以你需要做一些额外的工作来解决这个问题; 你需要Activity在你的应用程序中提供一个,例如,你Service可以检查它需要的权限,如果它们尚未被授予,它可以创建一个通知,并可以通过描述性的短消息通知用户为什么有通知以及点击通知时需要发生的事情等.

  • 以下是我解决它的方法:https://github.com/mvglasow/satstat/blob/master/src/com/vonglasow/michael/satstat/utils/PermissionHelper.java它可以从任何`Context`中调用,它也可以实现` OnRequestPermissionsResultCallback`.功能类似于标准的`requestPermission()`. (8认同)
  • 对于运行后台服务定期检查位置更新的情况有什么解决方案,我只是在设置中关闭位置权限.由于没有活动,因此当我重新打开应用程序时,这会导致我的服务崩溃 (3认同)

Der*_*ung 14

我同意,这对于服务非常麻烦,我认为您应该在Android Developer Preview页面上报告此问题.

目前,我认为最好的解决方案是检查服务权限,并在缺少权限时显示通知.更好的是,创建DialogActivity以在用户按下通知时请求权限.


Hei*_*erg 7

看看PermissionEverywhere库.它允许您从任何上下文请求权限.

它会创建一个通知,点击该通知,打开一个要求许可的活动.

来自library的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
      }
  }
Run Code Online (Sandbox Code Playgroud)

  • 我在服务中尝试了异步版本,但没有用。onComplete 从未被调用 (2认同)
  • 这个包对我有用,感谢你的建议.不过我会注意到,我没有尝试异步版本.此外,对于那些使用`PermissionEverywhere`时遇到问题的人,请确保在清单中声明帮助程序活动并确保在声明它时,它与正确的程序包相关联(如果您使用`PermissionEverywhere`作为单独包装).我花了很长时间才意识到我实际上并没有在清单中指定`PermissionEverywhere`包. (2认同)

小智 5

有一个非常简单的库可以做到这一点。您可以从任何地方(甚至从服务)检查权限,根据应用程序是在前台还是后台,它要么显示正常对话框,要么生成请求权限的通知。该代码非常容易理解,而且也非常易于使用。

请尝试一下:Android 权限