android多媒體和相機詳解五

相機
  Android框架架包含瞭各種相機和相機功能的支持,使你可以在你的應用中捕獲圖像和視頻.本文檔討論一個簡單快速的獲取圖像和視頻的方法,並概述一個創建自定義用戶相機體驗的高級方法.

想一想

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

Camera必須-相機是必須的,你不希望你的應用安裝到一個沒有相機的設備上.你應該在manifest文件中聲明需要相機.

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

存儲 -你的應用產生的圖像和視頻要給自己看還是共享給其它應用?你想在你的應用被刪除後所創建的圖像和視頻仍然存在嗎?請閱讀後面的"保存媒體文件"一節來學習如何實現這些操作.

 

基礎知識

  Android框架支持通過CameraAPI或Cemeraintent來抓取圖像和視頻.下面就是相關的類們:

Camera

此類是控制設備相機的主要API.此類用於在創建相機應用時獲取圖片和視頻.

SurfaceView

此類為用戶提供camera的實時圖像預覽.

MediaRecorder

此類用於從camera錄制視頻.

Intent

一個MediaStore.ACTION_IMAGE_CAPTURE或MediaStore.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()方法是引用的”保存媒體文件”一節中的例子代碼.

[java]
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); 

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.此設置是可選的但是強列推薦的.如果你不指定此值,相機應用就把請求到的圖像以默認的文件名保存到默認的文件夾下,這些信息保存在返回的intent的Intent.getData()字段中.

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

MediaStore.EXTRA_DURATION_LIMIT- 此值設置獲取視頻的長度,以秒為單位.

MediaStore.EXTRA_SIZE_LIMIT- 此值設置獲取視頻文件的大小,以字節為單位.

  下面的例子演示瞭如何構建一個視頻獲取intent並執行它.此例子中的getOutputMediaFileUri()方法是引用的”保存媒體文件”一節中的例子代碼.

[java]
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); 

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的結果並且繼續執行你的應用.

作者:nkmnkm

 

發佈留言