如何保存和获取存储在共享首选项中的包名称?

Posted

技术标签:

【中文标题】如何保存和获取存储在共享首选项中的包名称?【英文标题】:How can i save and get the package names stored in shared preference? 【发布时间】:2020-01-12 23:52:14 【问题描述】:

我有已安装应用程序的列表,当我单击其中任何一个时,我可以获得单击的应用程序的包名称,现在我想将单击的包名称保存在字符串的 ArrayList 中,使用 Gson 到 SharedPreferences。并获取保存的包名。

我检查了一些以前的答案,但没有得到我想要的解决方案。

这是我要保存被点击应用的包名的代码。

   String ApplicationPackageName =  adapter.stringList.get(position);
        SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        Gson gson = new Gson();
        String json = gson.toJson(ApplicationPackageName);
        editor.putString("task list", json);
        editor.apply();

这是我要获取保存的包名称的代码。

   SharedPreferences sharedPreferences = getSharedPreferences("shared preferences", MODE_PRIVATE);
       Gson gson = new Gson();
       String json = sharedPreferences.getString("task list", null);
       Type type = new TypeToken<ArrayList<String>>() .getType();
       arrayList = gson.fromJson(json, type);

       if (arrayList == null) 
           arrayList = new ArrayList<>();
       

但是我收到了这个错误。 Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was STRING at line 1 column 2 path $

有什么帮助吗?

【问题讨论】:

它会在哪一行崩溃? 参考此链接***.com/questions/7057845/… @just_user 这一行崩溃了`arrayList = gson.fromJson(json, type);` 我想我刚刚看到了问题:String ApplicationPackageName = adapter.stringList.get(position); 这已经是一个字符串了。因此,您在 sharedpreferences 中存储的不是 json 数组。在String json = sharedPreferences.getString("task list", null);这一行放一个断点或一条日志消息,看看你得到的值。 @just_user 我得到了这个“任务列表”。我怎样才能得到包名呢? 【参考方案1】:

在您的构建中,请添加 gradle

实现'com.google.code.gson:gson:2.8.5'

那么请检查下面的代码。

 package testproject.etisatlat.com.test;

    import android.app.Activity;
    import android.content.SharedPreferences;
    import android.os.Bundle;
    import android.preference.PreferenceManager;
    import android.support.design.widget.FloatingActionButton;
    import android.support.design.widget.Snackbar;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentTransaction;
    import android.support.v7.app.AppCompatActivity;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.support.v7.widget.Toolbar;
    import android.util.Log;
    import android.view.View;
    import android.view.Menu;
    import android.view.MenuItem;

    import com.google.gson.Gson;
    import com.google.gson.reflect.TypeToken;

    import java.lang.reflect.Type;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Locale;

    public class MainActivity extends AppCompatActivity 
    RecyclerView recyclerView;
        @Override
        protected void onCreate(Bundle savedInstanceState) 
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Toolbar toolbar = findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            List<String> test=new ArrayList<>();
            test.add("a");
            test.add("b");
            test.add("c");
            savePackages(test,"SAVE_LIST");
            List<String> savedList=getPackagesList("SAVE_LIST");
        

        public void savePackages(List<String> packagesList, String key)
            SharedPreferences SharedPreferences= getSharedPreferences("APP_SHARED_PREFS", Activity.MODE_PRIVATE);

            SharedPreferences.Editor editor = SharedPreferences.edit();
            Gson gson = new Gson();
            String json = gson.toJson(packagesList);
            editor.putString(key, json);
            editor.apply();

        

        public List<String> getPackagesList(String key)
            SharedPreferences SharedPreferences= getSharedPreferences("APP_SHARED_PREFS", Activity.MODE_PRIVATE);
            Gson gson = new Gson();
            String json = SharedPreferences.getString(key, null);
            Type type = new TypeToken<ArrayList<String>>() .getType();
            return gson.fromJson(json, type);
        
    

【讨论】:

'getDefaultSharedPreferences(android.content.Context)' 已弃用 嘿,@ismail 请再次检查我的答案。 谢谢兄弟,在 logcat 中显示数据已保存,但在共享 pref.xml 中我看不到保存的数据,第二个方法()在最后一行之前显示错误。 hey@ismail 请再次检查我的答案 我分享了完整代码。

以上是关于如何保存和获取存储在共享首选项中的包名称?的主要内容,如果未能解决你的问题,请参考以下文章

在共享首选项中获取文件大小

如何将对象列表中的布尔收藏夹保存到 Flutter 中的共享首选项

Android - 保存自定义对象 - 共享首选项或数据库?

如何在首选项中存储图像资源/名称

如何将文件共享首选项值保存到firebase并检索它

如何在不使用共享首选项的情况下将数据存储为颤动的对象[关闭]