【问题标题】:How to set camera permission on android?如何在android上设置相机权限?
【发布时间】:2021-01-08 19:32:37
【问题描述】:

我正在尝试使用相机,但由于某种我找不到的原因,相机在几天前停止工作

我有 maniset 权限,现在当我尝试拍照时,它显示

"java.io.ioexception permission denied"

这是清单

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

这就是我拍照的方式

                        try {
                            mPhotoFile = Tools.createImageFile();
                            new CameraService().takePicture(CameraService.REQUEST_IMAGE_CAPTURE, contextActivity, mPhotoFile);
                        } catch (IOException ex) {
                            Log.e(TAG, "btnTakePictureSale error "+ex);
                            ex.printStackTrace();
                        }

任何关于寻找什么的帮助或建议都会很棒。同样,上周运行良好

我在多个版本的 android 上使用该应用程序并解决了同样的问题

【问题讨论】:

标签: android permissions camera


【解决方案1】:

试一下

android:requestLegacyExternalStorage="true"

在应用程序标签内的清单上。可能相机权限没问题,但外部写入不行

【讨论】:

    【解决方案2】:

    如果您在清单文件中添加了这一行:

    然后,您还需要在运行应用程序后请求该权限。为此,您需要在 onCreate 上方的类中设置一个变量,如下所示:

    private static final int MY_CAMERA_REQUEST_CODE = 100;
    

    之后,在你的 onCreate 中复制这个:

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

    这将检查您的用户是否批准您使用他的手机摄像头。如果没有,它会要求他这样做,将显示警报对话框。在他回复之后,你需要得到那个回复并做相应的事情。为此,将其添加为函数:

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

    在这一行内:

    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();
                }
    

    你可以做你想做的事,例如。开始一项新的活动,否则。每次你想启动相机时,只需检查上面的权限,看看用户是否批准它,如果没有通知他或在你的其他活动中再次这样问他。

    要启动相机拍照,您可以使用:

    static final int REQUEST_IMAGE_CAPTURE = 1;
    
    private void dispatchTakePictureIntent() {
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        try {
            startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
        } catch (ActivityNotFoundException e) {
            // display error state to the user
        }
    }
    

    以下代码检索此图像并将其显示在 ImageView 中

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
            Bundle extras = data.getExtras();
            Bitmap imageBitmap = (Bitmap) extras.get("data");
            imageView.setImageBitmap(imageBitmap);
        }
    }
    

    要将您的照片保存在设备上,您还需要这两个权限:

    <manifest ...>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        ...
    </manifest>
    

    记住这一点,Android 上有两种不同类型的权限。

    1. 普通权限(不需要用户请求)
    2. 危险的权限(需要询问)

    您需要使用的所有三个权限都被归类为危险:

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

    因此,您必须向用户请求该权限。

    查看Take photos 上的此文档以获取更多信息。 在Request app permissions查看此文档

    【讨论】:

    • 你能给我完整的例外吗?
    • 就是“java.io.ioexception 权限被拒绝”
    【解决方案3】:

    使用它来向用户请求运行时权限:

    if (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED)
    {
      try {
                                mPhotoFile = Tools.createImageFile();
                                new CameraService().takePicture(CameraService.REQUEST_IMAGE_CAPTURE, contextActivity, mPhotoFile);
                            } catch (IOException ex) {
                                Log.e(TAG, "btnTakePictureSale error "+ex);
                                ex.printStackTrace();
                            }
    }else
    {
                ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 101);
    }
    

    【讨论】:

    • 感谢您的回复。因为权限已经被授予所以进入if条件,然后进入catch部分
    猜你喜欢
    • 2020-10-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 2021-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    相关资源
    最近更新 更多