溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android開發(fā)實(shí)現(xiàn)ImageView加載攝像頭拍攝的大圖功能

發(fā)布時(shí)間:2020-10-13 11:19:34 來源:腳本之家 閱讀:188 作者:AAA啊哈 欄目:移動(dòng)開發(fā)

本文實(shí)例講述了Android開發(fā)實(shí)現(xiàn)ImageView加載攝像頭拍攝的大圖功能。分享給大家供大家參考,具體如下:

這個(gè)方法是從官方demo中摘錄的,在此記錄學(xué)習(xí)。

權(quán)限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature
  android:name="android.hardware.camera2"
  android:required="false" />

另:關(guān)于權(quán)限控制還可參考:Android Manifest功能與權(quán)限描述大全

設(shè)置變量保存文件存儲(chǔ)路徑

private String mCurrentPhotoPath;
/**
* 拍照flag
*/
private static final int REQUEST_IMAGE_CAPTURE_O = 2;

創(chuàng)建存儲(chǔ)路徑及文件名

 /**
* 創(chuàng)建拍攝的圖片的存儲(chǔ)路徑及文件名
* @return
* @throws IOException
*/
private File createImageFile() throws IOException{
  String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
  String imageFileName = "JPEG_" + timeStamp + "_";
  File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
  Log.d("TrainingFirstActivity", "storageDir:" + storageDir);
  File image = File.createTempFile(imageFileName, ".jpg", storageDir);
  mCurrentPhotoPath = image.getAbsolutePath();
  Log.d("image.getAbsolutePath()", image.getAbsolutePath() + "");
  return image;
}

拍攝圖片并保存

Intent takePictureOintent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureOintent.resolveActivity(getPackageManager()) != null){
 File photoFile = null;
 try {
  photoFile = createImageFile();
 } catch (IOException e) {
  e.printStackTrace();
 }
 if (photoFile != null){
  takePictureOintent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
  startActivityForResult(takePictureOintent, REQUEST_IMAGE_CAPTURE_O);
 }
}

處理并壓縮拍照結(jié)果,takePhotoThenToShowImg是一個(gè)ImageView控件

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  if (requestCode == REQUEST_IMAGE_CAPTURE_O && resultCode == RESULT_OK){
   int targetW = takePhotoThenToShowImg.getWidth();
   int targetH = takePhotoThenToShowImg.getHeight();
  /* Get the size of the image */
   BitmapFactory.Options bmOptions = new BitmapFactory.Options();
   bmOptions.inJustDecodeBounds = true;
   BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
   int photoW = bmOptions.outWidth;
   int photoH = bmOptions.outHeight;
  /* Figure out which way needs to be reduced less */
   int scaleFactor = 1;
   if ((targetW > 0) || (targetH > 0)) {
    scaleFactor = Math.min(photoW/targetW, photoH/targetH);
   }
  /* Set bitmap options to scale the image decode target */
   bmOptions.inJustDecodeBounds = false;
   bmOptions.inSampleSize = scaleFactor;
   bmOptions.inPurgeable = true;
  /* Decode the JPEG file into a Bitmap */
   Bitmap bitmap = BitmapFactory.decodeFile(mCurrentPhotoPath, bmOptions);
  /* Associate the Bitmap to the ImageView */
   takePhotoThenToShowImg.setImageBitmap(bitmap);
   galleryAddPic();
  }
}

最后可以將拍攝到的照片添加到Media Provider的數(shù)據(jù)庫中,以便圖庫或者其他程序讀取照片

/**
* 將拍攝到的照片添加到Media Provider的數(shù)據(jù)庫中
*/
private void galleryAddPic(){
  Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
  File f = new File(mCurrentPhotoPath);
  Uri contentUri = Uri.fromFile(f);
  mediaScanIntent.setData(contentUri);
  this.sendBroadcast(mediaScanIntent);
}

如果只需要縮略圖的話,只要調(diào)攝像頭拍攝直接處理結(jié)果就行

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK){//展示圖片
   Bundle extras = data.getExtras();
   Bitmap imageBitmap = (Bitmap) extras.get("data");
   takePhotoThenToShowImg.setImageBitmap(imageBitmap);
  }
}

更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android拍照與圖片處理技巧總結(jié)》、《Android圖形與圖像處理技巧總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》

希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI