如何从Android棉花糖中的服务请求权限


101

在Android Marshmallow中,应在需要时在运行时请求权限,而不是在安装应用程序时立即请求所有权限。但是,我似乎只能向活动请求权限,这是一个问题,因为我的应用程序仅包含服务。(为什么会这样,您可能会问?该应用程序捆绑了一个Android Wear表盘,并且所有手机所做的只是查找附近的照片以发送至手表-无需进行“活动”。但它确实需要位置权限。)

因此,有什么方法可以向服务请求权限吗?还是以某种方式强制像过去一样在安装时授予权限?


应用程序类中也存在此问题
itzhar,2015年

试试这个可能是可行的stackoverflow.com/a/41221852/5488468
Bipin Bharti

我的库可以轻松地从任何上下文处理运行时权限,还可以处理“不再询问”。github.com/nabinbhandari/Android-Permissions
Nabin班达里

Answers:


47

requestPermission()只能从Activity和而不是Service(不同于checkPermission()仅要求PackageManager)调用。因此,您需要做一些额外的工作来解决此问题;您确实需要Activity在应用程序中提供,例如,您Service可以检查所需的权限,如果尚未授予权限,它可以创建通知,并可以向用户提供描述性的简短消息,说明为什么存在通知以及他们单击该通知时需要进行的操作等。


这是本杰明·波依斯Benjamin Poiesz)提出的解决方案。您可以在23:40
xiaomi

您还可以在片段内调用requestPermission()。
Misagh Emamverdi

3
对于正在运行的后台服务定期检查位置更新的解决方案,我只是在设置中关闭了位置权限。由于没有活动,因此当我重新打开应用程序时,这会导致我的服务崩溃
stud91 2015年

1
@ stud91至少,每次您请求位置更新时,都要捕获安全异常或查询权限。这将防止您的应用崩溃(尽管如果权限被撤消,您将不会获得任何位置)。更好的是:检查权限,如果缺少权限,则显示一条通知,将用户带到“活动”,该活动只是权限对话框的占位符。
user149408 '16

8
这是我如何解决的方法:github.com/mvglasow/satstat/blob/master/src/com/vonglasow / ...可以从任何Context也可以实现的方法中调用它OnRequestPermissionsResultCallback。功能类似于标准requestPermission()
user149408 '16

15

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

目前,我认为最好的解决方案是检查服务许可,如果许可缺失,则显示通知。更好的是,创建一个DialogActivity以在用户按下通知时请求权限。


7

看看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
      }
  }

1
我已经在服务中尝试了异步版本,但没有成功。的onComplete从来没有被称为
狮子座Droidcoder

好主意,但是它在存储库中不可用
naXa

2
这个包对我有用,谢谢你的建议。不过,我要指出的是,我没有尝试过异步版本。另外,对于那些在使用上有问题的人PermissionEverywhere,请确保您在清单中声明了helper活动,并确保在声明时将其绑定到正确的包(如果使用PermissionEverywhere单独的包)。我花了很长时间才意识到我实际上并没有PermissionEverywhere在清单中指定软件包。
user3570982 2016年

我运行了PermissionEverywhere演示应用程序,但没有用。
Ixx

2

有一个非常简单的库,可以执行此操作。您可以根据应用是在前台还是在后台,从任何地方(甚至是从服务)检查权限,它可以显示普通对话框,也可以生成询问权限的通知。该代码非常容易理解,也非常易于使用。

尝试一下:Android权限


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.