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

我想要使​​用sharedpreference在android中保存图像。 我有两个活动类,当我点击第一个活动的button,它会调用第二个活动,第二个活动显示我的首选名称在列表视图中,也重置安卓壁纸的图像,我已经设置为首选壁纸第一次活动。

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

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

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

为什么它不工作?

它不build议存储在共享偏好的图像,你应该存储该图像SD卡。然后将图像path(从SD卡)存储到共享喜好这样 –

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

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

你所要做的就是将你的图像转换成Base64string表示forms:

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

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

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

不过,我必须告诉你, Base64支持最近才被包含在API8中。 要针对较低的API版本,您需要先将其添加。 幸运的是, 这家伙已经有了必要的教程。

另外,我创build了一个快速和肮脏的例子,我发布在github上。

嗨,朋友,我得到了上述问题的解决scheme。在这里我发布我的完整源代码,以便其他人可以使用这个解决scheme。

这是我对这个问题的第二个解决scheme,我已经发布了一个答案,这是同一个问题的不同答案。 如何在Android |共享首选项中保存图像 在Android中与图像共享偏好问题 。

按照以下步骤: –

  1. 声明位图和string为静态

     public static final String PRODUCT_PHOTO = "photo"; public static Bitmap product_image; 
  2. 在onCreate()写一些代码。

     //---------set the image to bitmap product_image= BitmapFactory.decodeResource(getResources(), .drawable.logo); //____________convert image to string String str_bitmap = BitMapToString(product_image); //__________create two method setDefaults() andgetDefaults() setDefaults(PRODUCT_PHOTO, str_bitmap, this) getDefaults(PRODUCT_PHOTO, this); 
    1. 在方法中写下面的代码

    setDefaults();

     public static void setDefaults(String str_key, String value, Context context) { SharedPreferences shre = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor edit=shre.edit(); edit.putString(str_key, value); edit.apply(); } 

3.2.setDefaults();

  public static String getDefaults(String key, Context context) { SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context); return preferences.getString(key, null); } 
  1. BitMapToString();

     public static String BitMapToString(Bitmap bitmap) { ByteArrayOutputStream baos=new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG,100, baos); byte[] arr = baos.toByteArray(); return Base64.encodeToString(arr, Base64.DEFAULT); } 

    现在,如果您想在其他活动中访问此图像文件,请按以下步骤操作。

  2. 声明string为静态

     public static final String PRODUCT_PHOTO = "photo"; String str_bitmap; private Bitmap bitmap; private ImageView imageView_photo; 

    在onCreate()中:

      //--------get image form previous activity,here ProductActivity is my previous activity. str_bitmap =ProductActivity.getDefaults(PRODUCT_PHOTO, this); //-------------- decode the string to the bitmap bitmap=decodeBase64(str_bitmap); //----------- finally set the this image to the Imageview. imageView_photo.setImageBitmap(bitmap); 

对于decodeBase64();

  public static Bitmap decodeBase64(String input) { byte[] decodedByte = Base64.decode(input, 0); return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length); }