java.lang.RuntimeException:writeValueXml:无法写入值

java.lang.RuntimeException:writeValueXml:无法写入值,java,android,Java,Android,我正在尝试成功地存储和检索URI的arraylist。我不完全确定将“存储”部分放在哪里,但将其置于暂停状态是有意义的。但当我尝试退出活动时,我的应用程序崩溃。当我最初尝试将它放在桌面上时,我遇到了一个类似的错误。请帮助我知道我做错了什么 FATAL EXCEPTION: main Process: my.package.myapplication, PID: 9357 java.lang.RuntimeException: Unable to pause activity {my.

我正在尝试成功地存储和检索URI的arraylist。我不完全确定将“存储”部分放在哪里,但将其置于暂停状态是有意义的。但当我尝试退出活动时,我的应用程序崩溃。当我最初尝试将它放在桌面上时,我遇到了一个类似的错误。请帮助我知道我做错了什么

FATAL EXCEPTION: main


Process: my.package.myapplication, PID: 9357
    java.lang.RuntimeException: Unable to pause activity {my.package.myapplication/my.package.myapplication.Person1Screen}: java.lang.RuntimeException: writeValueXml: unable to write value content://com.android.providers.media.documents/document/image%3A49684
        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3395)
        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3354)
        at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3329)
        at android.app.ActivityThread.access$1100(ActivityThread.java:157)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362)
        at android.os.Handler.dispatchMessage(Handler.java:102)
        at android.os.Looper.loop(Looper.java:148)
        at android.app.ActivityThread.main(ActivityThread.java:5477)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.RuntimeException: writeValueXml: unable to write value content://com.android.providers.media.documents/document/image%3A49684
        at com.android.internal.util.XmlUtils.writeValueXml(XmlUtils.java:710)
        at com.android.internal.util.XmlUtils.writeValueXml(XmlUtils.java:620)
        at com.android.internal.util.XmlUtils.writeSetXml(XmlUtils.java:356)
        at com.android.internal.util.XmlUtils.writeValueXml(XmlUtils.java:693)
        at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:300)
        at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:269)
        at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:235)
        at com.android.internal.util.XmlUtils.writeMapXml(XmlUtils.java:192)
        at android.app.SharedPreferencesImpl.writeToFile(SharedPreferencesImpl.java:600)
        at android.app.SharedPreferencesImpl.access$800(SharedPreferencesImpl.java:52)
        at android.app.SharedPreferencesImpl$2.run(SharedPreferencesImpl.java:515)
        at android.app.SharedPreferencesImpl.enqueueDiskWrite(SharedPreferencesImpl.java:536)
        at android.app.SharedPreferencesImpl.access$100(SharedPreferencesImpl.java:52)
        at android.app.SharedPreferencesImpl$EditorImpl.commit(SharedPreferencesImpl.java:458)
        at my.package.myapplication.Person1Screen.onPause(Person1Screen.java:257)
        at android.app.Activity.performPause(Activity.java:6557)
        at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1312)
        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3381)
        at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3354) 
        at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3329) 
        at android.app.ActivityThread.access$1100(ActivityThread.java:157) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1362) 
        at android.os.Handler.dispatchMessage(Handler.java:102) 
        at android.os.Looper.loop(Looper.java:148) 
        at android.app.ActivityThread.main(ActivityThread.java:5477) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
我的onPause方法如下。java:257是末尾的editor.commit行

@Override
protected void onPause(){
    super.onPause();
    // We need an Editor object to make preference changes.
    // All objects are from android.context.Context
    SharedPreferences settings = getSharedPreferences(PREF_FILE, 0);
    SharedPreferences.Editor editor = settings.edit();
    Set<String> tempSet = new HashSet(happyList);
    editor.putStringSet(HAPPY_LIST, tempSet);
    editor.commit();
}
@覆盖
受保护的void onPause(){
super.onPause();
//我们需要一个编辑器对象来更改首选项。
//所有对象都来自android.context.context
SharedReferences设置=GetSharedReferences(首选文件,0);
SharedReferences.Editor=settings.edit();
Set tempSet=newhashset(happyList);
编辑器.putStringSet(快乐列表,tempSet);
commit();
}
我在onCreate中的检索(如果有帮助):

//还原首选项
SharedReferences设置=GetSharedReferences(PREF_文件,Context.MODE_PRIVATE);
Set tempSet=settings.getStringSet(快乐列表,null);
if(tempSet!=null)
for(字符串str:tempSet)
happyList.add(Uri.parse(str));

“happyList”的类型为
ArrayList

看起来您正在执行从
HashSet
Set
的未经检查的泛型赋值,其中集合实际上包含
Uri
对象。当您尝试将此集合写入首选项时,代码尝试读取
字符串
,但实际上获取了一个
Uri
对象,从而导致崩溃。要解决这个问题,您应该将
Uri
对象转换回
String
s

因此,替换这一行:

Set tempSet=新哈希集(happyList)

与:

Set tempSet=newhashset();
for(Uri:happyList){
add(uri.toString());
}

我刚在你发帖子之前就知道了。完全按照你写的那样做,没有崩溃。
// Restore preferences
    SharedPreferences settings = getSharedPreferences(PREF_FILE, Context.MODE_PRIVATE);
    Set<String> tempSet = settings.getStringSet(HAPPY_LIST, null);
    if(tempSet != null)
        for (String str : tempSet)
            happyList.add(Uri.parse(str));
Set<String> tempSet = new HashSet<String>();
for (Uri uri : happyList) {
    tempSet.add(uri.toString());
}