使用SharedPreferences保存图片与对象

Posted Wiiix

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用SharedPreferences保存图片与对象相关的知识,希望对你有一定的参考价值。

这是一般SharedPreferences的使用方法
	private SharedPreferences mSharedPreferences;
	private SharedPreferences.Editor editor;       
        mSharedPreferences=getSharedPreferences("ThumbLock", Activity.MODE_PRIVATE);
        editor=mSharedPreferences.edit();       
        String temp = mSharedPreferences.getString("Wallpaper", ""); //读取数据
        editor.putBoolean("isSecured",true); //存储数据
        editor.commit(); //提交保存数据
 
 
1.使用SharedPreferences保存图片与读取的方法
private void saveDrawable(int id)
    
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), id);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.JPEG, 50, baos);
        String imageBase64 = new String(Base64.encodeToString(baos.toByteArray(),Base64.DEFAULT));
        editor.putString("P",imageBase64 );
        editor.commit();
    
    
    private Drawable loadDrawable()
    
        String temp = share.getString("P", "");
        ByteArrayInputStream bais = new ByteArrayInputStream(Base64.decode(temp.getBytes(), Base64.DEFAULT));
        return Drawable.createFromStream(bais, "");
    
SharedPreferences原则上只能将字符串以key-value的形式保存,但是我们可以采用编码的方式将任何二进制数据转化为字符串,从而将可以将二进制数据保存在SharedPreferences文件中,最常用的编码格式是Base64.

2.使用SharedPreferences保存对象的方法
private void saveProduct(Product product)
	
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		try 
			ObjectOutputStream oos = new ObjectOutputStream(baos);
			oos.writeObject(product);
			String temp = new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));
			Log.i("AAA", temp);
			editor.putString("product", temp);
			editor.commit();
		 catch (IOException e) 
			// TODO Auto-generated catch block
			e.printStackTrace();
		
	
	
	private Product getProduct()
	
		String temp = share.getString("product", "");
		ByteArrayInputStream bais =  new ByteArrayInputStream(Base64.decode(temp.getBytes(), Base64.DEFAULT));
		Product product = null;
		try 
			ObjectInputStream ois = new ObjectInputStream(bais);
			product = (Product) ois.readObject();
		 catch (IOException e) 
			// TODO Auto-generated catch block
			Log.i("AAA", e.toString());
		catch(ClassNotFoundException e1)
		
			Log.i("AAA", e1.toString());
		
		return product;
	

由于二进制数据经过编码后可以用SharedPreferences以字符串的形式存储,所以保存对象也称为可能。
对象可以被SharedPreferences存储的前提是该对象被序列化了,也就是说要实现Serializable接口,实际上Serializable接口是个空接口,只是为了标记该对象是被序列化的。
public static class Product implements Serializable
	
		String name;
		String id;
		int count;
		public String getName() 
			return name;
		
		public void setName(String name) 
			this.name = name;
		
		public String getId() 
			return id;
		
		public void setId(String id) 
			this.id = id;
		
		public int getCount() 
			return count;
		
		public void setCount(int count) 
			this.count = count;
		
		
		public String toString()
		
			return "name:"+name+" id:"+id+" count:"+count;
		

	

如果该类是内部类的话要写成static 不然会出现java.io.NotSerializableException异常。

3.SharedPreferences将数据文件保存在指定路径上
private void initSharedPreferences(String path,String name,int mode)
	
		try 
	 		Field field =ContextWrapper.class.getDeclaredField("mBase");
			field.setAccessible(true);
			Object obj = field.get(this);
			field = obj.getClass().getDeclaredField("mPreferencesDir");
			field.setAccessible(true);
			File file = new File(path);
			field.set(obj, file);
			share = getSharedPreferences(name, mode);
			editor = share.edit();
		 catch (Exception e) 
			// TODO: handle exception
			e.printStackTrace();
		
	
使用以上的方法在指定目录下保存数据
initSharedPreferences("/data/fly","config",Activity.MODE_PRIVATE);
		editor.putString("AA", "AAaa");
		editor.commit();
		Toast.makeText(this, share.getString("AA", ""), 1000).show();




 
 
 

以上是关于使用SharedPreferences保存图片与对象的主要内容,如果未能解决你的问题,请参考以下文章

android中想要对文本框中输入的数据进行保存怎么实现

Android数据保存之文件保存

数据本地缓存(不包含图片缓存)

数据本地缓存(不包含图片缓存)

使用 SharedPreferences 保存字节数组

Android使用SharedPreferences保存账号密码