我知道有几个条目,但它们都不适合我。 我试图给用户一个方法来选择一个铃声并让它由应用程序设置。需要稍后自动存储和设置铃声路径(例如,基于一天中的时间)。所以我不能简单地在内存中重用Uri变量。
到目前为止,我通过铃声选择器执行此操作:
Intent fileSelectionIntent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
startActivityForResult(fileSelectionIntent, 9001);
无论如何,onActivityResult()会得到一个如下所示的额外内容:
/content:/media/internal/audio/media/55
以下是实际尝试设置铃声的功能:
private boolean applyRingTone(File ringtone, int ringtoneType, Context context)
{
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, ringtone.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, "ring");
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
values.put(MediaStore.MediaColumns.SIZE, ringtone.length());
values.put(MediaStore.Audio.Media.ARTIST, R.string.app_name);
values.put(MediaStore.Audio.Media.IS_RINGTONE, ringtoneType == RingtoneManager.TYPE_RINGTONE);
values.put(MediaStore.Audio.Media.IS_NOTIFICATION, ringtoneType == RingtoneManager.TYPE_NOTIFICATION);
values.put(MediaStore.Audio.Media.IS_ALARM, false);
values.put(MediaStore.Audio.Media.IS_MUSIC, false);
Uri ur = MediaStore.Audio.Media.getContentUriForPath(ringtone.getAbsolutePath());
context.getContentResolver().delete(ur, MediaStore.MediaColumns.DATA + "=\"" + ringtone.getAbsolutePath() + "\"", null); // without this uri in the next line will be null
Uri uri = context.getContentResolver().insert(ur, values);
try
{
RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, uri);
}
[...]
}
如果我忽略了所有的ContentValues并尝试使用ur而不是uri我在调试器中注意到它的值是相同的,但文件名被省略,所以只是文件夹。
如果我在源代码中使用uri,那么uri最后会有另一个数字,但基本上与上面的相同(55)。我认为自从文件被删除并重新读入库以来就没问题了。但这真的有必要吗?我不能以其他方式获得身份证明吗?
在此功能之后,铃声将被设置为看似不在RingtoneManager的领域内的东西。如果我使用手机的音频设置,它就会被设置为一些后备声音,这些声音不在可以选择的声音列表中,与我选择的声音无关。
有人知道我能做什么吗?我的手机是三星Galaxy S3(股票,没有根),所以它应该反映某种标准。