--
layout: blog
title: 'Android設(shè)置振鈴'
date: 2017-06-20 12:11:34
categories: blog
tags: code
image: ''
lead-text: 'Android置振鈴()(來(lái)電鈴聲)時(shí)的權(quán)限問(wèn)題'
Android設(shè)置振鈴需要更改系統(tǒng)設(shè)置,所以在6.0以后提高了權(quán)限級(jí)別,需要使用 WRITE_SETTINGS 權(quán)限才能進(jìn)行振鈴設(shè)置
普通的設(shè)置振鈴方法
public static void setRingtoneImpl(String path2, int id) {
L.E("DownloadTask#setVoiceImpl " + "開始設(shè)置振鈴");
ContentValues cv = new ContentValues();
Uri newUri = null;
Uri uri = MediaStore.Audio.Media.getContentUriForPath(path2);
// 查詢音樂(lè)文件在媒體庫(kù)是否存在
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;
}
// 把需要設(shè)為鈴聲的歌曲更新鈴聲庫(kù)
MainApplication.getContext().getContentResolver().update(uri, cv, MediaStore.MediaColumns.DATA + "=?", new String[]{path2});
newUri = ContentUris.withAppendedId(uri, Long.valueOf(_id));
// 一下為關(guān)鍵代碼:
switch (id) {
case RingConstant.RINGTONE:
RingtoneManager.setActualDefaultRingtoneUri(MainApplication.getContext(), RingtoneManager.TYPE_RINGTONE, newUri);
Toast.makeText(MainApplication.getContext(), "設(shè)置來(lái)電鈴聲成功!", 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);
}
}
//設(shè)置--鈴聲的具體方法
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(), "設(shè)置來(lái)電鈴聲成功!", Toast.LENGTH_SHORT).show();
}
上面設(shè)置振鈴的方法如果在6.0之前不需要權(quán)限能夠直接設(shè)置成功,在6.0之后的版本需要 WRITE_SETTINGS 權(quán)限
獲取 WRITE_SETTINGS 權(quán)限
此權(quán)限不能直接通過(guò)動(dòng)態(tài)權(quán)限來(lái)獲取,需要引導(dǎo)到權(quán)限設(shè)置頁(yè)面手動(dòng)打開,所以要先打開設(shè)置權(quán)限的activity,根據(jù)返回來(lái)判斷權(quán)限是否打開
public static void checkWriteSettingsPermission(Activity activity, String path, int id) {
// 如果有了權(quán)限,就不會(huì)再進(jìn)入activity了
if (!Settings.System.canWrite(activity)) {
// 打開獲取權(quán)限的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);
}
// 將數(shù)據(jù)傳遞到activity中,在獲取了權(quán)限返回后進(jìn)行操作操作
((BaseActivity) activity).addRingToneInfo(path, id);
activity.startActivityForResult(intent, REQUEST_CODE);
} else {
setRingtoneImpl(path, id);
}
}