Android設(shè)置振鈴

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容