android - 为什么我来自 ContentValues 的 newUri 为空?以编程方式设置铃声
问题描述
我正在尝试将歌曲设置为铃声。我找到了很多方法来做到这一点,但没有任何效果。其中一种方式如下所示:
private void setSongAsRingtone(Song song){
File ringFile = new File(song.getPath());
Log.d(tag, "Ring name: " + ringFile.getName());
Log.d(tag, "Ring absolute path: " + ringFile.getAbsolutePath());
Log.d(tag, "Activity: " + getActivity().toString());
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, ringFile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, song.getTitle());
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
values.put(MediaStore.MediaColumns.SIZE, 26454);
values.put(MediaStore.Audio.Media.ARTIST, song.getArtist());
values.put(MediaStore.Audio.Media.IS_RINGTONE, true);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
values.put(MediaStore.Audio.Media.IS_ALARM, true);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
Uri uri = MediaStore.Audio.Media.getContentUriForPath(ringFile.getAbsolutePath());
Uri newUri = getActivity().getContentResolver().insert(uri, values);
RingtoneManager.setActualDefaultRingtoneUri(getActivity(), RingtoneManager.TYPE_RINGTONE, newUri);
}
Logcat 说:
D/RingtoneDialogFragment: Ring name: Jamal - Peron [Official Music Video].m4a
D/RingtoneDialogFragment: Ring absolute path: /storage/emulated/0/storage/emulated/0/Download/Jamal - Peron [Official Music Video].m4a
D/RingtoneDialogFragment: Activity: com.linkplayer.linkplayer.main.MainActivity@7bc8453
I/RingtoneManager: Save cache type :1, URI : content://0@media/external/audio/media/10557
W/RingtoneManager: Failed to open directly; attempting failover: java.io.FileNotFoundException: open failed: ENOENT (No such file or directory)
W/RingtoneManager: Failed to cache ringtone: java.io.IOException: java.lang.SecurityException: Uri is not ringtone, alarm, or notification: content://0@media/external/audio/media/10557
I/RingtoneManager: ringtone title : Jamal - Peron [Official Music Video], DRM : 0
但是newUri 对象是 null并且我有一些错误。也许有人知道为什么?
在此先感谢您的帮助。祝你有个美好的夜晚。
解决方案
我必须在插入(创建 newUri)之前调用此方法:
String filePathToDelete = MediaStore.MediaColumns.DATA + "=\"" + ringtoneFile.getAbsolutePath() + "\"";
getActivity().getContentResolver().delete(uri, filePathToDelete, null);
推荐阅读
- python - 错误:引发 AttributeError("%s.%s" % (self._username_, attr)) AttributeError:
.幻灯片 - macos - WebAPI ASP.NET Core 中的 OSX 中的 SSL
- qt - 如何在 QGraphicsScene 上显示缩略图?
- reactjs - React-router-dom 链接在页面顶部打开
- java - 从 SearchResponse 中排除“sourceAsString”
- go - 从 Echo 中的查询字符串中获取整数值的惯用方法是什么?
- nginx - 使用通配符将新文件添加到 rsyslogd
- javascript - 警告:无法对未安装的组件 React Native 执行 React 状态更新
- python - Python Pandas,如何对字典列表进行分组和排序
- ballerina - 如何在芭蕾舞演员中创建内部阻塞队列?