Android 应用程序:无法保存照片。相机无权保存到此位置

use*_*003 8 android android-camera android-permissions

我有一个用户无法在我的 Android 应用程序中使用相机,即使她似乎拥有所有正确的权限。

她使用的是Google Pixel 6 Pro,Android 12 Build/SD1A.210817.037

她已删除并重新安装了该应用程序。她已删除与该应用程序关联的存储和缓存。她可以将相机用于其他应用程序。她正在使用默认的相机应用程序。

没有其他人抱怨这个问题,但她正在使用最近的构建更新,所以也许她只是第一个看到它并告诉我的人。

弹出的错误消息显示:

无法保存照片。相机无权保存到此位置。

在她的“设置”应用程序中,对于应用程序权限:

  • 相机
  • 文件和媒体
  • “没有拒绝任何权限”

在她的“设置”应用程序中,对于所有权限,:

  • 相机:拍照和录像
  • 文件和媒体:读取共享媒体的内容,修改或删除共享媒体的内容

应用程序权限:

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

<uses-feature
    android:name="android.hardware.camera"
    android:required="false" />
<uses-feature
    android:name="android.hardware.camera.autofocus"
    android:required="false" />
Run Code Online (Sandbox Code Playgroud)

该应用程序使用网络视图并从标准 HTML 表单启动相机。这是标准的,并自动让用户选择使用相机或文件。然后图像通常通过表单发送到我的服务器并保存在那里。

<form action="upload/" method="post" enctype="multipart/form-data" >
      <input type="file" accept="image/*" name="image">
      <input type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)

如果用户选择文件,则可以上传图像,但如果选择相机选项,则不能上传图像。我不确定错误消息是在用相机拍照之前还是之后弹出的。

应用程序代码:

private int MY_PERMISSIONS_REQUEST_CAMERA = 1;

public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) {
        uriArrayCallback = filePathCallback;

        if ( (ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
                        || ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                        || ActivityCompat.checkSelfPermission(getActivity(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                )) {

            requestPermissions(new String[]{android.Manifest.permission.CAMERA,
                            android.Manifest.permission.READ_EXTERNAL_STORAGE,
                            android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST_CAMERA);
        } else {
            // has permissions
            openFileChooserInternal(NEW_FILECHOOSER_REQUEST_CODE);
        }

        return true;
    }
        
 public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == MY_PERMISSIONS_REQUEST_CAMERA) {
            boolean cameraAccepted = grantResults[0] == PackageManager.PERMISSION_GRANTED;
            boolean readExternalAccepted = grantResults[1] == PackageManager.PERMISSION_GRANTED;
            boolean writeExternalAccepted = grantResults[2] == PackageManager.PERMISSION_GRANTED;
            if (cameraAccepted && readExternalAccepted && writeExternalAccepted) {
                openFileChooserInternal(NEW_FILECHOOSER_REQUEST_CODE);
            } else {
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

小智 1

我遇到了同样的问题,我使用 MediaStorage 来实现我的目的。这是一个例子:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);    
ContentResolver cr = getContentResolver();
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, imageFileName);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES);
        
Uri uri = cr.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
        
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
Run Code Online (Sandbox Code Playgroud)