为什么RingtoneManager.setActualDefaultRingtoneUri不能工作? [机器人API-8] [英] Why RingtoneManager.setActualDefaultRingtoneUri could not work? [android API-8]

查看:2243
本文介绍了为什么RingtoneManager.setActualDefaultRingtoneUri不能工作? [机器人API-8]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

此问题可能是重复的这个问题,但我看到了$ C $有些区别C,所以我把一个新的问题。

问题是,我无法设置拾取的铃声在RingtonePicker。我使用支持库和的 AndroidAnnotations 的,也许它会导致这样的问题(尽管我对此表示怀疑)。

我有碎片在它的按钮。当按钮单击RingtonePicker被激活。用户选择的铃声和应用程序保存在共享preference。当用户打开RingtonePicker,previously选择铃声下次需要检查,我不能这样做。

下面是我的片段

  @EFragment(R.layout。pref_page)
公共类prefPage延伸片段{

    @ preF
    我的prefs_我的preFS;

    @单击(R.id.ringtone_button)
    公共无效的onClick(){
        意向意图=新的意图(RingtoneManager.ACTION_RINGTONE_PICKER);
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,
                RingtoneManager.TYPE_NOTIFICATION);

        字符串URI =我的prefs.beepUri()得到()。

        如果(URI!=){
                    Log.i(日志,URI是+ URI);
                    RingtoneManager.setActualDefaultRingtoneUri(
                            getActivity(),
                            RingtoneManager.TYPE_NOTIFICATION,
                            Uri.parse(URI));
        }

        startActivityForResult(意向,1);
    }

    @覆盖
    公共无效onActivityResult(INT申请code,INT结果code,意图数据){
        如果(结果code == -1){
            开放的我们的uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
            如果(URI!= NULL){
                串uriString中= uri.toString();
                Log.i(日志,uriString中的+ uriString中);
                。我的prefs.edit()beepUri()把(uriString中)。适用();
            }
        }
    }
}
 

在两个词的问题是 - 为什么RingtoneManager.setActualDefaultRingtoneUri不能在这里工作

更新:

我在我的清单WRITE_SETTINGS许可。

 <使用-权限的Andr​​oid:名称=android.permission.WRITE_SETTINGS>< /使用-许可>
 

解决方案

好了,所以我有同样的问题,因为你。我假设你正在传递的URI是在你的资产或从你存储在preference文件的磁盘上的文件。这个假设下工作,问题是,你不能推一个URI到RingtoneManager并期望它采取它。该文件URI应该从内容解析到来。

我喜欢它,如果有人能告诉我这是为什么完全,但我不是专家,所以我接受它是现在。话虽这么说,这code可以让你把一个开放的,并将其设置为默认铃声。

  //我们得到的开放的我们这里来回回马文件的绝对路径。
    乌里ringtoneUri = Uri.parse(file.getAbsolutePath());

    //现在,我们创建一个新的内容的值对象来存储所有信息
    //关于铃声。
    ContentValues​​值=新ContentValues​​();
    values​​.put(MediaStore.MediaColumns.DATA,chosenFile.getAbsolutePath());
    values​​.put(MediaStore.MediaColumns.TITLE,chosenFile.getName());
    values​​.put(MediaStore.MediaColumns.SIZE,chosenFile.length());
    values​​.put(MediaStore.MediaColumns.MIME_TYPE,音频/ MP3);
    values​​.put(AudioColumns.ARTIST,context.getString(R.string.app_name));
    values​​.put(AudioColumns.IS_RINGTONE,真正的);
    values​​.put(AudioColumns.IS_NOTIFICATION,假);
    values​​.put(AudioColumns.IS_ALARM,假);
    values​​.put(AudioColumns.IS_MUSIC,假);

    //与现在的内容解析工作
    //首先让我们可能添加的文件previously并将其删除,
    //否则,我们将填补铃声经理随着时间的推移一堆副本。
    开放的我们的uri = MediaStore.Audio.Media.getContentUriForPath(chosenFile.getAbsolutePath());
    。context.getContentResolver()删除(URI,MediaStore.MediaColumns.DATA += \+ chosenFile.getAbsolutePath()+\,NULL);

    // OK立即将其插入
    乌里newUri = context.getContentResolver()插入(URI,值)。

    // OK现在设置从内容管理器的URL,而不是文件的URI的铃声
    RingtoneManager.setActualDefaultRingtoneUri(
      的背景下,
      RingtoneManager.TYPE_RINGTONE,
      newUri
    );
 

