在安卓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 转换成文件路径。
希望以上方法对您有所帮助。