Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android 多媒體和相機詳解九

android 多媒體和相機詳解九

編輯:關於Android編程

釋放相機
  想機是被設備上的應用們共享的資源.你的應用可以在獲取相機實例後使用它,並且你的應用必須在用完後釋放它,而且在暫停時(Activity.onPause())也要釋放它.如果你的應用沒有適當的釋放相機,所有後續試圖獲取相機使用權的操作,包括你自己的應用,都會失敗並且導致那些應用關閉.


要釋放一個相機對象實例,使用方法Camera.release(),如下代碼所示:


[java]
public class CameraActivity extends Activity { 
    private Camera mCamera; 
    private SurfaceView mPreview; 
    private MediaRecorder mMediaRecorder; 
 
    ... 
 
    @Override 
    protected void onPause() { 
        super.onPause(); 
        releaseMediaRecorder();       // if you are using MediaRecorder, release it first  
        releaseCamera();              // release the camera immediately on pause event  
    } 
 
    private void releaseMediaRecorder(){ 
        if (mMediaRecorder != null) { 
            mMediaRecorder.reset();   // clear recorder configuration  
            mMediaRecorder.release(); // release the recorder object  
            mMediaRecorder = null; 
            mCamera.lock();           // lock camera for later use  
        } 
    } 
 
    private void releaseCamera(){ 
        if (mCamera != null){ 
            mCamera.release();        // release the camera for other applications  
            mCamera = null; 
        } 
    } 

public class CameraActivity extends Activity {
    private Camera mCamera;
    private SurfaceView mPreview;
    private MediaRecorder mMediaRecorder;

    ...

    @Override
    protected void onPause() {
        super.onPause();
        releaseMediaRecorder();       // if you are using MediaRecorder, release it first
        releaseCamera();              // release the camera immediately on pause event
    }

    private void releaseMediaRecorder(){
        if (mMediaRecorder != null) {
            mMediaRecorder.reset();   // clear recorder configuration
            mMediaRecorder.release(); // release the recorder object
            mMediaRecorder = null;
            mCamera.lock();           // lock camera for later use
        }
    }

    private void releaseCamera(){
        if (mCamera != null){
            mCamera.release();        // release the camera for other applications
            mCamera = null;
        }
    }
}

保存媒體文件

  用戶創建的媒體文件,比如圖片或視頻,應該被保存到設備的外部存儲中(SD Card) ,這樣可以保留系統空間並且使得用戶可以不通過設備也能獲取這些文件.一個設備上有很多可以存放媒體文件的路徑位置,然而只有兩個標准的路徑對於開發者來說是必須考慮的:

· Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) - 此方法返回標准的,共享的,並且是推薦的存儲位置.此路徑是被共享的(公開的),所以其它應用可以輕松發現然後讀取,修改以及刪除此路徑下的文件們.如果你的應用被用戶卸載,保存在此路徑下的文件將被刪除.要避免與干涉已存在的圖片或視頻文件,你應該在路徑下為你的應用創建一個子文件夾,如後面例子中所示.此方法從Android 2.2 (API Level 8)中開始可以使用,對於等價的早期API的調用,見"保存共享文件"一節.

· Context.getExternalFilesDir(Environment.DIRECTORY_PICTURES) - 此方法返回一個標准的存儲圖像和視頻位置,並且此位置與你的應用會關聯起來.如果你的應用被刪除,所有此位置下的文件們都將被刪除.此位置下的文件不會強制應用安全特性,所以其它應用可以讀取,修改以及刪除它們.


  下面的代碼示例演示了如何為一個媒體文件創建一個文件或Uri位置.這個文件可以在通過intent調用一個設備的相機或在創建一個相機應用時使用:

 


[java]
public static final int MEDIA_TYPE_IMAGE = 1; 
public static final int MEDIA_TYPE_VIDEO = 2; 
 
/** 創建一個文件Uri來存儲一個圖像或視頻 */ 
private static Uri getOutputMediaFileUri(int type){ 
      return Uri.fromFile(getOutputMediaFile(type)); 

 
/** 創建一個文件用於存儲圖像或視頻 */ 
private static File getOutputMediaFile(int type){ 
    // 為了安全,你應該檢查SDCard是否被mounted,  
    // 所以應先調用Environment.getExternalStorageState().  
 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( 
              Environment.DIRECTORY_PICTURES), "MyCameraApp"); 
    //如果你想創建圖像並在應用之間共享,還想讓你的圖像在你的應用卸載後依然存在,  
    // 這個位置是最好的選擇.  
 
    // 如果存儲位置不存在,創建它.  
    if (! mediaStorageDir.exists()){ 
        if (! mediaStorageDir.mkdirs()){ 
            Log.d("MyCameraApp", "failed to create directory"); 
            return null; 
        } 
    } 
 
    // 創建媒體文件的名字  
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE){ 
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
        "IMG_"+ timeStamp + ".jpg"); 
    } else if(type == MEDIA_TYPE_VIDEO) { 
        mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
        "VID_"+ timeStamp + ".mp4"); 
    } else { 
        return null; 
    } 
 
    return mediaFile; 

