使用外部铃声时,MediaPlayer为空

时间:2017-07-07 13:34:16

标签: android android-mediaplayer

我有一个应该使用特定铃声发出警报的应用程序,可以使用默认铃声选择器进行选择。

Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE);
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TITLE, getString(R.string.setup_ringtone));
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, SharedPrefUtil.getRingtone() != null ? Uri.parse(SharedPrefUtil.getRingtone()) : null);
this.startActivityForResult(intent, SELECT_RINGTONE);

选择后,我将其路径保存到onActivityResult

中的共享首选项
Uri uri = intent.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
if (uri != null) {
    SharedPrefUtil.setRingtone(uri.toString());
}

稍后在MediaPlayer中使用它:

MediaPlayer mp = MediaPlayer.create(ContextProvider.getAppContext(), Uri.parse(SharedPrefUtil.getRingtone()));          
mp.setLooping(true);
mp.start();

在使用默认设备铃声的情况下,它可以正常工作。

但如果我将某首歌设为手机铃声,它会出现在铃声选择器中。当我选择它时,MediaPlayer在初始化时始终为null。 但是, Uri.parse(SharedPrefUtil.getRingtone())会返回正常值 - content:// media / external / audio / media / 366 。与其他默认铃声相同,只是与另一个id。

此外,当我将其设置为此处的铃声选择器

时,会被识别出来
intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, SharedPrefUtil.getRingtone() != null ? Uri.parse(SharedPrefUtil.getRingtone()) : null);

1 个答案:

答案 0 :(得分:0)

如果您使用存储在外部存储设备上的自定义铃声,则RingtoneManager无法打开它,除非您的应用具有访问外部存储设备的权限。

为清单文件添加缺少的权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />