2 回答

TA貢獻1803條經驗 獲得超3個贊
如果您的目標平臺為 Android 10 或更高版本,請在應用的清單文件中將 requestLegacyExternalStorage 的值設置為 true:
<manifest ... >
<!-- This attribute is "false" by default on apps targeting
Android 10 or higher. -->
<application android:requestLegacyExternalStorage="true" ... >
...
</application>
</manifest>
訪問文件
(以下兩個代碼塊來自developer.android.com文檔。)
要加載媒體文件,請從ContentResolver調用以下方法之一。
Uri contentUri = ContentUris.withAppendedId(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
cursor.getLong(Integer.parseInt(BaseColumns._ID)));
String fileOpenMode = "r";
ParcelFileDescriptor parcelFd = resolver.openFileDescriptor(uri, fileOpenMode);
if (parcelFd != null) {
int fd = parcelFd.detachFd();
// Pass the integer value "fd" into your native code. Remember to call
// close(2) on the file descriptor when you're done using it.
}
在運行 Android 10(API 級別 29)及更高版本的設備上,您的應用可以使用 IS_PENDING 標志在將媒體文件寫入磁盤時獲得對媒體文件的獨占訪問權限。
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DISPLAY_NAME, "IMG1024.JPG");
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.IS_PENDING, 1);
ContentResolver resolver = context.getContentResolver();
Uri collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
Uri item = resolver.insert(collection, values);
try (ParcelFileDescriptor pfd = resolver.openFileDescriptor(item, "w", null)) {
// Write data into the pending image.
} catch (IOException e) {
e.printStackTrace();
}
// Now that we're finished, release the "pending" status, and allow other apps
// to view the image.
values.clear();
values.put(MediaStore.Images.Media.IS_PENDING, 0);
resolver.update(item, values, null, null);

TA貢獻1876條經驗 獲得超5個贊
我被困了很長時間,這對我來說效果很好
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); File = new File(filepath);
并且不要忘記在清單文件中請求舊存儲。
<application android:requestLegacyExternalStorage="true" >
添加回答
舉報