1. 程式人生 > >android 多媒體和相機詳解五

android 多媒體和相機詳解五

相機

  Android框架架包含了各種相機和相機功能的支援,使你可以在你的應用中捕獲影象和視訊.本文件討論一個簡單快速的獲取影象和視訊的方法,並概述一個建立自定義使用者相機體驗的高階方法.

想一想

  在使你的應用能使用裝置上的相機之前,你應該先想一想你的應用將來會如何使用此硬體.

  • Camera必須-相機是必須的,你不希望你的應用安裝到一個沒有相機的裝置上.你應該在manifest檔案中宣告需要相機.

  • 快速影象或自定義特性-你的應用將如何使用相機?你僅僅是抓取一個快速圖片或視訊剪輯,還是提供一個新的使用方式?前者請考慮使用現有的相機應用.後者請閱讀後面的"建立一個相機應用"一節.

  • 儲存-你的應用產生的影象和視訊要給自己看還是共享給其它應用?你想在你的應用被刪除後所建立的影象和視訊仍然存在嗎?請閱讀後面的"儲存媒體檔案"一節來學習如何實現這些操作.

基礎知識

  Android框架支援通過CameraAPICemeraintent來抓取影象和視訊.下面就是相關的類們:

  • Camera

    此類是控制裝置相機的主要API.此類用於在建立相機應用時獲取圖片和視訊.

  • SurfaceView

    此類為使用者提供camera的實時影象預覽.

  • MediaRecorder

    此類用於從camera錄製視訊.

  • Intent

    一個MediaStore.ACTION_IMAGE_CAPTUREMediaStore.ACTION_VIDEO_CAPTURE型的intent,可以使用它來抓取影象或視訊,而不用操作Camera物件們.

Manifest中的宣告

  在使用CameraAPI開發你的應用之前,你需保證在你的manifest

中聲明瞭合適的條目使得有權使用相機和其它相關特性.

  • CameraPermission - 你的應用必須請求使用裝置相機的取限.

    <uses-permissionandroid:name="android.permission.CAMERA" />

    注:如果你通intent使用camera,你的應用不必請求此許可權.

  • CameraFeatures - 你的應用必須也要宣告要使用的相機特性,比如:

    <uses-featureandroid:name="android.hardware.camera" />

    對於相機特性列表,請見manifestFeatures Reference

      新增相機特性到你的manifest

    導致Android市場不會將你的應用安裝到沒有相機相機特性達不到你所宣告要求的裝置上.

      如果你的應用要使用相機或相機的一些特性,但又不是必須的,你應該在manifest中指定這些需求,但把android:required屬性置為false

    <uses-featureandroid:name="android.hardware.camera"android:required="false" />

  • StoragePermission - 如果你的應用要儲存影象或視訊到外部儲存上(SD),你必須也宣告此許可權.

    <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

  • AudioRecording Permission - 在使用視訊捕獲裝置來錄製音訊時,你的應用必須請求音訊捕獲許可權.

    <uses-permissionandroid:name="android.permission.RECORD_AUDIO" />

使用現有的相機應用

  一個不用寫程式碼來獲取圖片和視訊的快速方法是使用intent來呼叫現有的Androidcamera 應用.一個cameraintent呼叫現存的相機應用抓取圖片或視訊剪輯然後返回的你的應用.本節向你演示如何使用此技術獲取圖片和視訊.

  呼叫一個相機intent,主要有以下步驟:

  • 組建一個相機Intent– 建立一個請求圖片或視訊的Intent,使用以下intent型別中的一個:

    • MediaStore.ACTION_IMAGE_CAPTURE- 從已存在的相機應用中請求一個圖片.

    • MediaStore.ACTION_VIDEO_CAPTURE- 從已存在的相機應用中請求一個視訊.

  • 啟動這個相機Intent-使用startActivityForResult()方法來執行相機intent.在你啟動intent後,相機應用的介面會出現在裝置螢幕上,然後使用者就可以用它來獲取圖片或視訊.

  • 接收Intent結果-在你的應用中設定一個onActivityResult()方法來接收從相機intent來的回撥和資料.當用戶獲取了一個圖或視訊之後(或取消了操作),系統就會呼叫此方法.


影象獲取intent

  使用相機intent獲取影象是使用最少程式碼獲取影象的捷逕.一個影象獲取intent包含以下額外資訊:

  • MediaStore.EXTRA_OUTPUT-此設定需要一個Uri物件,這個物件指定了一個儲存影象的路徑和檔名.此設定是可選的,但是強烈建議使用之.如果你沒有指定此值,相機應用就會把影象以預設的名字儲存到預設的位置.

  下面的例子演示了形成一個影象獲取intent並執行的方法.此例子中的getOutputMediaFileUri()方法是引用的”儲存媒體檔案”一節中的例子程式碼.

private static final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;
private Uri fileUri;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    // 建立一個獲取影象的Intent
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); // 建立一個檔案來儲存影象
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); // 設定影象檔名

    // 開始影象獲取Intent
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}

  當startActivityForResult()方法被執行,看到一個相機應用的介面.當用戶獲取了一個影象(或取消了操作),使用者介面返回到你的應用,你必須攔截onActivityResult()方法來接收intent的結果然後再繼續執行你的應用.

視訊獲取intent

  使用相機intent獲取視訊是使用最少程式碼使得你的應用獲取視訊的捷徑.一個視訊獲取intent可以包含以下額外資訊:

  • MediaStore.EXTRA_OUTPUT-此設定需要一個儲存視訊的路徑和檔名的Uri.此設定是可選的但是強列推薦的.如果你不指定此值,相機應用就把請求到的影象以預設的檔名儲存到預設的資料夾下,這些資訊儲存在返回的intentIntent.getData()欄位中.

  • MediaStore.EXTRA_VIDEO_QUALITY- 此值在最低質量最小檔案尺寸時是0,在最高質量最大檔案尺寸時是1.

  • MediaStore.EXTRA_DURATION_LIMIT- 此值設定獲取視訊的長度,以秒為單位.

  • MediaStore.EXTRA_SIZE_LIMIT- 此值設定獲取視訊檔案的大小,以位元組為單位.

  下面的例子演示瞭如何構建一個視訊獲取intent並執行它.此例子中的getOutputMediaFileUri()方法是引用的”儲存媒體檔案”一節中的例子程式碼.

private static final int CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE = 200;
private Uri fileUri;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    //create new Intent
    Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_VIDEO);  // create a file to save the video
    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);  // set the image file name

    intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 1); // set the video image quality to high

    // start the Video Capture Intent
    startActivityForResult(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);
}

  當startActivityForResult()方法執行後,使用者看到了一個改良的相機應用介面.在使用者完成視訊獲取(或取消了操作)之後,使用者介面返回到你的應用,你必須攔截onActivityResult()方法來接收intent的結果並且繼續執行你的應用.