一、系統權限
java
<uses-permission android:name="android.permission.CAMERA"></uses-permission>android
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />api
第一種方法:數組
startActivityForResult(new Intent("android.media.action.IMAGE_CAPTURE"), TAKE_PICTURE); protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == TAKE_PICTURE) { if (resultCode == RESULT_OK) { Bitmap bm = (Bitmap) data.getExtras().get("data"); img.setImageBitmap(bm);//想圖像顯示在ImageView視圖上, } } }
可是這種獲得的圖片是縮略圖,清晰度不夠,本人沒有找到得到原始大圖方法。app
本人使用的是第二種方法:基本思想是在點擊拍照時就創建起文件,當拍照完成後將bitmp填充進入ide
try { Intent takePictureIntent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent .resolveActivity(getPackageManager()) != null) { File photoFile = null; try { photoFile = createImageFile(); picPath = photoFile.getAbsolutePath(); } catch (IOException ex) { ex.printStackTrace(); } if (photoFile != null) { takePictureIntent.putExtra( MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); startActivityForResult(takePictureIntent, RESULT_take_pic); } } } catch (Exception e) { } public File createImageFile() throws IOException { String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss") .format(new Date()); String imageFileName = "JPEG_" + timeStamp + "_"; File storageDir = new File(DirectoryUtil.getPicDirectory()); if (!storageDir.isDirectory()) storageDir.mkdirs(); File image = File.createTempFile(imageFileName, /* prefix */ ".jpg", /* suffix */ storageDir /* directory */ ); return image; }
拍照成功後返回執行函數:
函數
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && requestCode == REQ_VIEW_IMAGE) { Log.e("zhy", requestCode + ""); mGrideAdapter.notifyDataSetChanged(); } else if (requestCode == RESULT_take_pic) { if(picPath ==null){ showLongToast("拍照失敗請選擇圖片上傳"); }else{ File file = new File(picPath); Long size = file.length(); if (size <= 0) { //拍照失敗刪除文件 if (file.exists()) { file.delete(); } } else { //拍照成功顯示圖片 NativeImageLoader.mSelectList.add(picPath); mGrideAdapter.notifyDataSetChanged(); } } } super.onActivityResult(requestCode, resultCode, data); }
上述方法能夠得到清晰的圖片。
spa
問題研究及解決:code
用上述第二種方法的時候本人發如今三星部分手機(如note3)上拍照後activity會重啓,若是不作任何處理重啓後全部當前狀態沒有返回picPath=null則會致使死機。orm
在想到是activity重啓致使狀態丟失,本人首先想到在銷燬前保存當前的現場狀態,重啓時回覆現場。即作以下處理:
/** * activity進入後臺變得可能被銷燬是調用 */ @Override protected void onSaveInstanceState(Bundle outState) { outState.putString("picPath", picPath); //保存當前拍照圖片的地址 List<String> lt = NativeImageLoader.mSelectList; outState.putString("mlistPath", ListToString(lt)); //保存已選擇的全部圖片地址可能多張 super.onSaveInstanceState(outState); } private String ListToString(List<String> list){ StringBuffer sb = new StringBuffer(); for(int i = 0; i<list.size(); i++){ String s = list.get(i); sb.append(s); sb.append(","); } return sb.toString(); } /** * 當actvity從非正常銷燬進入時調用 */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); addingPic(); //恢復界面控件的狀態 String listStr = savedInstanceState.getString("mlistPath"); if(listStr != null && !"".equals(listStr)){ String[] strs = listStr.split(","); NativeImageLoader.mSelectList.addAll(Arrays.asList(strs)); } picPath = savedInstanceState.getString("picPath"); //得到當前拍照圖片的地址 }
上述方法能夠解決此問題,可是本人還有一個地方不明白
outState.putStringArrayList(); //api中給出此方法能夠保存數組可是實際上得不到保存的數據 因而本人將數組轉換爲string中間用,分割,以下: outState.putString("mlistPath", ListToString(lt)); //保存已選擇的全部圖片地址可能多張
問題雖然解決了可是爲何會出現這樣的問題呢?後來我仔細查看了那個手機的拍照過程,中間好像是activity發生旋轉。後來我在mainfest中配置了android:configChanges="keyboardHidden|orientation|screenSize"此屬性。發現此問題解決了activity並無銷燬,如此證實個人猜測是正確的。注意keyboardHidden|orientation|screenSize必定要配置這三個屬性,一開始本人只配置兩個,致使後來纔想到了保持狀態的方法。此上兩種方法都可以解決此問題,明顯第二種要簡單不少!