我有一个应该使用特定铃声发出警报的应用程序,可以使用默认铃声选择器进行选择。
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);
答案 0 :(得分:0)
如果您使用存储在外部存储设备上的自定义铃声,则RingtoneManager无法打开它,除非您的应用具有访问外部存储设备的权限。
为清单文件添加缺少的权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />