Reputation: 183
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
Upvotes: 3
Views: 1345
Reputation: 183
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!
Upvotes: 1