android多媒體和相機詳解六

接收相機intent的結果
  一旦你構建並執行瞭一個圖像或視頻相機intent,你的應用必須配置為能接收intent的結果.本節向你展示如何攔截從相機intent來的回調以使你的應用可以對獲取到的圖像和視頻做更多的動作.
  為瞭接收一個intent的結果,你必須覆寫啟動intent的activity的onActivityResult()方法.下面的代碼演示瞭如何覆寫onActivityResult()來取得相機intent的結果.

[java]
private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100; 
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200; 
 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) { 
        if (resultCode == RESULT_OK) { 
            // Image captured and saved to fileUri specified in the Intent  
            Toast.makeText(this, "Image saved to:\n" + 
                     data.getData(), Toast.LENGTH_LONG).show(); 
        } else if (resultCode == RESULT_CANCELED) { 
            // User cancelled the image capture  
        } else { 
            // Image capture failed, advise user  
        } 
    } 
 
    if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) { 
        if (resultCode == RESULT_OK) { 
            // Video captured and saved to fileUri specified in the Intent  
            Toast.makeText(this, "Video saved to:\n" + 
                     data.getData(), Toast.LENGTH_LONG).show(); 
        } else if (resultCode == RESULT_CANCELED) { 
            // User cancelled the video capture  
        } else { 
            // Video capture failed, advise user  
        } 
    } 

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Image captured and saved to fileUri specified in the Intent
            Toast.makeText(this, "Image saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the image capture
        } else {
            // Image capture failed, advise user
        }
    }

    if (requestCode == CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            // Video captured and saved to fileUri specified in the Intent
            Toast.makeText(this, "Video saved to:\n" +
                     data.getData(), Toast.LENGTH_LONG).show();
        } else if (resultCode == RESULT_CANCELED) {
            // User cancelled the video capture
        } else {
            // Video capture failed, advise user
        }
    }
}

 

一旦你的activity接收到一個成功的結果,獲取到的圖像或視頻就在某個路徑下等著你去處理它們瞭.

 

綁定到一個相機應用

一些開發者可能需要一個相機用戶接口用來定制他們的應用的外觀或提供特一些特殊的特性。創建一個定制的相機activity需要比使用intent更多的代碼,但是它可以提供一個更吸引人的用戶體驗。

 

 

為你的應用創建一個定制的相機界面的一般步驟是:

探測並使用相機-創建代碼來檢測相機是否存在並請求使用它.

創建一個預覽類-創建一個相機預覽類,它從SurfaceView派生並實現SurfaceHolder接口。此類可以預覽從相機來的實時影像。

構建一個預覽Layout- 當你有瞭相機預覽類後,再創建一個viewlayout包含預覽類和用於控制的用戶界面。

建立圖像獲取的監聽器– 為你的控制界面建立響應用戶動作的監聽器。

獲取並存入文件中– 建立獲取視頻或圖像然後存儲的代碼。

釋放相機-用完相機後,你的應用必須正確的釋放它以供別的應用使用。

 

 

相機硬件是一個共享資源,必須小心管理,才能使你的應用不與別的也使用相機的應用產生沖突。後面的章節討論如何檢測相機,如何請求使用一個相機,如何獲取圖像或視頻以及如何釋放相機。

 

警告:記住在用完成時要調用Camera.release()來釋放相機對象!如果你的應用沒有正確地釋放相機,所有的後續對相機的使用,包括你自己的應用所發出的,將會失敗並導致你自己的應用或其它應用關閉。

檢測相機硬件

如果你的應用不使用manifest聲明請求相機,你就應該在運行時檢測相機是否可用。要執行這種檢測,需使用PackageManager.hasSystemFeature()方法,如下所示:

[java]
/** 檢查設備是否具有相機*/ 
Devate boolean checkCameraHardware(Context context) { 
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){ 
        // this device has a camera  
        return true; 
    } else { 
        // no camera on this device  
        return false; 
    } 

/** 檢查設備是否具有相機*/
Devate boolean checkCameraHardware(Context context) {
    if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){
        // this device has a camera
        return true;
    } else {
        // no camera on this device
        return false;
    }
}

Android設備可能具有多個相機,比如一個正面有一個視頻聊天相機,後面有一個拍照相機。Android2.3(API Level 9) 及後續版本允許你檢查相機的數量,使用Camera.getNumberOfCameras()方法。

 

使用相機

如果你確定你應用所在的設備上有一個相機,你必須獲得相機的一個實例後才能請求使用它(除非你正在使用intent來使用相機)。

要使用主相機,使用Camera.open()方法並註意去捕獲任何異常,就像下面代碼所示:

[java]
/** 一個獲取相機對象實例的安全方法 */ 
public static Camera getCameraInstance(){ 
    Camera c = null; 
    try { 
        c = Camera.open(); // attempt to get a Camera instance  
    } 
    catch (Exception e){ 
        // Camera is not available (in use or does not exist)  
    } 
    return c; // returns null if camera is unavailable  

/** 一個獲取相機對象實例的安全方法 */
public static Camera getCameraInstance(){
    Camera c = null;
    try {
        c = Camera.open(); // attempt to get a Camera instance
    }
    catch (Exception e){
        // Camera is not available (in use or does not exist)
    }
    return c; // returns null if camera is unavailable
}

 

警告:在使用Camera.open()時總是要檢查異常。否則如果相機正被使用或不存在將導致你的應用被系統關閉。

在運行Android2.3 (API Level 9)或更高版本的設備上,你可以使用Camera.open(int)訪問特定的相機。上面的例子代碼將訪問第一個相機,也就是反面的相機。

檢查相機的特性

一旦你獲取到一個相機,你就可以使用Camera.getParameters()方法獲取有關相機能力的信息,主要是檢查所返回的Camera.Parameters對象以確定相機的能力。當使用APILevel 9或更高版本,使用Camera.getCameraInfo()來確定相機是位於正面還是反面,以及它的圖像是橫的還是豎的。

作者:nkmnkm

 

發佈留言