Android開發獲取相機拍照的原圖(並非縮圖)

王世暉發表於2016-05-21

Android開發拍照上傳是個很常見的功能,通過如下程式碼可以啟用相機進行拍照:

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        startActivityForResult(intent, PHOTO_REQUEST_CAREMA);

通過下邊的程式碼獲取相機返回的照片資料:

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PHOTO_REQUEST_CAREMA) {
            if (null != data) {
                Bundle bundle = data.getExtras();
                Bitmap bitmap = (Bitmap) bundle.get("data");// 獲取相機返回的資料,並轉換為Bitmap圖片格式

但是遺憾的是因為照片實在是太大了,為了在activity之間傳遞bitmap資料,不得不對照片進行壓縮後再傳遞,因此通過onActivityResult方法的intent引數獲取的照片,實際上是個縮圖。

大部分時候縮圖的清晰度是不能夠滿足要求的,所以要自己制定相機拍照檔案的儲存位置
使用如下的方式啟用系統相機、

        Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
        Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),PICTURE_FILE));
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        // 開啟一個帶有返回值的Activity,請求碼為PHOTO_REQUEST_CAREMA
        startActivityForResult(intent, PHOTO_REQUEST_CAREMA);

其中兩個常量設定如下:

    public static final int PHOTO_REQUEST_CAREMA=2016;
    public static final String PICTURE_FILE="temp.jpg";

這樣每次呼叫相機拍照都會在sd卡根目錄生成名為temp.jpg的圖片,每次拍照都會覆蓋舊的檔案。這樣的話就不能通過onActivityResult方法的intent引數獲取照片資料,可以直接讀取檔案

 @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PHOTO_REQUEST_CAREMA) {
            File f=new File(Environment.getExternalStorageDirectory()
                    +"/"+PICTURE_FILE);
                    ...

這樣直接獲取到的檔案是高清原圖,壓縮後可以做各種處理
因為要讀寫sd卡,所以要新增相應許可權

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

相關文章