【问题标题】:revoked permission android.permission.CAMERA撤销权限 android.permission.CAMERA
【发布时间】:2017-03-27 09:31:47
【问题描述】:

我收到错误revoked permission android.permission.CAMERA

我在清单上使用了相机权限

private void dispatchTakePictureIntent(int actionCode) {

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    switch (actionCode) {
        case ACTION_TAKE_PHOTO_B:
            File f = null;

            try {
                f = setUpPhotoFile();
                mCurrentPhotoPath = f.getAbsolutePath();
                takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
            } catch (IOException e) {
                e.printStackTrace();
                f = null;
                mCurrentPhotoPath = null;
            }
            break;

        default:
            break;
    } // switch

    startActivityForResult(takePictureIntent, actionCode);
}

和这样的错误:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.mobile.lunatique.photo, PID: 3590
                  java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE flg=0x3 cmp=com.android.camera2/com.android.camera.CaptureActivity clip={text/uri-list U:file:///KTP_42342.jpg} (has extras) } from ProcessRecord{2fbbd91 3590:com.mobile.lunatique.photo/u0a60} (pid=3590, uid=10060) with revoked permission android.permission.CAMERA
                      at android.os.Parcel.readException(Parcel.java:1599)
                      at android.os.Parcel.readException(Parcel.java:1552)
                      at android.app.ActivityManagerProxy.startActivity(ActivityManagerNative.java:2658)
                      at android.app.Instrumentation.execStartActivity(Instrumentation.java:1507)
                      at android.app.Activity.startActivityForResult(Activity.java:3917)
                      at android.app.Activity.startActivityForResult(Activity.java:3877)
                      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:842)
                      at com.mobile.lunatique.photo.MainActivity.dispatchTakePictureIntent(MainActivity.java:254)
                      at com.mobile.lunatique.photo.MainActivity.access$000(MainActivity.java:33)
                      at com.mobile.lunatique.photo.MainActivity$1.onClick(MainActivity.java:321)
                      at android.view.View.performClick(View.java:5198)
                      at android.view.View$PerformClick.run(View.java:21147)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
I/Process: Sending signal. PID: 3590 SIG: 9

谁能帮帮我??

【问题讨论】:

  • 发布堆栈跟踪。
  • 不相关的代码太多,堆栈跟踪和解释等相关内容太少。
  • 在 Marshamallow 中,用户应该在运行时激活权限。见这里:developer.android.com/training/permissions/requesting.html。或者您可以将 gradle 中的 targetSdkVersion 设置为 22(不推荐,但可以)

标签: android


【解决方案1】:

我是这样解决这个问题的。

与大多数答案所说的相反,从您的清单文件中删除它。

 <uses-permission android:name="android.permission.CAMERA"/>

为什么?

从 Android M (API 23) 开始,如果您的应用在清单中声明了 CAMERA 权限,那么,它需要 CAMERA 权限是GRANTED 以访问 ACTION_IMAGE_CAPTURE 等等...(通常不需要自己的 CAMERA 权限)。如果没有,那么它会自动引发 SecurityException

╔═════════════════════════════════════════════════╦════════════════════╗
║                      Usage                      ║ Permissions needed ║
╠═════════════════════════════════════════════════╬════════════════════╣
║ ACTION_IMAGE_CAPTURE                            ║ none               ║
║ ACTION_VIDEO_CAPTURE                            ║ none               ║
║ INTENT_ACTION_STILL_IMAGE_CAMERA                ║ none               ║
║ android.hardware.camera2                        ║ CAMERA             ║
║ android.hardware.camera2 + ACTION_IMAGE_CAPTURE ║ CAMERA             ║
║ android.hardware.camera2 + ACTION_VIDEO_CAPTURE ║ CAMERA             ║
║ ...                                             ║ ...                ║
╚═════════════════════════════════════════════════╩════════════════════╝

上表仅适用于 API 23+

