如何从RingtonePicker对话框选铃声并显示到TextView,及设置默认复选框
这两个都是Android开发里常见的铃声选择器需求,我给你一步步拆解解决:
问题1:点击OK按钮时,从RingtonePicker对话框选择铃声并显示在TextView中
要实现这个功能,分两步走:启动铃声选择器,然后处理返回的选择结果:
步骤1:启动RingtonePicker对话框
先创建一个Intent指定铃声选择器的动作,配置好显示参数后,启动带返回结果的Activity(AndroidX推荐用registerForActivityResult,旧版本用startActivityForResult):示例代码(AndroidX写法):
// 先定义ActivityResultLauncher ActivityResultLauncher<Intent> ringtonePickerLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { // 这里处理返回结果,后面会讲 } ); // 启动铃声选择器的方法 private void openRingtonePicker() { Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); // 指定选择来电铃声类型 intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE); // 隐藏静音选项 intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); // 显示默认铃声选项 intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); // 启动选择器 ringtonePickerLauncher.launch(intent); }步骤2:处理选择结果并显示到TextView
在上面的ActivityResultLauncher回调里,获取选中的铃声URI,解析出铃声名称后设置到TextView:ActivityResultLauncher<Intent> ringtonePickerLauncher = registerForActivityResult( new ActivityResultContracts.StartActivityForResult(), result -> { if (result.getResultCode() == RESULT_OK && result.getData() != null) { // 获取选中的铃声URI Uri ringtoneUri = result.getData().getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); if (ringtoneUri != null) { // 解析铃声名称 Ringtone ringtone = RingtoneManager.getRingtone(this, ringtoneUri); String ringtoneName = ringtone.getTitle(this); // 显示到目标TextView yourTargetTextView.setText(ringtoneName); } } } );如果你用的是旧版
onActivityResult,可以这样写:private static final int RINGTONE_REQUEST_CODE = 1001; private void openRingtonePicker() { Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); startActivityForResult(intent, RINGTONE_REQUEST_CODE); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RINGTONE_REQUEST_CODE && resultCode == RESULT_OK) { Uri ringtoneUri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI); if (ringtoneUri != null) { Ringtone ringtone = RingtoneManager.getRingtone(this, ringtoneUri); yourTargetTextView.setText(ringtone.getTitle(this)); } } }
问题2:将RingtonePicker默认选中项从“Andromeda”改为“Default ringtone”
核心是给启动选择器的Intent设置初始选中的URI为系统默认铃声,具体操作如下:
在创建铃声选择器Intent的时候,添加两个关键参数:
private void openRingtonePickerWithDefaultSelected() { Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_RINGTONE); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_SILENT, false); intent.putExtra(RingtoneManager.EXTRA_RINGTONE_SHOW_DEFAULT, true); // 获取系统默认铃声的URI Uri defaultRingtoneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); // 设置默认铃声的URI(确保"Default ringtone"选项存在) intent.putExtra(RingtoneManager.EXTRA_RINGTONE_DEFAULT_URI, defaultRingtoneUri); // 设置对话框打开时默认选中系统铃声 intent.putExtra(RingtoneManager.EXTRA_RINGTONE_EXISTING_URI, defaultRingtoneUri); // 启动选择器(用你之前的launcher或者startActivityForResult) ringtonePickerLauncher.launch(intent); }
这样打开RingtonePicker对话框时,“Default ringtone”就会被默认选中,而不是原来的“Andromeda”了。
内容的提问来源于stack exchange,提问作者Md Faysal Ahmed Akash
相关产品推荐
相关产品推荐

