我尝试使用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文件位于内部存储中,则可以正常工作,但如果它位于外部存储中,则会返回:
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$3.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"/>
答案 0 :(得分:0)
首先,requestPermissions()
是异步的。这不是阻止电话。当它返回时,你还没有权限,但是你的代码假定它有。
其次,WRITE_EXTERNAL_STORAGE
很可能与/storage/0094-1EEE/Music/example.mp3
之类的路径无关。 WRITE_EXTERNAL_STORAGE
适用于external storage。 /storage/0094-1EEE/
不太可能是外部存储上的位置。更有可能的是,它位于removable storage上,您无法使用File
在Android 4.4+上读取或写入此位置。