--
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);        }    }

更多相关文章

  1. Android初学习 - android:sharedUserId="android.uid.system" 应
  2. Android 权限相关问题
  3. android系统权限关机重启
  4. Android 9.0 (P版本) SystemServer中的服务配置se linux权限
  5. System Permissions—— android系统权限
  6. Android的权限 permission
  7. 在android获取root权限的方法^_^。
  8. Android学习笔记_20_访问应用权限汇总
  9. Android系统权限和root权限

随机推荐

  1. Android(安卓)Studio 快捷键
  2. android中MotionEvent.ACTION_CANCEL事件
  3. 【Android(安卓)应用开发】GitHub 优秀的
  4. 获取Android设备的设备详细信息
  5. Android(安卓)Design Support Library学
  6. Android(安卓)自定义CheckBox 样式
  7. 通过 按钮 bundle 传过来 变换Q币图片
  8. 申请android google map API key
  9. Android(安卓)日志打印工具类 可显示打印
  10. android 发送短信的两种方式