通过contentprovider设置铃声/通知音(来自资产)

时间:2017-07-26 11:00:06

标签: android notifications ringtone

我正在尝试通过我的资源文件夹中的内容提供商设置Android默认铃声或通知音。 令人惊讶的是,它的工作原理是这样的,但是合法的吗?

Uri audiouri = Uri.parse("content://"+BuildConfig.APPLICATION_ID+"/"+soundname+".mp3");
RingtoneManager.setActualDefaultRingtoneUri(a, TYPE_NOTIFICATION, audiouri );

不幸的是,Android设置中未显示声音名称。 enter image description here

奇怪的是,当我转到'其他声音'时,声音名称实际显示 enter image description here

我也试过这个:

Uri audiouri = Uri.parse("content://"+BuildConfig.APPLICATION_ID+"/"+soundname+".mp3");
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.TITLE, soundname);
Uri ringtoneuri = a.getContentResolver().insert(audiouri, contentValues);
RingtoneManager.setActualDefaultRingtoneUri(a, TYPE_NOTIFICATION, ringtoneuri);

导致声音为空(未设置声音)

我试过的第三个选项是:

Uri audiouri = MediaStore.Audio.Media.getContentUriForPath("content://"+BuildConfig.APPLICATION_ID+"/"+soundname+".mp3");
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DATA, "content://"+BuildConfig.APPLICATION_ID+"/"+soundname+".mp3");
contentValues.put(MediaStore.MediaColumns.TITLE, soundname);
Uri ringtoneuri = a.getContentResolver().insert(audiouri, contentValues);
RingtoneManager.setActualDefaultRingtoneUri(a, TYPE_NOTIFICATION, ringtoneuri);

现在声音名称显示正确,但实际上没有声音播放。 我在logcat上遇到错误:

  

java.io.FileNotFoundException:无法访问/content:/com.mydomain.myapp/test.mp3

所以它似乎从MediaColumns.DATA中获取了不支持内容提供程序路径但只支持实际路径的值。正确?

enter image description here

最后一个问题:如何在android设置中设置音调和名称?最好不要将文件复制到外部存储器。

1 个答案:

答案 0 :(得分:0)

所以,不幸的是我没有找到如何将资产直接设置为铃声, 但这是一个很好的解决方法:

将资产复制到内部应用程序存储或缓存目录时(无需权限!)我可以设置没有WRITE_EXTERNAL_STORAGE权限的铃声。

static void settone(int type, Sound sound, Activity a)
{
    lastsound = sound; //global remember sound and type (alarm/ringtone/notification) 
    lasttype = type;   // if we have to get permissions first, then call this from onActivityResult
    if (canwritesystem(a))
    {
        RingtoneManager.setActualDefaultRingtoneUri(a, type, getringtoneuri(sound, a));
        Toast.makeText(a, a.getString(R.string.settonesuccess), Toast.LENGTH_LONG).show();
    }
    else a.startActivityForResult(new Intent(Settings.ACTION_MANAGE_WRITE_SETTINGS).setData(Uri.parse("package:" + a.getPackageName())),CONTEXT_SET_TONE);
}

static Uri getringtoneuri(Sound sound, Activity a)
{
    File tonefile = new File(sound.getpath); // path could be like: /Android/data/com.company.yourapp
    ContentValues contentValues = new ContentValues();
    contentValues.put(MediaStore.MediaColumns.DATA, tonefile.getAbsolutePath());
    contentValues.put(MediaStore.MediaColumns.TITLE, sound.getDisplayName());
    contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
    contentValues.put(MediaStore.MediaColumns.SIZE, tonefile.length());
    contentValues.put(MediaStore.Audio.Media.IS_RINGTONE, true);
    contentValues.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
    contentValues.put(MediaStore.Audio.Media.IS_ALARM, true);
    contentValues.put(MediaStore.Audio.Media.IS_MUSIC, false);
    Uri generalaudiouri = MediaStore.Audio.Media.INTERNAL_CONTENT_URI;
    a.getContentResolver().delete(generalaudiouri, MediaStore.MediaColumns.DATA + "='" + tonefile.getAbsolutePath() + "'", null);
    return a.getContentResolver().insert(generalaudiouri, contentValues);
}