gpt4 book ai didi

android - MediaPlayer setDataSource 失败,状态 = 0x80000000 为 2.3.4 上的文件路径设置的铃声

转载 作者:IT老高 更新时间:2023-10-28 23:11:46 30 4
gpt4 key购买 nike

标题说明了大部分内容。

我的应用程序一直在播放 uri 指向的铃声,例如 content://media/internal/audio/media/387content://media/external/audio/media/1655 (我相信对于 SD 卡上的自定义铃声)同时使用 setDataSource(fileInfo)setDataSource(mContext, Uri.parse(fileInfo))

在每种情况下,我都收到了有关使用 Android 4.x(不同版本)手机的 setDataSource failed.: status=0x80000000 异常信息的日志。

看到错误只发生在内容 uri 指向的铃声上,而不是路径指向的单个文件上,我决定使用铃声的路径以及修复上述手机上的问题(同时仍然使用 setDataSource( mContext, Uri.parse(fileInfo)) )

然而,它在 Android 2.3.4-2.3.6 的手机上开始出现问题(虽然不是我的 2.3.3):

  • 我收到了一些异常日志:setDataSource failed.: status=0x80000000 文件路径为 /system/media/audio/ringtones/TwirlAway.ogg
  • 我还收到了关于 MediaPlayer.onErrorListener.onError(int what, int extra) 方法调用的日志,其中调用了 what=1extra =-2147483648,据我所知,这表明该文件丢失或已损坏。但是我执行

    File file = new File(fileInfo);
    if (!file.exists())

在这种情况下检查并返回该文件确实存在 - 那么它是否已损坏?内存中的音乐文件不太可能。

总结一下:

  • 使用 setDataSource("content://media/internal/audio/media/52")
  • 抛出异常:setDataSource failed.: status=0x80000000 for setDataSource(mContext, "/system/media/audio/ringtones/TwirlAway.ogg")

有趣的是,setDataSource(Context context, Uri uri)调用的setDataSource(Context context, Uri uri, Headers headers)方法的前几行是(from GrepCode source for 2.3.4 ):

 String scheme = uri.getScheme();
if(scheme == null || scheme.equals("file")) {
setDataSource(uri.getPath());
return;
}

所以,毕竟 setDataSource("/system/media/audio/ringtones/TwirlAway.ogg") 只是失败了。我已经通过使用从uris获取铃声的路径:

private static String getRingtonePathFromContentUri(Context context,
Uri contentUri) {

String[] proj = { MediaStore.Audio.Media.DATA };
Cursor ringtoneCursor = context.getContentResolver().query(contentUri,
proj, null, null, null);
ringtoneCursor.moveToFirst();
return ringtoneCursor.getString(ringtoneCursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
}

任何想法可能导致错误抛出?也许这些是由于缺乏阅读权限引起的一些问题?我想 native setDataSource(String path) 函数的源代码会有很大帮助,但我找不到它。

最佳答案

以下 Lorne 的回答在处理此问题时最有帮助。

对于其他苦苦挣扎的人,这是我已经使用了 6 个月以上的代码,几乎不再报告错误。

fileinfo 可以是以下两种(示例):

/system/media/audio/alarms/Walk_in_the_forest.ogg

content://media/internal/audio/media/20

public static void setMediaPlayerDataSource(Context context,
MediaPlayer mp, String fileInfo) throws Exception {

if (fileInfo.startsWith("content://")) {
try {
Uri uri = Uri.parse(fileInfo);
fileInfo = getRingtonePathFromContentUri(context, uri);
} catch (Exception e) {
}
}

try {
if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB)
try {
setMediaPlayerDataSourcePreHoneyComb(context, mp, fileInfo);
} catch (Exception e) {
setMediaPlayerDataSourcePostHoneyComb(context, mp, fileInfo);
}
else
setMediaPlayerDataSourcePostHoneyComb(context, mp, fileInfo);

} catch (Exception e) {
try {
setMediaPlayerDataSourceUsingFileDescriptor(context, mp,
fileInfo);
} catch (Exception ee) {
String uri = getRingtoneUriFromPath(context, fileInfo);
mp.reset();
mp.setDataSource(uri);
}
}
}

private static void setMediaPlayerDataSourcePreHoneyComb(Context context,
MediaPlayer mp, String fileInfo) throws Exception {
mp.reset();
mp.setDataSource(fileInfo);
}

private static void setMediaPlayerDataSourcePostHoneyComb(Context context,
MediaPlayer mp, String fileInfo) throws Exception {
mp.reset();
mp.setDataSource(context, Uri.parse(Uri.encode(fileInfo)));
}

private static void setMediaPlayerDataSourceUsingFileDescriptor(
Context context, MediaPlayer mp, String fileInfo) throws Exception {
File file = new File(fileInfo);
FileInputStream inputStream = new FileInputStream(file);
mp.reset();
mp.setDataSource(inputStream.getFD());
inputStream.close();
}

private static String getRingtoneUriFromPath(Context context, String path) {
Uri ringtonesUri = MediaStore.Audio.Media.getContentUriForPath(path);
Cursor ringtoneCursor = context.getContentResolver().query(
ringtonesUri, null,
MediaStore.Audio.Media.DATA + "='" + path + "'", null, null);
ringtoneCursor.moveToFirst();

long id = ringtoneCursor.getLong(ringtoneCursor
.getColumnIndex(MediaStore.Audio.Media._ID));
ringtoneCursor.close();

if (!ringtonesUri.toString().endsWith(String.valueOf(id))) {
return ringtonesUri + "/" + id;
}
return ringtonesUri.toString();
}

public static String getRingtonePathFromContentUri(Context context,
Uri contentUri) {
String[] proj = { MediaStore.Audio.Media.DATA };
Cursor ringtoneCursor = context.getContentResolver().query(contentUri,
proj, null, null, null);
ringtoneCursor.moveToFirst();

String path = ringtoneCursor.getString(ringtoneCursor
.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));

ringtoneCursor.close();
return path;
}

关于android - MediaPlayer setDataSource 失败,状态 = 0x80000000 为 2.3.4 上的文件路径设置的铃声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16395559/

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