--
layout: blog
title: 'Android设置振铃'
date: 2017-06-20 12:11:34
categories: blog
tags: code
image: ''
lead-text: 'Android置振铃()(来电铃声)时的权限问题'
Android设置振铃需要更改系统设置,所以在6.0以后提高了权限级别,需要使用 WRITE_SETTINGS 权限才能进行振铃设置
普通的设置振铃方法
public static void setRingtoneImpl(String path2, int id) {
L.E("DownloadTask#setVoiceImpl " + "开始设置振铃");
ContentValues cv = new ContentValues();
Uri newUri = null;
Uri uri = MediaStore.Audio.Media.getContentUriForPath(path2);
// 查询音乐文件在媒体库是否存在
Cursor cursor = MainApplication.getContext().getContentResolver().query(uri, null, MediaStore.MediaColumns.DATA + "=?", new String[]{path2}, null);
if (cursor.moveToFirst() && cursor.getCount() > 0)
{
String _id = cursor.getString(0);
switch (id) {
case RingConstant.RINGTONE:
cv.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
cv.put(MediaStore.Audio.Media.IS_RINGTONE, true);
cv.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
cv.put(MediaStore.Audio.Media.IS_ALARM, false);
cv.put(MediaStore.Audio.Media.IS_MUSIC, false);
break;
case RingConstant.NOTIFICATION:
cv.put(MediaStore.Audio.Media.IS_RINGTONE, false);
cv.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
cv.put(MediaStore.Audio.Media.IS_ALARM, false);
cv.put(MediaStore.Audio.Media.IS_MUSIC, false);
break;
case RingConstant.ALARM:
cv.put(MediaStore.Audio.Media.IS_RINGTONE, false);
cv.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
cv.put(MediaStore.Audio.Media.IS_ALARM, true);
cv.put(MediaStore.Audio.Media.IS_MUSIC, false);
break;
case RingConstant.ALL:
cv.put(MediaStore.Audio.Media.IS_RINGTONE, true);
cv.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
cv.put(MediaStore.Audio.Media.IS_ALARM, true);
cv.put(MediaStore.Audio.Media.IS_MUSIC, false);
break;
default:
break;
}
// 把需要设为铃声的歌曲更新铃声库
MainApplication.getContext().getContentResolver().update(uri, cv, MediaStore.MediaColumns.DATA + "=?", new String[]{path2});
newUri = ContentUris.withAppendedId(uri, Long.valueOf(_id));
// 一下为关键代码:
switch (id) {
case RingConstant.RINGTONE:
RingtoneManager.setActualDefaultRingtoneUri(MainApplication.getContext(), RingtoneManager.TYPE_RINGTONE, newUri);
Toast.makeText(MainApplication.getContext(), "设置来电铃声成功!", Toast.LENGTH_SHORT).show();
break;
case RingConstant.NOTIFICATION:
RingtoneManager.setActualDefaultRingtoneUri(MainApplication.getContext(), RingtoneManager.TYPE_NOTIFICATION, newUri);
break;
case RingConstant.ALARM:
RingtoneManager.setActualDefaultRingtoneUri(MainApplication.getContext(), RingtoneManager.TYPE_ALARM, newUri);
break;
case RingConstant.ALL:
RingtoneManager.setActualDefaultRingtoneUri(MainApplication.getContext(), RingtoneManager.TYPE_ALL, newUri);
break;
default:
break;
}
} else {
setMyRingtone(path2);
}
}
//设置--铃声的具体方法
public static void setMyRingtone(String path) {
File sdfile = new File(path);
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, sdfile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, sdfile.getName());
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
values.put(MediaStore.Audio.Media.IS_ALARM, false);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(sdfile.getAbsolutePath());
Uri newUri = MainApplication.getContext().getContentResolver().insert(uri, values);
RingtoneManager.setActualDefaultRingtoneUri(MainApplication.getContext(), RingtoneManager.TYPE_RINGTONE, newUri);
Toast.makeText(MainApplication.getContext(), "设置来电铃声成功!", Toast.LENGTH_SHORT).show();
}
上面设置振铃的方法如果在6.0之前不需要权限能够直接设置成功,在6.0之后的版本需要 WRITE_SETTINGS 权限
获取 WRITE_SETTINGS 权限
此权限不能直接通过动态权限来获取,需要引导到权限设置页面手动打开,所以要先打开设置权限的activity,根据返回来判断权限是否打开
public static void checkWriteSettingsPermission(Activity activity, String path, int id) {
// 如果有了权限,就不会再进入activity了
if (!Settings.System.canWrite(activity)) {
// 打开获取权限的activity
Intent intent = new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS,
Uri.parse("package:" + activity.getPackageName()));
if (!StringUtils.isEmpty(path)) {
intent.putExtra("path", path);
intent.putExtra("id", id);
L.E("RingToneUtil#checkWriteSettingsPermission " + "intent = " + intent);
}
// 将数据传递到activity中,在获取了权限返回后进行操作操作
((BaseActivity) activity).addRingToneInfo(path, id);
activity.startActivityForResult(intent, REQUEST_CODE);
} else {
setRingtoneImpl(path, id);
}
}