清单权限要求
<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 要符合铃声媒体的要求
如果这篇文章对你有用,就点个赞或收藏下吧,没啥用,就好看,哈哈,当然,要打赏也很开心哈,哈哈哈哈~