[英]Android set rintone to one existing in library
我希望我的应用设置铃声。 用户在使用系统选择器之前从现有的库条目中选择了一个,并获得了额外的返回:RingtoneManager.EXTRA_RINGTONE_PICKED_URI
在此示例中,我从默认铃声中选择了“Andromeda”并获得以下路径:content://media/internal/audio/media/103
当我尝试在给定时间设置它时,我运行以下代码:
Uri ur = Uri.parse(ringtoneFile.getAbsolutePath()); RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, uri);
我也试过这个版本:
Uri ur = Uri.parse(ringtoneFile.getAbsolutePath()); android.provider.Settings.System.putString(context.getContentResolver(), android.provider.Settings.System.RINGTONE, uri.toString());
两者都不起作用。 系统的声音设置将如下所示:
只显示了 103 个,而不是我期望的“仙女座”。 当我调用模拟器时,它只会发出叮当声,因此它可能无法播放所需的文件并使用一些备用文件。
这里有很多示例,人们从文件系统中选择自定义文件并使用“ContentValues”将其重新添加到库中。 但我不想自己添加任何东西,我只想从默认铃声中设置一个。
作为替代方案,我也尝试过编码。 它确实向库中添加了一个附加条目。 不幸的是,旧的没有被删除,而是堆积起来。 调用模拟器时,我也得到相同的叮当声,而不是我选择的那个。
private boolean applyRingTone(File ringtoneFile, int ringtoneType, Context context)
{
Miscellaneous.logEvent("i", "Profile", "Request to set ringtone to " + ringtoneFile.getAbsolutePath(), 3);
ContentValues values = new ContentValues();
values.put(MediaStore.MediaColumns.DATA, ringtoneFile.getAbsolutePath());
values.put(MediaStore.MediaColumns.TITLE, context.getResources().getString(R.string.app_name) + " ringtone");
values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/*");
values.put(MediaStore.MediaColumns.SIZE, ringtoneFile.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(ringtoneFile.getAbsolutePath());
context.getContentResolver().delete(ur, MediaStore.MediaColumns.DATA + "=\"" + ringtoneFile.getAbsolutePath() + "\"", null);
Uri uri = context.getContentResolver().insert(ur, values);
try
{
RingtoneManager.setActualDefaultRingtoneUri(context, ringtoneType, uri);
Miscellaneous.logEvent("i", "Profile", "Ringtone set to: " + uri.toString(), 1);
return true;
}
catch (Throwable t)
{
String message = "Error setting ringtone: " + Log.getStackTraceString(t);
Miscellaneous.logEvent("e", "Profile", message, 1);
}
return false;
}
我还没有完全解决我的问题,但至少发现了罪魁祸首。
将文件设置为铃声的方法确实有效。 但是源文件的路径不正确。 这很奇怪,因为它是通过使用文件选择器确定的:
Intent fileIntent = new Intent(Intent.ACTION_GET_CONTENT);
fileIntent.setType("audio/*");
startActivityForResult(Intent.createChooser(fileIntent, "Select a ringtone"), intentCodeRingtonePickerCallsFile);
这将作为路径返回:
content://com.android.externalstorage.documents/document/primary%3AMusic%2Fmusicfile.mp3
将其转换为文件 object 后,它将变为
/document/primary%3AMusic%2F04.%20Elevator%20Girl.mp3
当只是将路径硬编码到源代码中时(以常规 Linux 用户认为它需要的格式),它实际上很简单:
/sdcard/Music/musicfile.mp3
这完美无瑕。 我必须弄清楚如何正确确定路径,但是将文件设置为铃声的方法是可行的。
更新:我对我的路径问题有一个答案: Get Real Path For Uri Android
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.