Android设置振铃

2017-11-06  本文已影响79人  J_xs

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

上一篇 下一篇

猜你喜欢

热点阅读