如何在android中使用sharedpreference存储图像?

Lax*_*iya 31 android

我想使用sharedpreference在android中保存图像.我有两个活动类,当我点击第一个活动的按钮时,它将调用第二个活动,第二个活动在列表视图中显示我的首选名称,并且还将android壁纸重置为我已设置为首选壁纸的图像.第一次活动.

对于第二个活动,代码是:

public class PreferencesActivityTest extends PreferenceActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);


            SharedPreferences myPrefs = this.getSharedPreferences("myPrefs", MODE_WORLD_READABLE);
            String prefName = myPrefs.getString("PREF_USERNAME", "nothing");
            String wallPaper = myPrefs.getString("PREFS_NAME", null);


            if(wallPaper != null) {

                try {

                      Bitmap bm = BitmapFactory.decodeFile("/data/misc/wallpaper/"+wallPaper);
                      Log.d(getClass().getSimpleName(),"Wallpaper name is: "+ wallPaper);
                      setWallpaper(bm);
                      Toast.makeText(this, "Wall paper has been changed." +
                                  "You may go to the home screen to view the same", Toast.LENGTH_LONG).show();
                } 

                catch (FileNotFoundException fe){
                      Log.e(getClass().getSimpleName(),"File not found");
                } catch (IOException ie) {
                      Log.e(getClass().getSimpleName()," IO Exception");
                }

    }


        ArrayList<String> results = new ArrayList<String>();
        results.add("Your Preferred name is: " + prefName);
      this.setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,results));
    }
Run Code Online (Sandbox Code Playgroud)

第一个活动调用第二个活动,但它没有调用 if(wallPaper != null){}

为什么不工作?

ari*_*ayu 75

您所要做的就是将图像转换为Base64字符串表示形式:

Bitmap realImage = BitmapFactory.decodeStream(stream);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
realImage.compress(Bitmap.CompressFormat.JPEG, 100, baos);   
byte[] b = baos.toByteArray(); 

String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
textEncode.setText(encodedImage);

SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this);
Editor edit=shre.edit();
edit.putString("image_data",encodedImage);
edit.commit();
Run Code Online (Sandbox Code Playgroud)

然后,在检索时,将其转换回位图:

SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this);
String previouslyEncodedImage = shre.getString("image_data", "");

if( !previouslyEncodedImage.equalsIgnoreCase("") ){
    byte[] b = Base64.decode(previouslyEncodedImage, Base64.DEFAULT);
    Bitmap bitmap = BitmapFactory.decodeByteArray(b, 0, b.length);
    imageConvertResult.setImageBitmap(bitmap);
}
Run Code Online (Sandbox Code Playgroud)

但是,我必须告诉您,最近只在API8中包含了Base64支持.要以较低的API版本为目标,您需要先添加它.幸运的是,这家伙已经有了所需的教程.

此外,我已经创建了我在github上发布的快速而又脏的示例.

  • 很好的努力,但这个帖子有点误导.虽然这是OP似乎要求的,但在SharedPreferences中存储大量数据并不是它们的设计目标,应该更清楚.虽然确实[可以在其中存储相当大量的数据] [http://stackoverflow.com/questions/6326171/is-using-android-shared-preferences-for-storing-large-amounts- (数据一个好的),文档声明你应该'使用原始数据的共享首选项'.可以在[此处](http://developer.android.com/guide/topics/data/data-storage.html)找到一个很好的概述. (8认同)
  • @MartinFoot,在回答这个问题之前,我完全清楚这一点. (2认同)

Tof*_*mad 29

不建议将图像存储在共享首选项中并且您应该将该图像存储到sdcard.And然后将图像路径(从SD卡)存储到共享首选项中,如下所示 -

    SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(this);
    Editor edit=shre.edit();
    edit.putString("imagepath","/sdcard/imh.jpeg");
    edit.commit();
Run Code Online (Sandbox Code Playgroud)

然后使用此路径从SD卡中获取图像

  • 其非常复杂的程序和共享仅用于存储少量数据,如用户名和密码 (6认同)
  • @Sameer密码正是你不应该存储的密码 (6认同)
  • 使用图像的base64字符串表示是可能的. (3认同)