您的当前位置:首页正文

设置来电铃声、卡2来电铃声、短信铃声、提示铃声、闹铃铃声

2024-11-29 来源:个人技术集锦

清单权限要求

    <uses-permission android:name="android.permission.WRITE_SETTINGS"
        tools:ignore="ProtectedPermissions" />

权限判断

Settings.System.canWrite(context)

权限设置

Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,
                Uri.parse("package:" + context.getPackageName()));
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);

uri 是铃声文件的uri,如 content://media/internal/audio/media/23
RingtoneManager 中
public static final int TYPE_RINGTONE = 1;
public static final int TYPE_NOTIFICATION = 2;
public static final int TYPE_ALARM = 4;
public static final int TYPE_ALL = TYPE_RINGTONE | TYPE_NOTIFICATION | TYPE_ALARM;

设置来电铃声

RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_RINGTONE, uri);

设置通知提示音铃声

RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_NOTIFICATION, uri);

设置闹钟铃声(设置成功后,新建闹钟才是这个铃声,之前已创建的闹钟的铃声不会变)

RingtoneManager.setActualDefaultRingtoneUri(context, RingtoneManager.TYPE_ALARM, uri);

直接调用系统的api,只能实现以上三种,但实际开发应用中会要求设置更多,比如来电铃声,要求设置卡2的来电铃声,要求设置短信铃声(信息铃声)等等
看源码可以发现,RingtoneManager.setActualDefaultRingtoneUri 实际上是调用以下方法,更改系统设置

String setting = getSettingForType(type);

private static String getSettingForType(int type) {
        if ((type & TYPE_RINGTONE) != 0) {
            return Settings.System.RINGTONE;
        } else if ((type & TYPE_NOTIFICATION) != 0) {
            return Settings.System.NOTIFICATION_SOUND;
        } else if ((type & TYPE_ALARM) != 0) {
            return Settings.System.ALARM_ALERT;
        } else {
            return null;
        }
    }
    
Settings.System.putStringForUser(resolver, setting,
                ringtoneUri != null ? ringtoneUri.toString() : null, context.getUserId());

那我们怎么知道要设置的功能对应的“setting”是什么呢?
cmd–adb 命令
adb shell settings list system
以华为手机为例,获取到以下信息(筛选部分展示)

alarm_alert=content://media/internal/audio/media/10
alarm_alert_path=/system/media/audio/alarms/Forest_Melody.ogg
calendar=content://media/internal/audio/media/26
calendar_path=/system/media/audio/notifications/Bongo.ogg
email=content://media/internal/audio/media/26
email_ai_translation=true
email_path=/system/media/audio/notifications/Bongo.ogg
enable_always_allow_mms=1
message=content://media/external/audio/media/20153
messageSub1=content://media/internal/audio/media/24
message_path=/storage/emulated/0/Music/cc_message.aac
notification_sound=content://0@media/external/audio/media/20153
notification_sound_path=/storage/emulated/0/Music/cc_message.aac
notification_sound_set=1
ringtone2=content://media/external/audio/media/9748
ringtone2_path=/storage/emulated/0/Music/laidian.aac
ringtone2_set=1
ringtone=content://0@media/external/audio/media/9748
ringtone_path=/storage/emulated/0/Music/laidian.aac
ringtone_set=1
.....

其中的 “alarm_alert”, “calendar”,“ringtone”,“ringtone2” 就是我们想要的

	//例如设置华为的卡2来电铃声
	boolean isSuccess;
	try {
    	Settings.System.putString(context.getContentResolver(), "ringtone2", uri.toString());
    	isSuccess = true;
    } catch (Exception e) {
        isSuccess = false;
    }
    Log.e("TAG",isSuccess?"设置成功":"设置失败");

同理,其他手机、其他的铃声设置,这里就不再提供了,大家自行获取相关信息哈。

注意点:
1,必须要先获取权限,不然会catch
2,Settings.System.putString 可能会有部分功能设置失败,应该是手机厂商对某些内容进行了限制,不让外部设置,主要要加 try catch
3,uri 要符合铃声媒体的要求

如果这篇文章对你有用,就点个赞或收藏下吧,没啥用,就好看,哈哈,当然,要打赏也很开心哈,哈哈哈哈~

显示全文