Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 为什么RingtoneManager.setActualDefaultRingtoneUri无法工作?[安卓API-8]_Android_Ringtone - Fatal编程技术网

Android 为什么RingtoneManager.setActualDefaultRingtoneUri无法工作?[安卓API-8]

Android 为什么RingtoneManager.setActualDefaultRingtoneUri无法工作?[安卓API-8],android,ringtone,Android,Ringtone,这个问题可能是重复的,但我看到代码中有些不同,所以我提出了一个新问题 问题是我不能在RingtonePicker中设置拾取的铃声。我使用,也许它会导致这样的问题(尽管我怀疑) 我有一个带按钮的碎片。单击按钮时,会触发铃声接收器。用户选择铃声,应用程序将其保存在SharedReference中。下次当用户打开RingtonePicker时,应该检查以前选择的铃声,我不能这样做 这是我的片段 @EFragment(R.layout.pref_page) public class PrefPage e

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

问题是我不能在RingtonePicker中设置拾取的铃声。我使用,也许它会导致这样的问题(尽管我怀疑)

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

这是我的片段

@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不在这里工作?

更新:

我在清单中有写入设置权限

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

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

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


同时发布您的logcat输出。

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

如果有人能告诉我这到底是为什么,我会很高兴,但我不是专家,所以我现在接受它。也就是说,这段代码将允许您获取Uri并将其设置为默认铃声

    //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
    );

对不起,忘了在舱单上提到我有这个权限。LogCat没有澄清任何事情,因为我的应用程序在启动RingtonePicker时没有崩溃,它只是没有从列表中选择我想要的铃声。当你想为特定联系人分配铃声时,为什么不需要此权限,android.permission.WRITE_设置?这个问题现在有点老了,但是,如果你从来没有解决过这个问题,我现在有一点设置铃声的经验。如果你想发布你的错误,或者如果你能描述一下为什么它不起作用,我很乐意提供帮助。否则,我很想看到这个问题的答案。@Paradopolis不,我没有任何错误。如果没有人知道为什么这个方法不能工作,那么我希望有一些工作代码。@vitalikorsakov:也许它需要
。有关更多信息,请参阅。您是在根设备、非根设备或模拟器上测试代码吗?//否则,随着时间的推移,我们将在铃声管理器中填充大量副本,这对我有很大帮助。