首页 > 解决方案 > 在 Android 11 / R 中将铃声设置为铃声/通知

问题描述

自过去 4-5 天以来,我一直在尝试在 Android 11 中设置铃声/通知音,但无法完成,这并不是我没有尝试过任何新的东西,我的代码已经可以正常工作在 Android 10 及以下版本中,但是当我将目标设置为 Android 30 时,它不起作用。

public boolean saveAsRingtone() {
    if (mInterstitialAd != null) {
        mInterstitialAd.show(this);
    }
    InputStream fIn = getBaseContext().getResources().openRawResource(R.raw.file);
    try {
        byte[] buffer = new byte[fIn.available()];
        fIn.read(buffer);
        fIn.close();

        String path = Environment.getExternalStorageDirectory() + "/Sounds/Media/";
        String filename = "Ring.mp3";
        if (!new File(path).exists()) {
            new File(path).mkdirs();
        }
        try {
            FileOutputStream save = new FileOutputStream(path + filename);
            save.write(buffer);
            save.flush();
            save.close();
            sendBroadcast(new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE", Uri.parse("file://" + path + filename)));
            File k = new File(path, filename);

            ContentValues values = new ContentValues();
            values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
            values.put(MediaStore.MediaColumns.TITLE, "RingTone");
            values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
            values.put(MediaStore.MediaColumns.SIZE, 215454);
            values.put(MediaStore.MediaColumns.ARTIST, "Test");
            if (RingtoneManager.TYPE_RINGTONE == RingtoneManager.TYPE_RINGTONE) {
                values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
            } else if (RingtoneManager.TYPE_NOTIFICATION == RingtoneManager.TYPE_NOTIFICATION) {
                values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false);
            }
            values.put(MediaStore.Audio.Media.IS_ALARM, Boolean.valueOf(false));
            values.put(MediaStore.Audio.Media.IS_MUSIC, Boolean.valueOf(false));


            Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
            getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + k.getAbsolutePath() + "\"", null);
        

            RingtoneManager.setActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE, uri);
            Toast.makeText(getApplicationContext(), "Done", Toast.LENGTH_SHORT).show();
                return true;

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e2) {
            e2.printStackTrace();
            return false;
        }
    } catch (IOException e3) {
        e3.printStackTrace();
        return false;
    }
}

我已经知道我已经在清单文件等中声明的范围存储和其他权限相关的东西。

标签: androidfilenotificationsringtoneringtonemanager

解决方案


推荐阅读