android - 在 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;
}
}
我已经知道我已经在清单文件等中声明的范围存储和其他权限相关的东西。
解决方案
推荐阅读
- nginx - SPA 路由器如何区分前端路由和后端路由?
- kentico - 如何在 Kentico Kontent Management Api v2 上创建组选项卡
- python - 标签显示不正确
- xamarin - 如何使用 FFImageLoading 通过 Xamarin Forms 5 成功缓存和加载 svg 资源
- javascript - MongoDB 仅部分更新
- java - 如何在 Android 中执行一项任务,而无需打开该活动或离开该活动?
- c# - 让子弹在 TModLoader 中造成减益
- python - 如何缩小图像(matplotlib)
- reactjs - 如何在反应固定数据表中显示动态选项、行和列
- nlog - NLog 禁用特定记录器 - 真实