简体   繁体   中英

Android IOException: open failed: EACCES (Permission denied)

I have a code which updates song ID3 tags, It is working fine for files inside the device storage but gives 'java.io.IOException: open failed: EACCES (Permission denied)' error for files in external storage. I have set WRITE_EXTERNAL_STORAGE permission in manifest as well but no help. providing my code below , any help would be appriciated.

protected void EditTags(final Song song,String tite, String album, String artist){
    File src = new File(song.getPath());
    MusicMetadataSet src_set = null;
    try {
        src_set = new MyID3().read(src);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } // read metadata

    if (src_set == null) // perhaps no metadata
    {
        Log.i("NULL", "NULL");
    }
    else
    {
        try{
            IMusicMetadata metadata = src_set.getSimplified();
            String artist1 = metadata.getArtist();
            String album1 = metadata.getAlbum();
            String song_title = metadata.getSongTitle();
            Number track_number = metadata.getTrackNumber();
            Log.i("artist", artist1);
            Log.i("album", album1);
        }catch (Exception e) {
            e.printStackTrace();
        }

        MusicMetadata meta = new MusicMetadata("name");
        meta.setAlbum(tite);
        meta.setArtist(artist);
        meta.setAlbum(album);
        try {
            new MyID3().update(src, src_set, meta);
            Toast.makeText(context, "Tags Updated", Toast.LENGTH_SHORT).show();
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ID3WriteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }  // write updated metadata
    }
    scanner=new MediaScannerConnection(context,
            new MediaScannerConnection.MediaScannerConnectionClient() {

                public void onScanCompleted(String path, Uri uri) {
                    scanner.disconnect();
                }

                public void onMediaScannerConnected() {
                    scanner.scanFile(song.getPath(), "audio/*");
                }
            });

    scanner.connect();
}

My AndroidManifest.xml:-

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.musicplayer" >

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

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme"
    >
   .
   .
</application>
</manifest>

My Log:-

08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ java.io.IOException: open failed: EACCES (Permission denied)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at java.io.File.createNewFile(File.java:941)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at java.io.File.createTempFile(File.java:1006)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at org.cmc.music.myid3.MyID3.update(MyID3.java:60)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at com.musicplayer.AlbumSongAdapter.EditTags(AlbumSongAdapter.java:280)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at com.musicplayer.AlbumSongAdapter$3.onClick(AlbumSongAdapter.java:240)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:160)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at android.os.Handler.dispatchMessage(Handler.java:102)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at android.os.Looper.loop(Looper.java:135)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at android.app.ActivityThread.main(ActivityThread.java:5254)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at java.lang.reflect.Method.invoke(Native Method)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at java.lang.reflect.Method.invoke(Method.java:372)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898)
08-01 12:02:55.388    8085-8085/com.musicplayer W/System.err﹕ at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693)
08-01 12:02:55.389    8085-8085/com.musicplayer W/System.err﹕ Caused by: android.system.ErrnoException: open failed: EACCES (Permission denied)
08-01 12:02:55.389    8085-8085/com.musicplayer W/System.err﹕ at libcore.io.Posix.open(Native Method)
08-01 12:02:55.389    8085-8085/com.musicplayer W/System.err﹕ at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
08-01 12:02:55.389    8085-8085/com.musicplayer W/System.err﹕ at java.io.File.createNewFile(File.java:934)
08-01 12:02:55.389    8085-8085/com.musicplayer W/System.err﹕ ... 12 more

So I Figured It Out, From KITKAT onwards, Android Doesn't Allow Full External Card Access To Applications Even After Using Permission.So The Code Is Actually Fine But We Need To Find Another Way To Tackle The Situation. Once I Will Get To It, Will Surely Let Others Know!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM