如何在 android 上设置相机权限?

How to set camera permission on android?

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

我有 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 上使用该应用程序并解决了同样的问题

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

然后,一旦您 运行 您的应用,您还需要请求该许可。为此,您需要在 onCreate 上方的 class 中设置一个变量,如下所示:

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

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

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

你可以做你想做的,例如。开始一个新的 activity 否则。每次要启动相机时,只要像上面那样检查权限,看用户是否同意,如果没有通知他或在你的其他activity.

中再次这样询问他

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

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

上查看此文档

使用此请求用户的运行时权限:

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

试试放

android:requestLegacyExternalStorage="true"

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