使用授予的权限写入 Android 中的外部存储中的文件引发 java.io.IOException:权限被拒绝

Writing to a file in external storage in Android with granted permission raises java.io.IOException: Permission denied

我正在尝试使用 MyID3 for Android 库修改 MP3 文件的 ID3 标签:

...
    int permissionCheck = ContextCompat.checkSelfPermission(this,
        Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permissionCheck != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(this,
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
    }

    String pathdata = "/storage/0094-1EEE/Music/example.mp3";
    File src = new File(pathdata);

    MusicMetadataSet src_set = null;
    try {
        src_set = new MyID3().read(src);
    } catch (IOException e1) {
        e1.printStackTrace();
    } // read metadata

    if (src_set == null) {
    } else {
        try {
            IMusicMetadata metadata = src_set.getSimplified();
            String artist = metadata.getArtist();
            String year = metadata.getYear();
            Log.i("artist", artist);
            Log.i("year", year);
        } catch (Exception e) {
            e.printStackTrace();
        }
        File dst = new File(pathdata);
        MusicMetadata meta = new MusicMetadata("name");
        meta.setYear("1234");
        try {
            new MyID3().update(src, src_set, meta);
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ID3WriteException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }  // write updated metadata
    }
...

如果 MP3 文件在内部存储中,它可以工作,但如果它在外部存储中,它returns:

W/System.err: java.io.IOException: Permission denied
W/System.err:     at java.io.UnixFileSystem.createFileExclusively0(Native Method)
W/System.err:     at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:280)
W/System.err:     at java.io.File.createNewFile(File.java:948)
W/System.err:     at java.io.File.createTempFile(File.java:1862)
W/System.err:     at org.cmc.music.myid3.MyID3.update(MyID3.java:60)
W/System.err:     at com.maxmpz.poweramp.apiexample.FilesActivity.onItemClick(FilesActivity.java:165)
W/System.err:     at android.widget.AdapterView.performItemClick(AdapterView.java:310)
W/System.err:     at android.widget.AbsListView.performItemClick(AbsListView.java:1164)
W/System.err:     at android.widget.AbsListView$PerformClick.run(AbsListView.java:3139)
W/System.err:     at android.widget.AbsListView.run(AbsListView.java:4054)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:751)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err:     at android.os.Looper.loop(Looper.java:154)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6186)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779)

我的 "AndroidManifest.xml" 文件有:

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

首先,requestPermissions()是异步的。这不是阻塞调用。当它 returns 时,您还没有权限,但您的代码假定它有权限。

其次,WRITE_EXTERNAL_STORAGE 很可能与 /storage/0094-1EEE/Music/example.mp3 这样的路径无关。 WRITE_EXTERNAL_STORAGE 用于 external storage. It is very unlikely that /storage/0094-1EEE/ is a location on external storage. More likely, it is a location on removable storage,您无法使用 File.

在 Android 4.4+ 上读取或写入此位置