Kog*_*ger 19 android ringtone android-mediaplayer
标题说的大多数.
我的应用程序一直在播放uri喜欢的铃声content://media/internal/audio/media/387或content://media/external/audio/media/1655(对于SDcard上的自定义铃声我相信)使用setDataSource(fileInfo)和setDataSource(mContext, Uri.parse(fileInfo)).
在每种情况下,我都收到了有关setDataSource failed.: status=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())
Run Code Online (Sandbox Code Playgroud)检查这种情况,它返回该文件确实存在 - 它已损坏吗?内存中的音乐文件极不可能.
总结一下:
setDataSource("content://media/internal/audio/media/52")setDataSource failed.: status=0x80000000forsetDataSource(mContext, "/system/media/audio/ringtones/TwirlAway.ogg")有趣的是,前几行setDataSource(Context context, Uri uri, Headers headers)调用的方法setDataSource(Context context, Uri uri)是(来自2.3.4的GrepCode源代码):
String scheme = uri.getScheme();
if(scheme == null || scheme.equals("file")) {
setDataSource(uri.getPath());
return;
}
Run Code Online (Sandbox Code Playgroud)
所以,毕竟,它只是失败了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));
}
Run Code Online (Sandbox Code Playgroud)
什么可能导致错误抛出的想法?也许那些是缺乏阅读权限导致的一些问题?我猜本机setDataSource(String path)函数的源代码会有很多帮助,但我无法找到它.
Kog*_*ger 12
在处理这个问题时,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;
}
Run Code Online (Sandbox Code Playgroud)
您必须明确设置文件的长度。使用重载方法:
AssetFileDescriptor afd = ctx.getAssets().openFd([your asset name]);
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
| 归档时间: |
|
| 查看次数: |
25435 次 |
| 最近记录: |