首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于定制铃声不再播放的Android RingtoneManager媒体路径

用于定制铃声不再播放的Android RingtoneManager媒体路径
EN

Stack Overflow用户
提问于 2015-07-05 18:26:37
回答 2查看 1.6K关注 0票数 0

我将我的旧nexus设备升级到最新版本,现在MediaPlayer将不再播放我通过ringtoneManager选择器检索的自定义铃声路径。

我有两个媒体作为例子:

  1. 内容://media/内部/音频/media/86--这个不播放,它是一个定制的铃声(一个mp3我下载并添加到/media/音频/铃声/)

  1. 内容://media/内部/音频/media/54-这个播放

我试图在android中同时使用mediaplayer API。两个媒体路径都由RingtoneManager返回给我,如下所示:

代码语言:javascript
复制
Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);

        // activity stack history, its a one time deal only
    //  intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE,
                "Please Select A  Ringtone");


        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_ALL);
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true);
        //intent.putExtra(RingtoneManager.EXTRA_RINGTONE_INCLUDE_DRM, true);


        try {// 44 arbitrary number to recognize our intent
            startActivityForResult(intent, 44);
}
//etc

这是我如何检索选定的铃声。除了用户从列表中选择自定义铃声外,一切正常工作,我得到一个mediaplayer IO异常,无法播放数据资源。

代码语言:javascript
复制
// find out what ringtone the user selected and play the tone.
protected  void onActivityResult(int requestCode, int resultCode, Intent data) {
    Ringtone ringtone;

    if (requestCode == 44 && resultCode == RESULT_OK) {
        Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);

}

// uri被检索,其值为:内容://media/内部/音频/media/86

以下是我尝试播放这个自定义铃声时收到的mediaplayer错误:

代码语言:javascript
复制
  e = {java.io.IOException@4499} "java.io.IOException: setDataSource failed.: status=0x80000000"
 cause = {java.io.IOException@4499} "java.io.IOException: setDataSource failed.: status=0x80000000"
 detailMessage = {java.lang.String@4503} "setDataSource failed.: status=0x80000000"

任何其他媒体都可以正常工作,而不是自定义铃声。

EN

回答 2

Stack Overflow用户

发布于 2015-07-05 19:38:12

看起来路径是不被接受的,我必须使用完整的路径来达到自定义铃声,因为某些原因。谷歌,有什么理由吗?这是我的解决办法。检查uri在isValidUri中是否有效。如果它无效,我们调用getRingtonePathFromContentUri来获取资源的目录路径,然后使用它。据报道,这一问题是here

代码语言:javascript
复制
 /**
* checks if a url such as content://media/internal/audio/media/86 can be played.
 * if not returns no and we can fall back to something else.
**/
    public boolean isValidUri(String contentUri){

        boolean result=true;

        MediaPlayer player = new MediaPlayer();
        try {
            player.setDataSource(contentUri);
        } catch (IOException e) {
            e.printStackTrace();
            result = false;
        }

        return result;
    }

    //gets the SD card path for a ringtone uri
    public  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;
    }
票数 0
EN

Stack Overflow用户

发布于 2016-05-31 05:49:27

您可以将mp3文件放在res/raw文件夹中:

代码语言:javascript
复制
MediaPlayer mediaPlayer = MediaPlayer.create(getApplicationContext(), R.raw.myringtone);
mediaPlayer.start();
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31233606

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档