tl;dr 怎么办?

选项 1- 如果您只使用 ACTION_IMAGE_CAPTURE 等...
从清单中删除CAMERA 权限就可以了

选项 2- 如果您使用其他 CAMERA 函数:
在运行时检查CAMERA 权限,只有在权限可用时才启动意图

【讨论】:

  • 伙计,我搜索了好几个小时!非常感谢!
  • 非常感谢。我被困了 4 到 5 个小时。
  • 您能否详细说明为什么需要删除相机权限? @卡西尔
  • @PawanSoni 我已经重新格式化了我的答案。如果现在更好,请告诉我。
  • 我对这种行为毫无感觉...
【解决方案2】:

你好疯子aldebaran,

首先需要在manifest.xml中添加如下权限 文件。

<uses-permission android:name="android.permission.CAMERA" />

检查安卓设备是否是棉花糖。如果它的安卓 M或更高版本然后使用以下代码获取相机 动态许可。

在android M之前不想获得动态权限。

检查用户是否授予权限。如果用户未授予权限 然后请求相机权限访问。

private static final int MY_CAMERA_REQUEST_CODE = 100;
if (checkSelfPermission(Manifest.permission.CAMERA)
                    != PackageManager.PERMISSION_GRANTED) {
           requestPermissions(new String[]{Manifest.permission.CAMERA},
                        MY_CAMERA_REQUEST_CODE);
            }

请求权限后会显示提示请求权限 包含允许和拒绝选项。点击action后我们可以得到 使用以下方法请求的结果。

@Override

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

        super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (requestCode == MY_CAMERA_REQUEST_CODE) {

            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();

            } else {

                Toast.makeText(this, "camera permission denied", Toast.LENGTH_LONG).show();

            }

        }

【讨论】:

  • 这将是公认的答案。非常完整。谢谢。
  • 重点是通过意图拍照根本不需要此权限,但就像接受的答案提到的那样,如果清单中有权限,则必须以某种方式授予权限。
【解决方案3】:

您应该改用AppCompatActivity,而不是扩展您的 MainActivity。还请包括堆栈跟踪。

public class MainActivity extends AppCompatActivity {

//......
}

哦,对不起。使用 stacktrace 可以清楚地看到主要问题。 android.permission.CAMERA。为了提出请求,您应该创建权限检查。请检查This Example,以创建权限检查。

示例:

1) 包含到活动中。

<uses-permission android:name="android.permission.CAMERA" />

2) 确保您向用户请求权限:

if ( ContextCompat.checkSelfPermission( this, android.Manifest.permission.ACCESS_COARSE_LOCATION ) != PackageManager.PERMISSION_GRANTED ) {

            ActivityCompat.requestPermissions( this, new String[] {  android.Manifest.permission.ACCESS_COARSE_LOCATION  },
                                                LocationService.MY_PERMISSION_ACCESS_COURSE_LOCATION );
}

3) 签入运行时

if ( Build.VERSION.SDK_INT >= 23 &&
             ContextCompat.checkSelfPermission( context, android.Manifest.permission.CAMERA ) != PackageManager.PERMISSION_GRANTED) {
            return;
}

【讨论】:

    【解决方案4】:

    Revoke Permission....简单地说,你已经再次调用了权限,所以不需要在 Manifest 文件中再次写入 Camera 权限......

    相反,您只需....需要写两行....来读取和写入足以运行您的程序的外部存储 运行你的程序就足够了

    【讨论】:

      【解决方案5】:

      我也遇到过类似的问题,但 Android 似乎有这方面的错误。当您向 AndroidManifest 添加相机权限时

      <uses-permission android:name="android.permission.CAMERA" />
      

      即使您想使用外部应用程序拍照,您也必须授予权限。从清单中删除它已经解决了 SecurityException 的问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-06-28
        • 2021-03-03
        • 1970-01-01
        • 2016-06-05
        • 2016-02-02
        • 2011-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多