public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;

/** 創建一個文件Uri來存儲一個圖像或視頻 */
private static Uri getOutputMediaFileUri(int type){
      return Uri.fromFile(getOutputMediaFile(type));
}

/** 創建一個文件用於存儲圖像或視頻 */
private static File getOutputMediaFile(int type){
    // 為了安全,你應該檢查SDCard是否被mounted,
    // 所以應先調用Environment.getExternalStorageState().

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
              Environment.DIRECTORY_PICTURES), "MyCameraApp");
    //如果你想創建圖像並在應用之間共享,還想讓你的圖像在你的應用卸載後依然存在,
    // 這個位置是最好的選擇.

    // 如果存儲位置不存在,創建它.
    if (! mediaStorageDir.exists()){
        if (! mediaStorageDir.mkdirs()){
            Log.d("MyCameraApp", "failed to create directory");
            return null;
        }
    }

    // 創建媒體文件的名字
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    File mediaFile;
    if (type == MEDIA_TYPE_IMAGE){
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "IMG_"+ timeStamp + ".jpg");
    } else if(type == MEDIA_TYPE_VIDEO) {
        mediaFile = new File(mediaStorageDir.getPath() + File.separator +
        "VID_"+ timeStamp + ".mp4");
    } else {
        return null;
    }

    return mediaFile;
}

  注:Environment.getExternalStoragePublicDirectory()只能用於Android 2.2 (API Level 8)或更高版本中.如果你的目標設備使用早期版本,應用用Environment.getExternalStorageDirectory()代替.

 

相機特性 Features
  Android支持大量的相機特性,你可以在你的應用中調節它們.比如圖像格式,閃光模式,焦點設置,以及更多.本節列出常用的相機特性,並且簡要說明如何使用它們.大多數相機特性可以使用Camera.Parameters 對象取得或設置.然而,有一些重要的特性需要比Camera.Parameters更復雜的方式進行設置,這些特性在以下各節中說明:


· 測光與聚焦區域

· 面部檢測

· 定時拍攝視頻


  對於如何使用那些通過Camera.Parameters控制的一般特性,請見後面的"使用相機特性"一節.

 

表1. 各版API中引入的常用相機特性表

Feature
 API Level
 Description
 
Face Detection
 14
 檢測人臉位置並用結果來計算焦點,測光和白平衡
 
Metering Areas
 14
 在一個圖像內指定一個或多個區域來計算白平衡
 
Focus Areas
 14
 在一個圖像中設置一個或多個聚焦區域
 
White Balance Lock
 14
 停止或開始自動白平衡調整
 
Exposure Lock
 14
 停止或開始自動曝光調整
 
Video Snapshot
 14
 在拍視頻時抓取一個圖像
 
Time Lapse Video
 11
 定時錄像
 
Multiple Cameras
 9
 在一個設備上支持一個或多個相機,包括正面和反面的相機。
 
Focus Distance
 9
 焦距
 
Zoom
 8
 設置圖像的放大率
 
Exposure Compensation
 8
 減小或增大曝光級別
 
GPS Data
 5
 圖像中包含或不包含地理位置信息
 
White Balance
 5
 設置白平衡的模式
 
Focus Mode
 5
 設置在一個物體上如何聚焦,比如自動,固定,微距,無限遠.
 
Scene Mode
 5
 場景模式,比如晚上,海灘,雪地或燭光.
 
JPEG Quality
 5
 設置JPEG圖像的壓縮級別.
 
Flash Mode
 5
 設置閃光燈開,關或自動.
 
Color Effects
 5
 應用一個顏色效果到圖像,比如黑白,褐色,反色.
 
Anti-Bandingwww.2cto.com
 5
 減少在JPEG壓縮時的顏色漸變的邊緣效應.
 
Picture Format
 1
 指定圖像的文件格式
 
Picture Size
 1
 指定圖像的寬和高
 

注: 這些特性並不是在所有的設備上都被支持,因為硬件的差別和軟件的實現各有不同.

作者:nkmnkm

 

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