Android 拍照功能的開發

 

最近在Android上作了拍照功能的開發。android

業務場景是:點擊界面(HTML5)上的拍照按鈕會調用拍照的JS API,獲取其返回照片文件的存儲路徑、擴展名以及照片文件的Base64字符串,而後在界面上顯示圖片。安全

開發時一些要點記錄以下:ide

一、關於存儲:雖然如今大部分手機的存儲都是有的,安全起見,須要判斷一下存儲的狀態。post

 
  1. String SDState = Environment.getExternalStorageState();
  2. if (SDState.equals(Environment.MEDIA_MOUNTED)) {
  3. //TODO...
  4. } else {
  5. error("該終端沒有存儲設備,不能使用拍照功能...");
  6. }

二、如何將拍攝到的照片保存到存儲中,而不僅是生成一份縮略圖數據返回。this

須要在Intent中預先指定照片文件的存儲Uri。.net

 
  1. private static final int ACTION_TAKE_PHOTO = 1;
  2. private Uri photoUri;
  3.  
  4. /***
  5. * 須要說明一下,如下操做使用照相機拍照,拍照後的圖片會存放在相冊中的
  6. * 這裏使用的這種方式有一個好處就是獲取的圖片是拍照後的原圖
  7. * 若是不實用ContentValues存放照片路徑的話,拍照後獲取的圖片爲縮略圖不清晰
  8. */
  9. ContentValues values = new ContentValues();
  10. photoUri = this.context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
  11. Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
  12. intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);
  13. startActivityForResult(intent, ACTION_TAKE_PHOTO);

三、如何獲取圖片的存儲路徑,以字符串的形式返回:code

 
  1. private Uri photoUri;
  2. private String photoPath;
  3.  
  4. String[] pojo = {MediaStore.Images.Media.DATA};
  5. cursor = this.context.managedQuery(photoUri, pojo, null, null,null);
  6. if (null != cursor) {
  7. int columnIndex = cursor.getColumnIndexOrThrow(pojo[0]);
  8. cursor.moveToFirst();
  9. photoPath = cursor.getString(columnIndex);
  10. }

路徑獲取到了,擴展名固然不在話下了。orm

四、如何從Uri獲取到圖片的Bitmap對象:對象

 
  1. private Uri photoUri;
  2.  
  3. byte[] photoContent = readStream(this.context.getContentResolver().openInputStream(Uri.parse(photoUri.toString())));
  4. Bitmap photoBitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

五、如何對Bitmap進行壓縮,例如壓縮到原有大小的四分之一:圖片

 
  1. /**
  2. * 縮小返回圖片的尺寸
  3. * @param bitmap
  4. * @return
  5. */
  6. private Bitmap resizeBitmap(Bitmap bitmap) {
  7. Bitmap bitmapOrigin = bitmap;
  8. int widthOrigin = bitmapOrigin.getWidth();
  9. int heightOrigin = bitmapOrigin.getHeight();
  10.  
  11. Matrix matrix = new Matrix();
  12. matrix.postScale(0.25f, 0.25f);
  13.  
  14. Bitmap bitmapResized = Bitmap.createBitmap(bitmapOrigin, 0, 0, widthOrigin, heightOrigin, matrix, true);
  15. return bitmapResized;
  16. }

六、如何將Bitmap轉爲Base64字符串:

 
  1. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  2. bitmapResized.compress(Bitmap.CompressFormat.JPEG, 100, baos);
  3. byte[] data = baos.toByteArray();
  4.  
  5. baos.close();
  6.  
  7. return new String(Base64.encodeBase64(data), "utf-8");

七、如何在HTML頁面上顯示Base64數據格式的圖片:

首先界面上要有一個img標記,src屬性置爲空。

 
  1. <img src="" id="resultImage" name="resultImage" title="結果圖片"/>

而後用js將獲取到Base64圖片數據放置到img標記的src屬性中。

 
  1. var extension = ...;//圖片擴展名
  2. var base64 = ...;//Base64數據
  3. $("#resultImage").attr("src", "data:image/" + extension + ";base64," + base64.toString());

 

 

歡迎指正。

相關文章
相關標籤/搜索