首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么RingtoneManager.setActualDefaultRingtoneUri不能工作?[android 8]

为什么RingtoneManager.setActualDefaultRingtoneUri不能工作?[android 8]
EN

Stack Overflow用户
提问于 2012-11-12 22:10:36
回答 2查看 7.3K关注 0票数 8

这个问题可能是这个问题的重复,但我看到了代码上的一些不同,所以我提出了一个新的问题。

问题是我不能在RingtonePicker中设置被选中的铃声。我使用支援图书馆AndroidAnnotations,也许它会导致这样的问题(尽管我对此表示怀疑)。

我有碎片,里面有个按钮。单击按钮时会触发RingtonePicker。用户选择铃声,应用程序将其保存在SharedPreference中。下一次当用户打开RingtonePicker时,应该检查先前选择的铃声,而我不能这样做。

这是我的碎片

代码语言:javascript
复制
@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();
            }
        }
    }
}

一句话,问题是-为什么RingtoneManager.setActualDefaultRingtoneUri不在这里工作?

更新:

我的舱单上有WRITE_SETTINGS的许可。

代码语言:javascript
复制
<uses-permission android:name="android.permission.WRITE_SETTINGS" ></uses-permission>
EN

回答 2

Stack Overflow用户

发布于 2013-05-27 17:36:29

好吧,我和你有同样的问题。我假设您要传入的Uri是资产中的文件或存储在首选项文件中的磁盘。在这种假设下工作,问题是您不能将Uri插入RingtoneManager并期望它接受它。文件uri应该来自内容解析器。

如果有人能告诉我确切的原因,我会很高兴的,但我不是专家,所以我现在就接受它。尽管如此,这段代码将允许您接受一个Uri并将其设置为默认的铃声。

代码语言:javascript
复制
    //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
    );
票数 6
EN

Stack Overflow用户

发布于 2012-11-12 23:27:58

您需要指定写入清单文件中的设置的权限。

代码语言:javascript
复制
<uses-permission android:name="android.permission.WRITE_SETTINGS" ></uses-permission>

还发布您的logcat输出。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13352416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档