android相機拍照

一、系統權限
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必定要配置這三個屬性,一開始本人只配置兩個,致使後來纔想到了保持狀態的方法。此上兩種方法都可以解決此問題,明顯第二種要簡單不少!

相關文章
相關標籤/搜索