标题已经说得很清楚了。
我的应用程序一直在使用像content://media/internal/audio/media/387
或content://media/external/audio/media/1655
(我认为是用于SD卡上的自定义铃声)这样的uri来播放铃声,同时使用setDataSource(fileInfo)
和setDataSource(mContext, Uri.parse(fileInfo))
两种方法。
在每种情况下,我都收到了关于在使用Android 4.x的手机上(不同版本)出现setDataSource失败:status=0x80000000
异常的日志信息。
由于发生错误仅针对指向内容uri的铃声,而不是指向路径的单个文件,因此我决定对铃声也使用路径,这在上述手机上解决了问题(同时仍然使用setDataSource(mContext, Uri.parse(fileInfo))
)。
但是,在Android 2.3.4-2.3.6的手机上(我的2.3.3上没有),问题开始出现:
- 我收到了几个带有路径文件的异常日志,例如
/system/media/audio/ringtones/TwirlAway.ogg
,并显示setDataSource失败:status=0x80000000
我还收到了一个关于
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(mContext,"/system/media/audio/ringtones/TwirlAway.ogg")
,会抛出异常:setDataSource failed .: status = 0x80000000
有趣的是,被setDataSource(Context context, Uri uri)
调用的setDataSource(Context context, Uri uri, Headers headers)
方法的前几行内容(从2.3.4版本的GrepCode源代码)如下:
String scheme = uri.getScheme();
if(scheme == null || scheme.equals("file")) {
setDataSource(uri.getPath());
return;
}
所以,归根结底,它只是在setDataSource("/system/media/audio/ringtones/TwirlAway.ogg")
失败了。我使用以下内容从URI中获取铃声的路径:
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路径)函数的源代码会很有帮助,但我找不到它。