如何在我的活动中设置Android铃声?

Vid*_*nes 41 android ringtone android-activity

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

我已经将铃声下载到了bytearray.

Vid*_*nes 69

最后,我设法将默认铃声设置为我下载的铃声.下面不包含下载代码,只是将其设置为默认铃声所需的内容.

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
);  
Run Code Online (Sandbox Code Playgroud)

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

铃声管理器需要一个uri到要设置为新铃声的文件.但是这个uri不能像"/sdcard/media/ringtones/mysong.mp3"那样直接进入SD卡.那不行!

你需要的是文件的外部文件uri,可能是"/ external/audio/media/46"

46是MediaStore数据库中列的id,因此您需要首先将sdcard文件添加到数据库中.

无论如何,mediastore如何维护其ID?这个数字可能会非常高,因为您多次执行此操作.

我需要删除这行吗?问题是,有些时候我甚至无法控制文件的删除,因为它可以使用文件浏览器直接从SD卡中删除.