Android基礎—Camera調用及註冊

一、概述

本章節主要講述學習android攝像頭使用中的實踐以及注意點,主要分爲系統Camera的調用方法、指定相片路徑、原圖和縮略圖、註冊應用爲Camera應用這幾部分知識。

如有錯誤或優化之處,歡迎留言指導。

二、調用系統Camera

核心代碼:

// 隱式Intent調用
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivity(intent);

爲了調用Camera拍照後返回可以獲取到圖片,將啓動方式換成startActivityForResult,並重寫onActivityResult方法。

核心代碼:

// 推薦將requestCode定義爲靜態常量
private static int REQ_1 = 1;

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, REQ_1);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        /**
         * 判斷系統Camera返回的結果,也可能是RESULT_CANCEL
         * 如果是自定義的Activity可通過如下返回
         * Intent intent = new Intent();
         * setResult(RESULT_CANCELED, intent);
         * finish();
         */
        if (resultCode == RESULT_OK) { // 判斷resultCode,RESULT_OK代表拍照成功
            if (requestCode == REQ_1) { // 判斷requestCode,分別處理不同Intent請求
                Bundle bundle = data.getExtras(); // 獲取所有返回數據
                Bitmap bitmap = (Bitmap) bundle.get("data"); // 獲取數據並轉爲Bitmap
                ImageView.setImageBitmap(bitmap);
            }
        }
    }

但是通過如上方法從data中獲取後的圖片爲系統優化過後的縮略圖,如要獲取高清原圖,可以通過修改圖片存儲路徑後再讀取,如下可見。

核心代碼:

private String mFilePath;

// 在onCreate中初始化
mFilePath = Environment.getExternalStorageDirectory().getPath();
mFilePath = mFilePath + "/" + System.currentTimeMillis() + ".jpg";

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri photoUri = Uri.fromFile(new File(mFilePath)); // 導包時注意導入的是android.net.Uri
intent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
startActivityForResult(intent, REQ_1);

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == REQ_1) {
                FileInputStream fis = null;
                try {
                    fis = new FileInputStream(mFilePath);
                    if (fis != null) {
                        Bitmap bitmap = BitmapFactory.decodeStream(fis);
                        ImageView.setImageBitmap(bitmap);
                    }
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                } finally {
                    if (fis != null) {
                        try {
                            fis.close(); // 注意釋放內存,但有時也要注意釋放後可能會導致Bitmap無法顯示
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
    }

所以,調用系統相機拍照以及獲取照片我們以及學會了,接下來可能有的朋友會開發美顏相機之類的App,那這類應用的必備的一步就是要把自己的app註冊爲Camera應用,讓用戶調用時可以選擇用系統相機還是我們開發的相機。

核心代碼:

// 剔除不支持Camera的設備
<uses-feature android:name="android.hardware.Camera" android:required="true"/>

// 權限申明,6.0在代碼中還需校驗
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />

// 隱式調用的action
<activity android:name=".CameraActivity">
            <intent-filter>
                <action android:name="android.media.action.IMAGE_CAPTURE"/>

                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
</activity>

三、後言

本章節就記錄到這裏,下兩章計劃學習研究Camera1和Camera2,根據版本製作自定義相機,最後寫一個兼容版本的簡單相機demo。

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