gpt4 book ai didi

java - MediaMetadataRetriever.setDataSource( native 方法)导致 RuntimeException : status = 0xFFFFFFEA

转载 作者:行者123 更新时间:2023-12-01 07:48:01 29 4
gpt4 key购买 nike

我正在使用 ReactNative 构建一个媒体播放器。为了完成这样的应用程序,我必须导出一个用于检索音乐元数据(如专辑、艺术家等)以及文件路径的模块。

上面的代码使用 jdk1.8.0_112 可以完美运行,但自从我更新到 jdk1.8.0_144 后,它就停止运行了。

在这个例子中,我没有检查非空、非空、长度> 0等,但我在原来的例子中确实这样做了。

try {
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource("Path to the file"); // /storage/337C-1C15/Music/Edguy/Speedhoven.mp3
} catch (RuntimeException ex) {
// java.lang.RuntimeException: setDataSource failed: status = 0xFFFFFFEA
}

我面临两个问题。一方面,我不是一个优秀的 Android 开发者,所以获取一些线索是一项艰巨的任务。另一方面,该错误确实提供了很好的描述。

以防万一你们中的一些人有更好的方法来完成我尝试的事情,我将整个代码留在这里:

@ReactMethod
public void getAll(Callback errorCallback, Callback successCallback){

ContentResolver musicResolver = this.getCurrentActivity().getContentResolver();
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);

if (musicCursor != null && musicCursor.moveToFirst()) {

WritableArray jsonArray = new WritableNativeArray();
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
WritableMap items = new WritableNativeMap();

int titleColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE);
int idColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID);
int artistColumn = musicCursor.getColumnIndex(android.provider.MediaStore.Audio.Media.ARTIST);

try {
do {
items = new WritableNativeMap();
byte[] art;

long thisId = musicCursor.getLong(idColumn);
String thisPath = musicCursor.getString(musicCursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
String thisTitle = musicCursor.getString(titleColumn);
String thisArtist = musicCursor.getString(artistColumn);
String duration = musicCursor.getString(musicCursor.getColumnIndex(MediaStore.Audio.Media.DURATION));


if(thisPath != null && thisPath != "" && thisPath.endsWith(".mp3")) {

mmr.setDataSource(thisPath);

String album = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ALBUM);
String artist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST);
String title = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE);
String genre = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_GENRE);
String encoded = "";
String encodedImage = "";
art = mmr.getEmbeddedPicture();

if (album == null) {
album = thisArtist;
}

if (artist == null) {
artist = thisArtist;
}

if (title == null) {
title = thisTitle;
}

if (art != null) {
Bitmap songImage = BitmapFactory.decodeByteArray(art, 0, art.length);
if(songImage != null){
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
songImage.compress(Bitmap.CompressFormat.JPEG, 60, byteArrayOutputStream);
byte[] byteArray = byteArrayOutputStream.toByteArray();
encodedImage = Base64.encodeToString(byteArray, Base64.DEFAULT);
String pathtoImg = "";
byte[] imageByte = Base64.decode(encodedImage, Base64.DEFAULT);
try {
pathtoImg = Environment.getExternalStorageDirectory() + "/" + thisId + ".jpg";
File filePath = new File(pathtoImg);
FileOutputStream fos = new FileOutputStream(filePath, true);
encoded = pathtoImg;
fos.write(imageByte);
fos.flush();
fos.close();
} catch (FileNotFoundException fnfe) {
errorCallback.invoke(fnfe.getMessage());
} catch (IOException ioe) {
errorCallback.invoke(ioe.getMessage());
}
}
}

String str = String.valueOf(thisId);
items.putString("id", str);
items.putString("album", album);
items.putString("artist", artist);
items.putString("title", title);
items.putString("genre", genre);

if (encoded == "") {
items.putString("cover", "");
} else {
items.putString("cover", "file://" + encoded);
}

items.putString("duration", duration);
items.putString("path", thisPath);
jsonArray.pushMap(items);
}
} while (musicCursor.moveToNext());

successCallback.invoke(jsonArray);
mmr.release();
} catch (RuntimeException e) {
errorCallback.invoke(e.toString());
mmr.release();
} catch (Exception e) {
errorCallback.invoke(e.getMessage());
mmr.release();
}
}
}

当然,我已经看过了:

最佳答案

经过大量调试和研究,我发现了问题。

当文件出现问题时,mmr.setDataSource("path") 似乎会返回 RuntimeException这一点特别重要,因为即使文件存在,也无法检索其元数据。

解决方案是将 MediaMetadataRetriever 使用到 try/catch 中,如下所示:

while(cursor.moveNext()){
try {
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource("Path to the file"); // /storage/337C 1C15/Music/Edguy/Speedhoven.mp3
} catch (RuntimeException ex) {
// something went wrong with the file, ignore it and continue
}
}

关于java - MediaMetadataRetriever.setDataSource( native 方法)导致 RuntimeException : status = 0xFFFFFFEA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46029813/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com