请求从服务中获取权限。Android M

3

我正在为M版的Android权限工作。

在我的应用程序中,在我的活动中,我启动了一个服务,在其中使用以下代码来打开摄像头。

在服务中打开相机的代码

cameraManager.openCamera(frontFacingCameraId, stateCallback, null);

我查看了一些文档,并发现我不能在服务中请求权限,我需要在活动中请求权限。因此,我在我的活动中请求权限。

请求权限的活动

if (PermissionUtil.getCameraPermission(this)) { Debug.d(TAG, "Camera Permission -- permission exsited"); performRecordingAction(); }

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case PermissionUtil.SDK__CAMERA_PERMISSION:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                Debug.d(TAG, "Granted -- Camera Permission");
                performRecordingAction();
            } else {
                Debug.d(TAG, "Denied -- Camera Permission");
                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            break;
    }
}

PermissionUtil

public static boolean getCameraPermission(Activity activity) {
    Debug.d(TAG, "getCameraPermission");
    int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.CAMERA);

    if (permission != PackageManager.PERMISSION_GRANTED) {
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)) {
            Debug.d(TAG, "Already Denied -- Camera Permission");
            return false;
        } else {
            Debug.d(TAG, "Request Camera Permission");
            ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA}, SDK__CAMERA_PERMISSION);
            return false;
        }
    } else {
        return true;
    }
}

但是在以上代码中,服务仍然抛出安全异常错误。

有人能建议我哪里出错了吗?是否有任何方法可以请求服务权限?


请分享你的代码。有这么多信息,任何人都无法猜测。除非你想要答案是你没有正确请求权限。 - SubliemeSiem
在启动服务之前,在Activity中请求权限! - Dhaval Parmar
3个回答

2
您无法从服务中请求权限,因为您需要一个活动上下文来处理系统提供的回调。此外,权限请求是异步运行的。 请参见requestPermissions() >>LINK的文档:

此方法可能会启动一个活动,允许用户选择授予哪些权限和拒绝哪些权限。因此,您应该准备好您的活动可能会被暂停和恢复。此外,授予某些权限可能需要重新启动您的应用程序。在这种情况下,系统会在传递结果到onRequestPermissionsResult(int、String[]、int[])之前重新创建活动堆栈。

服务只能在运行时检查是否具有所需的权限,然后调整其行为。

0
只需在您的清单文件中添加android:exported="true",如下所示:
<activity
android:name="com.example.MainActivity"
android:label="Main" 
android:exported="true">
<intent-filter>
    <action android:name="android.intent.action.MAIN" >
    </action>
</intent-filter>

这将解决安全异常的问题。

有没有任何方法可以从服务请求权限?

是的,按照 请求服务权限 的步骤进行即可。


0

由于在Android SDK 23(及更高版本)中需要在内联中检查权限,因此您可以忽略shouldShowRequestPermissionRationale(提示用户设置权限),只需检查是否已授予权限:

public boolean checkPermission(){
    if (Build.VERSION.SDK_INT < 23) {
        return true;
    }
    else {
        if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
            // if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            //        android.Manifest.permission.CAMERA)) {
            //    PropmtForPermission();
            //} else {

                return false;
            //}
        }
        else{
            return true;
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接