This question could be duplicate of this question but I see some difference in code, so I put a new question.

Problem is that I cannot set picked ringtone in RingtonePicker. I use Support Library and AndroidAnnotations, maybe it can cause such problems (though I doubt it).

I have Fragment with a button in it. When clicking on button a RingtonePicker is fired. User select ringtone and application saves it in SharedPreference. Next time when user open RingtonePicker, previously selected ringtone should be checked, and I can't do that.

Here is my Fragment

@EFragment(R.layout.pref_page)
public class PrefPage extends Fragment {

    @Pref
    MyPrefs_ myPrefs;

    @Click(R.id.ringtone_button)
    public void onClick() {
        Intent intent = new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
        intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE,
                RingtoneManager.TYPE_NOTIFICATION);

        String uri = myPrefs.beepUri().get();    

        if (uri != "") {      
                    Log.i("Log", "uri is " + uri);              
                    RingtoneManager.setActualDefaultRingtoneUri(
                            getActivity(),
                            RingtoneManager.TYPE_NOTIFICATION,
                            Uri.parse(uri));
        }

        startActivityForResult(intent, 1);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == -1) {
            Uri uri = data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
            if (uri != null) {
                String uriString = uri.toString();
                Log.i("Log", "uriString is " + uriString);
                myPrefs.edit().beepUri().put(uriString).apply();
            }
        }
    }
}

In two words question is - why RingtoneManager.setActualDefaultRingtoneUri is not working here?

UPDATED:

I have WRITE_SETTINGS permission in my manifest.

<uses-permission android:name="android.permission.WRITE_SETTINGS" ></uses-permission>

解决方案

Ok so I had the same issue as you. I am assuming that the Uri you are passing in is a file in your assets or from the disk that you are storing in a preference file. Working under this assumption, the issue is that you can't shove a Uri into the RingtoneManager and expect it to take it. The file uri should be coming from the content resolver.

I would love it if someone could tell me why that is exactly, but I'm not an expert so I'm accepting it as is for now. That being said, this code will let you take a Uri and set it as the default ringtone.

    //We get the Uri here fro ma file's absolute path.
    Uri ringtoneUri = Uri.parse(file.getAbsolutePath());

    //We now create a new content values object to store all the information 
    //about the ringtone.
    ContentValues values = new ContentValues();
    values.put(MediaStore.MediaColumns.DATA, chosenFile.getAbsolutePath());
    values.put(MediaStore.MediaColumns.TITLE, chosenFile.getName());
    values.put(MediaStore.MediaColumns.SIZE, chosenFile.length());
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");
    values.put(AudioColumns.ARTIST, context.getString(R.string.app_name));
    values.put(AudioColumns.IS_RINGTONE, true);
    values.put(AudioColumns.IS_NOTIFICATION, false);
    values.put(AudioColumns.IS_ALARM, false);
    values.put(AudioColumns.IS_MUSIC, false);

    //Work with the content resolver now
    //First get the file we may have added previously and delete it, 
    //otherwise we will fill up the ringtone manager with a bunch of copies over time.
    Uri uri = MediaStore.Audio.Media.getContentUriForPath(chosenFile.getAbsolutePath());
    context.getContentResolver().delete(uri, MediaStore.MediaColumns.DATA + "=\"" + chosenFile.getAbsolutePath() + "\"", null);

    //Ok now insert it
    Uri newUri = context.getContentResolver().insert(uri, values);

    //Ok now set the ringtone from the content manager's uri, NOT the file's uri
    RingtoneManager.setActualDefaultRingtoneUri(
      context,
      RingtoneManager.TYPE_RINGTONE,
      newUri
    );

这篇关于为什么RingtoneManager.setActualDefaultRingtoneUri不能工作? [机器人API-8]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