93 Android SharedPreferences 保存图片/对象

本文将指导你如何在Android中使用SharedPreferences存储图片和自定义对象,通过序列化和反序列化实现数据持久化,解决本地数据保存问题。

创建类

package com.example.sharepreference;

import java.io.Serializable;

import android.R.string;

public class Product implements Serializable{

	public String name;
	public int price;

}

package com.example.sharepreference;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import android.R.string;
import android.os.Bundle;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.util.Base64;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

	private Button button1;
	private Button button2;
	private Button button3;
	private Button button4;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		button1=(Button)findViewById(R.id.button1);
		button2=(Button)findViewById(R.id.button2);
		button3=(Button)findViewById(R.id.button3);
		button4=(Button)findViewById(R.id.button4);
		
		button1.setOnClickListener(this);
		button2.setOnClickListener(this);
		button3.setOnClickListener(this);
		button4.setOnClickListener(this);
		
		
		//获取 SharedPreferences 对象
		SharedPreferences sharedPreferences=getSharedPreferences("test", Activity.MODE_PRIVATE);
		
		//获取SharedPreferences.Editor 对象
		SharedPreferences.Editor editor=sharedPreferences.edit();
		editor.putString("name", "Tom");
		editor.putString("address", "BeiJing");
		//执行 将数据保存在文件中
		editor.commit();
		
		//获取数据
		String name=sharedPreferences.getString("name", "");
		String address=sharedPreferences.getString("address", "");
		System.out.println("name:"+name+",address:"+address);
		
		//数据的存储位置和格式
		/**
		 * SharedPreferences 将数据文件写在手机内存ROM私有的目录中,在模拟器中测试程序
		 * 通过DDMS透视图来查看数据文件的位置。打开DDMS透视图,进入“File Explorer”视图,
		 * 找到data/data目录 ... 在shared——prefs下
		 * 
		 */
		
		
		
		
		
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	/**
	 * 保存图片
	 */
	private void saveImage()
	{
		/**
		 * SharedPreferences 存取更复杂的数据类型(对象、图片等)就需要对这些数据记性编码。通常将复杂类型的数据转换
		 * 成Base64格式的编码,然后将转换后的数据义字符串的形式保存在xml文件中。
		 */
		try {
			SharedPreferences mySharedPreferences=getSharedPreferences("base64", Activity.MODE_PRIVATE);
			Editor editor1=mySharedPreferences.edit();
			ByteArrayOutputStream baos=new ByteArrayOutputStream();
			//读取和压缩qq.png,并将其压缩结果保存在ByteArrayOutputStream对象中
			BitmapFactory.decodeResource(getResources(), R.drawable.qq).compress(CompressFormat.JPEG, 50, baos);
			//对压缩后的字节进行base64编码
			String imageBase64=new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));
			//保存转换后的Base64格式字符串
			editor1.putString("image", imageBase64);
			editor1.commit();
			baos.close();
			
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	/**
	 * 读取文件中图片方法
	 */
	private void getImage()
	{
		//下面代码从base64.xml文件中读取以保存的图像,并将其显示在ImageView控件中
				try {
					SharedPreferences mySharedPreference=getSharedPreferences("base64", Activity.MODE_PRIVATE);
					//读取Base64格式的图像数据
					String image=mySharedPreference.getString("image", "");
					//对Base64格式的字符串进行解码,还原成字节数组
					byte[] imageBytes=Base64.decode(image.getBytes(), Base64.DEFAULT);
					ByteArrayInputStream bais=new ByteArrayInputStream(imageBytes);
					ImageView imageView=(ImageView)findViewById(R.id.imageView1);
					imageView.setImageDrawable(Drawable.createFromStream(bais, "image"));
					bais.close();
				} catch (Exception e) {
					// TODO: handle exception
				}
	}
	
	/**
	 * 存储对象
	 */
	private void saveObject()
	{
		
		/*
		 * 存取对象的代码与存取图像的代码类似,首先这个对象必须可序列化(对应的类实现java.io.Serilizable接口),
		 * 然后需要将这个可序列化的对象转换成字节数组,并进一步编码成Base64格式的字符串
		 */
		try {
			
		
		Product product=new Product();
		product.name="iPhone";
		product.price=4998;
		ByteArrayOutputStream baos=new ByteArrayOutputStream();
		ObjectOutputStream oos=new ObjectOutputStream(baos);
		//将对象保存在ObjectOutputStream 对象中
		oos.writeObject(product);
		SharedPreferences mySharedPreferences=getSharedPreferences("base641", Activity.MODE_PRIVATE);
		Editor editor=mySharedPreferences.edit();
//		mySharedPreferences=getSharedPreferences("base64", Activity.MODE_PRIVATE);
		//将Product对象转换成byte数组,并将其进行base64编码
		String producteBase64=new String(Base64.encode(baos.toByteArray(), Base64.DEFAULT));
		//将编码后的字符串保存到base64.xml文件中
		editor.putString("product", producteBase64);
		editor.commit();
		oos.close();
		} catch (Exception e) {
			// TODO: handle exception
		}
	}
	
	/**
	 * 读取对象
	 */
	private void getObject()
	{
		try {
			SharedPreferences mySharedPreferences=getSharedPreferences("base641", Activity.MODE_PRIVATE);
			//从base64.xml文件中读取product对象的base64格式字符串
			String base64Proudct=mySharedPreferences.getString("product", "");
			ByteArrayOutputStream baos=new ByteArrayOutputStream();
			//将字base64 格式字符串还原成byte数组
			byte[] productByte=Base64.decode(base64Proudct.getBytes(), Base64.DEFAULT);
			ByteArrayInputStream bais=new ByteArrayInputStream(productByte);
			ObjectInputStream ois=new ObjectInputStream(bais);
			//将byte数组转化成Product对象
			Product product=(Product)ois.readObject();
			String name=product.name;
			int price=product.price;
			Toast.makeText(this, "name:"+name+", price:"+price, Toast.LENGTH_SHORT).show();
			
			ois.close();
			} catch (Exception e) {
			// TODO: handle exception
		}
		
	}

	@Override
	public void onClick(View arg0) {
		// TODO Auto-generated method stub
		switch (arg0.getId()) {
		case R.id.button1://获取图片
			getImage();
			break;
		case R.id.button2://存储图片
			saveImage();
			break;
		case R.id.button3://存储对象
			saveObject();
			break;
		case R.id.button4://获取对象
			getObject();
			break;
			

		default:
			break;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值