Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android多媒體學習一:Android中Image的簡單實例

Android多媒體學習一:Android中Image的簡單實例

編輯:Android開發實例

在多媒體應用中,Image是最基礎的功能模塊,接下來我們將看看在Android中是如何獲取和存儲Image的。Android內嵌的Image獲取和存儲功能,可以讓我們對於整個媒體框架有個比較全面的了解,同時為audio和video的學習打下基礎。
一、Image的獲取可以通過調Android自帶的Camera應用來完成。該應用含有一個Intent-Filter。通過使用
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);startActivityForResult(intent)就可以啟動Camera應用了。
二、Image存儲,Android系統中含有一個多媒體庫,其中包括所有Image、Video、Audio的數據。通過MediaStore對象可以訪問相關數據。

閒話少說,直接看例子,這是一本英文書上的,覺得寫的很好,自己翻譯了一下,並加入了很多注釋。以備查詢。

 

  1. package demo.camera;  
  2. import java.io.File;  
  3. import android.app.Activity;  
  4. import android.content.ContentValues;  
  5. import android.content.Intent;  
  6. import android.graphics.Bitmap;  
  7. import android.graphics.BitmapFactory;  
  8. import android.net.Uri;  
  9. import android.os.Bundle;  
  10. import android.os.Environment;  
  11. import android.provider.MediaStore;  
  12. import android.util.Log;  
  13. import android.view.Display;  
  14. import android.view.View;  
  15. import android.widget.Button;  
  16. import android.widget.ImageView;  
  17. /**  
  18.  * 這裡多媒體第一個示例,主要介紹Image的獲取和存儲  
  19.  * Image的獲取可以通過Android自帶的Camera應用來獲得,  
  20.  * 圖片的存儲需要用到MediaStore對象。Android中的多媒體庫。  
  21.  *   
  22.  * @author Administrator  
  23.  *  
  24.  */ 
  25. public class MainActivity extends Activity {  
  26.       
  27.     private static final int RESULT_CODE = 1;  
  28.     private Button btnCamera;  
  29.     private ImageView imageView;  
  30.       
  31.     private Uri imageFilePath;  
  32.       
  33.     @Override 
  34.     public void onCreate(Bundle savedInstanceState) {  
  35.         super.onCreate(savedInstanceState);  
  36.         setContentView(R.layout.main);  
  37.           
  38.           
  39.         imageView = (ImageView)this.findViewById(R.id.imageView);  
  40.         btnCamera = (Button)this.findViewById(R.id.camera);  
  41.         btnCamera.setOnClickListener(new View.OnClickListener() {  
  42.               
  43.             @Override 
  44.             public void onClick(View v) {  
  45.                   
  46.                   
  47.                 /**  
  48.                  * 由於Camara返回的是縮略圖,我們可以傳遞給他一個參數EXTRA_OUTPUT,  
  49.                  * 來將用Camera獲取到的圖片存儲在一個指定的URI位置處。  
  50.                  * 下面就指定image存儲在SDCard上,並且文件名為123.jpg  
  51.                  * imageFilePath = Environment.getExternalStorageDirectory().getAbsolutePath()+"123.jpg";  
  52.                  * File file = new File(imageFilePath); //創建一個文件  
  53.                  * Uri imageUri = Uri.fromFile(file);  
  54.                  * 然而Android已經提供了一個多媒體庫,那裡統一存放了設備上所有的多媒體數據。所以,  
  55.                  * 我們可以將獲取到的圖片存放在那個多媒體庫中。  
  56.                  * Android提供了MediaStore類,該類是一個ContentProvider,管理著設備上自帶的和外部的多媒體文件,  
  57.                  * 同時包含著每一個多媒體文件的數據信息。  
  58.                  * 為了將數據存儲在多媒體庫,使用ContentResolver對象來操縱MediaStore對象  
  59.                  * 在MediaStore.Images.Media中有兩個URI常量,一個是    EXTERNAL_CONTENT_URI,另一個是INTERNAL_CONTENT_URI  
  60.                  * 第一個URI對應著外部設備(SDCard),第二個URI對應著系統設備內部存儲位置。  
  61.                  * 對於多媒體文件,一般比較大,我們選擇外部存儲方式  
  62.                  * 通過使用ContentResolver對象的insert方法我們可以向MediaStore中插入一條數據  
  63.                  * 這樣在檢索那張圖片的時候,不再使用文件的路徑,而是根據insert數據時返回的URI,獲取一個InputStream  
  64.                  * 並傳給BitmapFactory  
  65.                  */ 
  66.                 //在這裡啟動Camera。  
  67.                 //Camera中定義了一個Intent-Filter,其中Action是android.media.action.IMAGE_CAPTURE  
  68.                 //我們使用的時候,最好不要直接使用這個,而是用MediaStore中的常量ACTION_IMAGE_CAPTURE.  
  69.                 //這個常量就是對應的上面的action  
  70.                 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  71.               
  72.                 //這裡我們插入一條數據,ContentValues是我們希望這條記錄被創建時包含的數據信息  
  73.                 //這些數據的名稱已經作為常量在MediaStore.Images.Media中,有的存儲在MediaStore.MediaColumn中了  
  74.                 //ContentValues values = new ContentValues();  
  75.                 ContentValues values = new ContentValues(3);  
  76.                 values.put(MediaStore.Images.Media.DISPLAY_NAME, "testing");  
  77.                 values.put(MediaStore.Images.Media.DESCRIPTION, "this is description");  
  78.                 values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");  
  79.                 imageFilePath = MainActivity.this.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);  
  80.                 intent.putExtra(MediaStore.EXTRA_OUTPUT, imageFilePath); //這樣就將文件的存儲方式和uri指定到了Camera應用中  
  81.                   
  82.                 //由於我們需要調用完Camera後,可以返回Camera獲取到的圖片,  
  83.                 //所以,我們使用startActivityForResult來啟動Camera                      
  84.                 startActivityForResult(intent, RESULT_CODE);  
  85.                   
  86.             }  
  87.         });  
  88.     }  
  89.     /**  
  90.      * 為了獲取Camera返回的圖片信息,重寫該方法。  
  91.      */ 
  92.     @Override 
  93.     public void onActivityResult(int requestCode, int resultCode, Intent data){  
  94.         super.onActivityResult(requestCode, resultCode, data);  
  95.         if(resultCode == RESULT_CODE){  
  96.             //說明是由Camera返回的數據  
  97.             //由Camera應用返回的圖片數據是一個Camera對象,存儲在一個名為data的extra域  
  98.             //然後將獲取到的圖片存儲顯示在ImageView中  
  99.               
  100.             try {  
  101.                 Bundle extra = data.getExtras();  
  102.                 /**  
  103.                  * 然而為了節約內存的消耗,這裡返回的圖片是一個121*162的縮略圖。  
  104.                  * 那麼如何返回我們需要的大圖呢?看上面  
  105.                  * 然而存儲了圖片。有了圖片的存儲位置,能不能直接將圖片顯示出來呢》  
  106.                  * 這個問題就設計到對於圖片的處理和顯示,是非常消耗內存的,對於PC來說可能不算什麼,但是對於手機來說  
  107.                  * 很可能使你的應用因為內存耗盡而死亡。不過還好,Android為我們考慮到了這一點  
  108.                  * Android中可以使用BitmapFactory類和他的一個內部類BitmapFactory.Options來實現圖片的處理和顯示  
  109.                  * BitmapFactory是一個工具類,裡面包含了很多種獲取Bitmap的方法。BitmapFactory.Options類中有一個inSampleSize,比如設定他的值為8,則加載到內存中的圖片的大小將  
  110.                  * 是原圖片的1/8大小。這樣就遠遠降低了內存的消耗。  
  111.                  * BitmapFactory.Options op = new BitmapFactory.Options();  
  112.                  * op.inSampleSize = 8;  
  113.                  * Bitmap pic = BitmapFactory.decodeFile(imageFilePath, op);  
  114.                  * 這是一種快捷的方式來加載一張大圖,因為他不用考慮整個顯示屏幕的大小和圖片的原始大小  
  115.                  * 然而有時候,我需要根據我們的屏幕來做相應的縮放,如何操作呢?  
  116.                  *   
  117.                  */ 
  118.                 //首先取得屏幕對象  
  119.                 Display display = this.getWindowManager().getDefaultDisplay();  
  120.                 //獲取屏幕的寬和高  
  121.                 int dw = display.getWidth();  
  122.                 int dh = display.getHeight();  
  123.                 /**  
  124.                  * 為了計算縮放的比例,我們需要獲取整個圖片的尺寸,而不是圖片  
  125.                  * BitmapFactory.Options類中有一個布爾型變量inJustDecodeBounds,將其設置為true  
  126.                  * 這樣,我們獲取到的就是圖片的尺寸,而不用加載圖片了。  
  127.                  * 當我們設置這個值的時候,我們接著就可以從BitmapFactory.Options的outWidth和outHeight中獲取到值  
  128.                  */ 
  129.                 BitmapFactory.Options op = new BitmapFactory.Options();  
  130.                 //op.inSampleSize = 8;  
  131.                 op.inJustDecodeBounds = true;  
  132.                 //Bitmap pic = BitmapFactory.decodeFile(imageFilePath, op);//調用這個方法以後,op中的outWidth和outHeight就有值了  
  133.                 //由於使用了MediaStore存儲,這裡根據URI獲取輸入流的形式  
  134.                 Bitmap pic = BitmapFactory.decodeStream(this 
  135.                         .getContentResolver().openInputStream(imageFilePath),  
  136.                         null, op);  
  137.                 int wRatio = (int) Math.ceil(op.outWidth / (float) dw); //計算寬度比例  
  138.                 int hRatio = (int) Math.ceil(op.outHeight / (float) dh); //計算高度比例  
  139.                 Log.v("Width Ratio:", wRatio + "");  
  140.                 Log.v("Height Ratio:", hRatio + "");  
  141.                 /**  
  142.                  * 接下來,我們就需要判斷是否需要縮放以及到底對寬還是高進行縮放。  
  143.                  * 如果高和寬不是全都超出了屏幕,那麼無需縮放。  
  144.                  * 如果高和寬都超出了屏幕大小,則如何選擇縮放呢》  
  145.                  * 這需要判斷wRatio和hRatio的大小  
  146.                  * 大的一個將被縮放,因為縮放大的時,小的應該自動進行同比率縮放。  
  147.                  * 縮放使用的還是inSampleSize變量  
  148.                  */ 
  149.                 if (wRatio > 1 && hRatio > 1) {  
  150.                     if (wRatio > hRatio) {  
  151.                         op.inSampleSize = wRatio;  
  152.                     } else {  
  153.                         op.inSampleSize = hRatio;  
  154.                     }  
  155.                 }  
  156.                 op.inJustDecodeBounds = false; //注意這裡,一定要設置為false,因為上面我們將其設置為true來獲取圖片尺寸了  
  157.                 pic = BitmapFactory.decodeStream(this.getContentResolver()  
  158.                         .openInputStream(imageFilePath), null, op);  
  159.                 imageView.setImageBitmap(pic);  
  160.             } catch (Exception e) {  
  161.                 e.printStackTrace();  
  162.             }   
  163.         }  
  164.     }  
  165. }  

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved