手机拍照功能调用摄像头拍照后照片无法显示

在安卓10以上,鸿蒙3无法正常显示照片,通过plus.io获取路径貌似有问题

在Android 10以上的系统,以及鸿蒙3系统中,应用对文件系统的访问受到了更严格的限制,这可能导致一些旧的访问方式不再适用。

在使用plus.io获取照片路径时,可以尝试以下方法:
在 AndroidManifest.xml 文件中添加如下权限:

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


注意,READ_EXTERNAL_STORAGE 和 WRITE_EXTERNAL_STORAGE 这两个权限已经被Google官方废弃,所以如果您的应用是面向Android 11及以上版本的,您需要使用 SAF(Storage Access Framework)来访问文件系统。
使用 SAF 访问文件系统,示例代码如下:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
intent.setType("image/*");
startActivityForResult(intent, 1);


用户会收到一个系统对话框,允许用户选择需要访问的目录或文件,选择后会返回一个 Uri。可以使用以下代码来处理返回的 Uri:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
        Uri uri = data.getData();
        String path = getPathFromUri(uri);
        // do something with the file path
    }
}

public String getPathFromUri(Uri uri) {
    String path = null;
    if (DocumentsContract.isDocumentUri(this, uri)) {
        String docId = DocumentsContract.getDocumentId(uri);
        String[] split = docId.split(":");
        String type = split[0];
        Uri contentUri = null;
        if ("image".equals(type)) {
            contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
        }
        String selection = "_id=?";
        String[] selectionArgs = new String[]{split[1]};
        String[] projection = new String[]{MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(contentUri, projection, selection, selectionArgs, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                int columnIndex = cursor.getColumnIndex(MediaStore.Images.Media.DATA);
                if (columnIndex > -1) {
                    path = cursor.getString(columnIndex);
                }
            }
            cursor.close();
        }
    } else {
        String[] projection = new String[]{MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(uri, projection, null, null, null);
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                if (columnIndex > -1) {
                    path = cursor.getString(columnIndex);
                }
            }
            cursor.close();
        }
    }
    return path;
}


这段代码通过调用 getPathFromUri() 方法,将返回的 Uri 转换成文件路径。

希望以上方法对您有所帮助。