廣告

2014年11月28日 星期五

[Android Saving Data][Android儲存資料的方式]

android的local端資料儲存方式分為三種:

  1. SharedPreferences =>用key-value的方式。
  2. 存成file檔,存在內部空間或SD卡。
  3. SQLite 。
這邊先討論1,2,SQLite會單獨在下一章節討論。


1. SharedPreferences =>用key-value的方式。

  1. public class Lewis extends Activity {
  2.     public static final String SHAREPREFERENCE_NAME = "saveData";
  3.         public static final String SHARE_key = "TEST";
  4.     @Override
  5.     protected void onCreate(Bundle state){        
  6.        super.onCreate(state);
  7.      
  8.        //get sharedPreference data
  9.        SharedPreferences settings = getSharedPreferences(SHAREPREFERENCE_NAME,  Context.MODE_PRIVATE);
  10.        String getShareData = settings.getString(SHARE_key, false);
  11.        
  12.     }
  13.     @Override
  14.     protected void onStop(){
  15.        super.onStop();
  16.       SharedPreferences settings = getSharedPreferences(SHAREPREFERENCE_NAME,  Context.MODE_PRIVATE);
  17.       SharedPreferences.Editor editor = settings.edit();
  18.       editor.putString(SHARE_key, "forTest");
  19.       editor.commit();
  20.     }
  21. }

2. 存成file檔,存在內部空間或SD卡。
  • 存在內部空間=>只有該APP可以使用。


  1. package imageProcess;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.File;
  4. import java.io.FileInputStream;
  5. import java.io.FileNotFoundException;
  6. import java.io.FileOutputStream;
  7. import java.io.IOException;
  8. import android.content.Context;
  9. import android.content.ContextWrapper;
  10. import android.graphics.Bitmap;
  11. import android.graphics.BitmapFactory;
  12. import android.net.Uri;
  13. import android.util.Base64;
  14. import android.util.Log;
  15. public class ImageProcess { 
  16.         Context context;             
  17.         public ImageProcess(Context context)
  18.         {
  19.                 this.context = context;
  20.                
  21.         }
  22.                
  23.         public  String encodeTobase64(Bitmap image)
  24.         {
  25.             Bitmap immagex=image;
  26.             ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  27.             immagex.compress(Bitmap.CompressFormat.PNG20, baos);//100
  28.             byte[] b = baos.toByteArray();
  29.             String imageEncoded = Base64.encodeToString(b,Base64.DEFAULT);
  30.             Log.e("imageEncoded""...."+imageEncoded.length());
  31.             immagex.recycle();
  32.             return imageEncoded;
  33.         }
  34.               
  35.         public  Bitmap decodeBase64(String input)
  36.         {
  37.             byte[] decodedByte = Base64.decode(input, 0);
  38.             return BitmapFactory.decodeByteArray(decodedByte, 0, decodedByte.length);
  39.         }
  40.                
  41.     public Bitmap decodeUri(Uri selectedImage) throws FileNotFoundException {
  42.                // Decode image size
  43.                BitmapFactory.Options o = new BitmapFactory.Options();
  44.                o.inJustDecodeBounds = true;
  45.                BitmapFactory.decodeStream(context.getContentResolver().openInputStream(selectedImage)null, o); 
  46.                // The new size we want to scale to
  47.                final int REQUIRED_SIZE = 140;
  48.                // Find the correct scale value. It should be the power of 2.
  49.                int width_tmp = o.outWidth, height_tmp = o.outHeight;
  50.                int scale = 1;
  51.                while (true) {
  52.                    if (width_tmp / 2 < REQUIRED_SIZE
  53.                       || height_tmp / 2 < REQUIRED_SIZE) {
  54.                        break;
  55.                    }
  56.                    width_tmp /= 2;
  57.                    height_tmp /= 2;
  58.                    scale *= 2;
  59.                }
  60.                
  61.                // Decode with inSampleSize
  62.                BitmapFactory.Options o2 = new BitmapFactory.Options();
  63.                o2.inSampleSize = scale;
  64.                return BitmapFactory.decodeStream(context.getContentResolver().openInputStream(selectedImage)null, o2);
  65.            }
  66.      
  67.     public boolean saveImageToInternalStorage(Bitmap image,String filepath) {
  68.        
  69.        
  70.          ContextWrapper cw = new ContextWrapper(context.getApplicationContext());
  71.           // path to /data/data/yourapp/app_data/imageDir
  72.          File directory = cw.getDir(filepath, Context.MODE_PRIVATE);
  73.          // Create imageDir
  74.          File mypath=new File(directory,filepath+".png");
  75.          FileOutputStream fos = null;
  76.          try {          
  77.              fos = new FileOutputStream(mypath);
  78.         // Use the compress method on the BitMap object to write image to the OutputStream
  79.              image.compress(Bitmap.CompressFormat.PNG100, fos);
  80.              fos.close();
  81.              Log.e("save",mypath.toString());
  82.             return true;
  83.            
  84.            } catch (FileNotFoundException e) {
  85.             // TODO Auto-generated catch block
  86.             e.printStackTrace();
  87.             Log.e("save", e.toString());
  88.             return false;
  89.            } catch (IOException e) {
  90.             // TODO Auto-generated catch block
  91.             e.printStackTrace();
  92.             Log.e("save", e.toString());
  93.             return false;
  94.            }
  95.      
  96.    }   
  97.    
  98.     public Bitmap loadImageFromStorage(String path)
  99.     {
  100.         try {
  101.                  ContextWrapper cw = new ContextWrapper(context.getApplicationContext());
  102.              // path to /data/data/yourapp/app_data/imageDir
  103.             File directory = cw.getDir(path, Context.MODE_PRIVATE);
  104.                 File f=new File(directory.getPath(), path+".png");
  105.                 FileInputStream fInputStream = new FileInputStream(f);
  106.             Bitmap b = BitmapFactory.decodeStream(fInputStream);
  107.          
  108.             Log.e("load""ok");
  109.             fInputStream.close();
  110.              
  111.             Log.e("load""ok");
  112.             return b;
  113.                
  114.         }
  115.         catch (FileNotFoundException e)
  116.         {
  117.                    Log.e("load", e.toString());
  118.            
  119.             return null;
  120.         } catch (IOException e) {
  121.                         // TODO Auto-generated catch block
  122.                  Log.e("load", e.toString());
  123.              
  124.              return null;
  125.                 } 
  126.     }
  127. }

