【发布时间】:2020-07-18 12:06:37
【问题描述】:
我希望我的应用设置铃声。用户在使用系统选择器之前从现有的库条目中选择了一个,并获得了额外的返回: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;
}
【问题讨论】: