如果不是特別的要求,通過拍照的方式取得圖片的話,我們一般調用系統的拍照來完成這項工作,而沒必要再自己去實現一個拍照功能。調用系統相機很簡單,只需要一個intent就可以跳轉到相幾界面,然后再通過onActivityResult來取得圖片即可。
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //系統常量, 啟動相機的關鍵 startActivityForResult(openCameraIntent, REQUEST_CODE_TAKE_PICTURE); // 參數常量為自定義的request code, 在取返回結果時有用
保存得到的圖片
protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQUEST_CODE_TAKE_PICTURE: if ( resultCode == RESULT_OK) { Bitmap bm = (Bitmap) data.getExtras().get("data"); savePath = FileUtil.saveBitmap(bm); img.setImageBitmap(bm); } break; } }
經過測試發現,保存圖片后的圖片與拍照時的預覽圖片對比后,發現前者失真嚴重。原因是現在相機的像素都很大,隨便一張圖片都上M,而Android系統分配給每個應用的最大內存是16M,如果直接將圖片通過內存方式返回給調用者會占用過大的內存,因此這里得到的是一個處理后的縮略圖。
第二種方法獲取圖片,就是在intent里指定圖片保存位置,這種方法取得的是原圖, 代碼如下
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String f = System.currentTimeMillis()+".jpg"; Uri fileUri = Uri.fromFile(new File(Environment.getExternalStoragePublicDirectory("").getPath()+f)); openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); //指定圖片存放位置,指定后,在onActivityResult里得到的Data將為null startActivityForResult(openCameraIntent, REQUEST_CODE_TAKE_PICTURE);
圖片裁剪
case TAKE_PHOTO: Intent intent = new Intent("com.android.camera.action.CROP"); //剪裁 intent.setDataAndType(imageUri, "image/*"); intent.putExtra("scale", true); //設置寬高比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); //設置裁剪圖片寬高 intent.putExtra("outputX", 340); intent.putExtra("outputY", 340); intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri); Toast.makeText(MainActivity.this, "剪裁圖片", Toast.LENGTH_SHORT).show(); //廣播刷新相冊 Intent intentBc = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); intentBc.setData(imageUri); this.sendBroadcast(intentBc); startActivityForResult(intent, CROP_PHOTO); //設置裁剪參數顯示圖片至ImageView break; case CROP_PHOTO: try { //圖片解析成Bitmap對象 Bitmap bitmap = BitmapFactory.decodeStream( getContentResolver().openInputStream(imageUri)); Toast.makeText(MainActivity.this, imageUri.toString(), Toast.LENGTH_SHORT).show(); showImage.setImageBitmap(bitmap); //將剪裁后照片顯示出來 } catch(FileNotFoundException e) { e.printStackTrace(); } break;