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

在Android Marshmallow中,应该在运行时需要权限,而不是一次安装应用程序。 但是,我似乎只能从一个活动请求权限,这是一个问题,因为我的应用程序只包含服务。 (为什么你可能会问这个应用有一个捆绑在里面的Android Wear手表,而手机所做的就是查看附近的照片发送到手表 – 不需要任何活动,但是它需要位置权限。

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

requestPermission()只能从Activity而不是Service来调用(与只需要PackageManager checkPermission()不同)。 所以你需要做一些额外的工作来解决这个问题。 您需要在您的应用程序中提供一个Activity ,例如,您的Service可以检查其所需的权限,如果尚未授予它的权限,则可以创build一个通知,并可以向用户通知一个描述性的简短消息有通知,点击通知时需要发生什么

我同意,这是非常麻烦的服务,我想你应该在Android开发者预览页面上报告这个问题。

目前,我认为最好的解决办法是检查服务的许可,并显示通知,如果权限丢失。 更好的是,创build一个DialogActivity来请求权限,当用户按通知。

看看PermissionEverywhere库。 它允许你从任何上下文请求许可。

它创build一个通知,点击它打开一个请求权限的活动。

来自库的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 } } 

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

请尝试: Android权限

 @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() {....} } 

您可以使用ResultReceiver创build用户答案的​​接收者,然后通过通知的PendingIntent将其作为callback传递给Activity。 参考