Android 使用外部铃声时,MediaPlayer为空

Android 使用外部铃声时,MediaPlayer为空,android,android-mediaplayer,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

我有一个应用程序,应该与特定的铃声,可以选择默认铃声选择器报警

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在初始化时总是为空。 但是,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);

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

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

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

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

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

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