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

android–MediaPlayer setDataSource失败,状态= 0x80000000,用于2.3.4上文件路径设置的铃声,第1张

概述标题说的大多数.我的应用程序一直在播放由uri指向的铃声,如内容://media/internal/audio/media/387或content://media/external/audio/media/1655(对于SDcard上的自定义铃声,我相信)同时使用setDataSource(fileInfo)和setDataSource(mContext,Uri.parse(fileInfo

标题说的大多数.

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

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

看到错误只发生在内容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 = 1和extra = -2147483648,据我所知,这个文件表明该文件丢失或者已损坏.但是我表演

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

检查这种情况,它返回该文件确实存在 – 它已损坏吗?内存中的音乐文件极不可能.

总结一下:

>使用setDataSource(“content:// media / internal / audio / media / 52”)
>抛出异常:setDataSource失败:状态= 0x80000000 for setDataSource(mContext,“/ system / media /audio / ringtones / TrafficAway.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));}

什么可能导致错误抛出的想法?也许那些是缺乏阅读权限导致的一些问题?
我猜本机setDataSource(String path)函数的源代码会有很多帮助,但我无法找到它.

解决方法:

在处理这个问题时,Lorne的回答是最有帮助的.

对于任何正在努力解决它的人来说,这里是我已经使用超过6个月的代码,现在几乎没有报告错误了.

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

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

内容://媒体/内部/音频/媒体/ 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上文件路径设置的铃声全部内容,希望文章能够帮你解决android – MediaPlayer setDataSource失败,状态= 0x80000000,用于2.3.4上文件路径设置的铃声所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1102649.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-28
下一篇2022-05-28

发表评论

登录后才能评论

评论列表(0条)

    保存