【问题标题】:Set ringtone / notification tone via contentprovider (from assets)通过 contentprovider 设置铃声/通知音(来自资产)
【发布时间】:2017-08-03 19:39:29
【问题描述】:

我正在尝试通过我的资产文件夹中的内容提供商设置 android 默认铃声或通知铃声。 令人惊讶的是,它是这样工作的,但是这是一种合法的方式吗?

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

很遗憾,声音名称未显示在 Android 设置中。

奇怪的是,当我转到“其他声音”时,实际显示的是声音名称

我也试过这个:

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 中获取值。对吧?

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

【问题讨论】:

    标签: android notifications ringtone


    【解决方案1】:

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

    将资产复制到内部应用存储或缓存目录(无需权限!)我可以在没有 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      • 2014-01-20
      • 2011-03-03
      • 2021-03-02
      • 2011-04-24
      • 1970-01-01
      相关资源
      最近更新 更多