一、概述
本章節主要講述學習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。