接收相機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