android - 如何通过我的 Activity 在 Android 中设置铃声?

标签 android android-activity ringtone

我正在尝试找到一种方法,通过我的 Android Activity 中的代码设置新的默认铃声。

我已经把铃声下载到bytearray中了。

最佳答案

最后,我设法将默认铃声设置为我下载的铃声。 下载代码不包含在下面,仅包含将其设置为默认铃声所需的代码。

File k = new File(path, "mysong.mp3"); // path is a file to /sdcard/media/ringtone

ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, "My Song title");
values.put(MediaStore.MediaColumns.SIZE, 215454);
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
values.put(MediaStore.Audio.Media.ARTIST, "Madonna");
values.put(MediaStore.Audio.Media.DURATION, 230);
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);

//Insert it into the database
Uri uri = MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath());
Uri newUri = this.getContentResolver().insert(uri, values);

RingtoneManager.setActualDefaultRingtoneUri(
  myActivity,
  RingtoneManager.TYPE_RINGTONE,
  newUri
);  

无论如何,我并不完全理解这段代码在做什么。

铃声管理器需要一个指向要设置为新铃声的文件的 uri。但是这个uri不能像“/sdcard/media/ringtones/mysong.mp3”这样直接到sdcard。那不行!

您需要的是文件的外部文件 uri,可能类似于 "/external/audio/media/46"

46是MediaStore数据库中列的id,所以需要先将sdcard文件添加到数据库中。

无论如何,mediastore 是如何维护它的 id 的呢?当您多次执行此操作时,此数字可能会变得非常高。

我需要自己删除这一行吗?问题是有时我什至无法控制文件的删除,因为它可以使用文件浏览器直接从 sdcard 中删除。

关于android - 如何通过我的 Activity 在 Android 中设置铃声?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1271777/

相关文章:

android - 如何在android中获取短信铃声

java - 我可以防止我的应用程序不能被其他应用程序杀死吗?

android - 如何将另一个 Activity 作为主 Activity(启动)

android - Android BroadcastReceiver和后台Activity的最佳实践是什么?

java - 在基 Activity 类中初始化公共(public) View

android - 如何在PreferenceFragmentCompat中实现RingtonePreference?

android - 如何在 Android 中将铃声设置为下载的音频?

java - 创建模板布局文件并动态添加值以将其添加到首选项中

android - 多种语言的数据绑定(bind)

android - 关闭服务中的 Activity