使用方法:
  1.  imageProcess = new ImageProcess(this);
  2.  //將元件畫面擷取,並轉成base64存入
  3.  View u = findViewById(R.id.drag_list);
  4.  u.setDrawingCacheEnabled(true);                                                
  5.  u.buildDrawingCache(true);
  6.  Bitmap b = Bitmap.createBitmap(u.getDrawingCache());            
  7.  u.setDrawingCacheEnabled(false);
  8.  imageProcess.saveImageToInternalStorage( (imageProcess.encodeTobase64(b),("your path");
  9.  imageProcess.loadImageFromStorage("your path");


  • 存在外部空間=>其他app也可使用
先添加以下到manifest 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

  1. private void SaveImage(Bitmap finalBitmap) {
  2.     String root = Environment.getExternalStorageDirectory().toString();
  3.     File myDir = new File(root + "/saved_images");    
  4.     myDir.mkdirs();
  5.     Random generator = new Random();
  6.     SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");
  7.         String currentDateandTime = sdf.format(new Date());
  8.     String fname = currentDateandTime +".jpg";
  9.     File file = new File (myDir, fname);
  10.     if (file.exists ()) file.delete ();
  11.     try {
  12.            FileOutputStream out = new FileOutputStream(file);
  13.            finalBitmap.compress(Bitmap.CompressFormat.JPEG90, out);
  14.            out.flush();
  15.            out.close();
  16.     } catch (Exception e) {
  17.            e.printStackTrace();
  18.     }
  19. }



沒有留言:

張貼留言