初識Camera,調用系統拍照錄像程序

Camera 官方指南,英語不太好,翻譯有可能不準確,見諒 o(^▽^)o

關於拍照錄像,有兩種處理方式,一種是構建Intent調用系統或其他的APP,另一種是自定義自己的拍照或錄像界面,下面就講解一下這兩種方式

Manifest中Camera相關的配置

攝像頭權限

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

ps:如果你通過Intent調用系統或者其他APP的拍照錄像功能,該權限可以不用設置

其他功能

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

Camera的功能(官方清單

android.hardware.camera  程序使用設備攝像頭
android.hardware.camera.autofocus 子功能,攝像頭自動聚焦功能
android.hardware.camera.flash 子功能,使用閃光燈
android.hardware.camera.front 子功能,使用前置攝像頭

ps:詳細的使用教程,請參考: Google Play and Feature-Based Filtering

如果你的應用能通過正常的操作使用攝像頭和攝像頭的這些功能,但是不需要使用它,那麼你需要在你的聲明裏增加android:required屬性,並設置爲false(有些繞口,其實我也是似懂非懂的 -_-#)

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

存儲權限

如果你需要保存圖片或視頻到設備的外部存儲器(SD Card)中,你需要增加權限

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

音頻錄製權限

如果你需要錄製音頻的話,你需要增加權限

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

定位權限

如果你的圖片需要增加GPS定位信息的話,你需要增加權限

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

ps:更多關於定位的信息,請參考:Location Strategies

調用系統或者其他APP的拍照錄像功能

拍照和錄像的一個快速的集成辦法就是通過Intent調用系統或者其他APP的拍照錄像功能。

基本步驟

1. Compose a Camera Intent,創建一個Intent去獲取圖片和視頻,使用下面其中一個Intent類型
    MediaStore.ACTION_IMAGE_CAPTURE:通過其他Camera APP獲取圖片
    MediaStore.ACTION_VIDEO_CAPTURE:通過其他Camera APP獲取視頻
2. Start the Camera Intent,使用startActivityForResult()方法執行創建的Camera Intent 
3. Receive the Intent Result,重寫onActivityResult()方法去接收從這個Camera Intent返回回來的數據

圖片捕獲Intent

捕獲圖片的Intent可以包含額外的信息
MediaStore.EXTRA_OUTPUT

指定一個地址和名稱去構建一個Uri,保存你想保存的圖片。這個屬性是可選的,但是強烈推薦使用。如果你沒有設置該屬性,那麼應用會使用默認的名稱去保存圖片到默認的路徑,通過intent.getData()方法去獲取圖片內容

舉個例子演示如何構造一個圖像捕獲意圖並去執行它

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);

    // create Intent to take a picture and return control to the calling application
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

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

    // start the image capture Intent
    startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
}

當執行startActivityForResult(intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);方法後,會啓動一個Camera界面,當我們結束拍照後,我們要在onActivityResult()方法中進行結果處理(下面有如何處理結果的講解,Receiving camera intent result

視頻捕獲Intent

視頻捕捉的Intent可以包括以下額外的信息
MediaStore.EXTRA_OUTPUT(同上)
MediaStore.EXTRA_VIDEO_QUALITY

取值範圍0~1,視頻質量和文件大小

MediaStore.EXTRA_DURATION_LIMIT

視頻的時長,單位秒

MediaStore.EXTRA_SIZE_LIMIT

視頻文件的大小,單位byte

舉個例子演示如何構造一個視頻捕獲意圖並去執行它

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(intent, CAPTURE_VIDEO_ACTIVITY_REQUEST_CODE);方法後,會啓動一個Camera界面,當我們結束錄像後,我們要在onActivityResult()方法中進行結果處理(下面有如何處理結果的講解,Receiving camera intent result

接收Intent返回結果並處理

舉個例子去講解如何重寫onActivityResult()進行處理從image camera intent或者video camera intent中返回的結果

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
        }
    }
}

如何自定義自己的拍照或錄像程序,請看下一篇:Camera進階,自定義拍照錄像界面

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章