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

问题描述 投票:95回答:6

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

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

android wear-os android-permissions android-6.0-marshmallow
6个回答
40
投票

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


14
投票

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

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


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

2
投票

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

试一试:Android Permissions


1
投票
@SuppressLint("NewApi")
public void checkPerm() 
{
   locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

   if ( checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED ) {
      return;
   }

   locationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() {....}
}

-2
投票

您可以使用ResultReceiver创建用户答案的​​接收者,然后通过通知的PendingIntent将其作为回调传递给Activity。 Reference

© www.soinside.com 2019 - 2024. All rights reserved.