以编程方式设置铃声

时间:2014-08-12 14:06:13

标签: android set ringtone

我知道有几个条目,但它们都不适合我。 我试图给用户一个方法来选择一个铃声并让它由应用程序设置。需要稍后自动存储和设置铃声路径(例如,基于一天中的时间)。所以我不能简单地在内存中重用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(股票,没有根),所以它应该反映某种标准。

0 个答案:

没有答案