1. 程式人生 > >android呼叫系統相機實現拍照功能

android呼叫系統相機實現拍照功能

在實現拍照的功能時遇到了很多問題,搜尋了很多資料,嘗試了很多辦法,終於解決了,下面簡要的描述下在開發過程中遇到的問題。

雖然之前看過android開發的書,但是沒有做過東西,這次也是臨時決定讓我做一個android採集系統的演示程式。拍照是其中一個功能,讓網搜尋了下拍照有兩種方式,其中一種就是呼叫系統相機實現拍照功能。

啟動照相機進行拍照,程式碼如下:

btnCamera.setOnClickListener(new Button.OnClickListener()
		{
			
			public void onClick(View v)
			{
				Intent i = new Intent("android.media.action.IMAGE_CAPTURE");  
	 			startActivityForResult(i, Activity.DEFAULT_KEYS_DIALER);  
			}
		});
獲取拍照後圖片資料,程式碼如下:
	@Override
	protected void onActivityResult(int requestCode, int resultCode,Intent data) 
	{
		switch(resultCode)
		{
		 case RESULT_OK:
		 	super.onActivityResult(requestCode, resultCode, data); 
			if(data!=null){
		    		Bundle extras = data.getExtras();  
		    		Bitmap bmp = (Bitmap) extras.get("data");  
		  
		    		ivstorepic.setImageBitmap(bmp);  //設定照片現實在介面上
		    		hasShootPic = true;//此變數是在提交資料時,驗證是否有圖片用
			}
			else
			{
				 hasShootPic = false;
			}
		    break;
			default:
				break;
		    }
		
	}
此時,遇到第一個問題,使用miui系統手機拍照時,無法獲取到照片資料,使用Log列印資料之後發現Bitmap bmp = (Bitmap) extras.get("data"); 處出現異常。然後搜尋了很多資料,問了很多人,都說這個程式碼沒有問題。但是問題還是要解決,後來想是不是可以把資料存放在SDcard上,然後讀取SDcard上資料顯示在圖形空間上。測試之後發現這樣可以實現。其中涉及到的變數定義如下:
public static final String SDCARD_ROOT_PATH = android.os.Environment.getExternalStorageDirectory().getAbsolutePath();//路徑
public static final String SAVE_PATH_IN_SDCARD = "/bi.data/"; //圖片及其他資料儲存資料夾
public static final String IMAGE_CAPTURE_NAME = "cameraTmp.png"; //照片名稱
public final static int REQUEST_CODE_TAKE_PICTURE = 12;//設定拍照操作的標誌

啟動相機進行拍照,程式碼如下:
btnCamera.setOnClickListener(new Button.OnClickListener(){
		public void onClick(View v) {
			// TODO Auto-generated method stub
			 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
	       	   	// 儲存卡可用 將照片儲存在 sdcard
	       	   	if(SimpleFileTool.isHasSdcard()){
	       	         		intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(SDCARD_ROOT_PATH+
	       		         		SAVE_PATH_IN_SDCARD,IMAGE_CAPTURE_NAME)));
	       	   }
	       	   startActivityForResult(intent, REQUEST_CODE_TAKE_PICTURE);
		}
    	});

獲取拍照後圖片資料,程式碼如下:
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (resultCode == RESULT_OK) {
			if(requestCode == REQUEST_CODE_TAKE_PICTURE){//拍照返回
				//儲存卡可用
				if(isHasSdcard()){
					getImage(SDCARD_ROOT_PATH+SAVE_PATH_IN_SDCARD+IMAGE_CAPTURE_NAME);
				}
				else{
				//儲存卡不可用直接返回縮圖 
				Bundle extras = data.getExtras(); 
				bitmap = (Bitmap) extras.get("data");
				img.setImageBitmap(bitmap);
					img.setVisibility(View.VISIBLE);
					hasShootPic = false;
				}		
                          }
		}
		super.onActivityResult(requestCode, resultCode, data);
}


         /**
	 * 檢查儲存卡是否插入
	 * @return
	 */
	public static boolean isHasSdcard()
	{
		String status = Environment.getExternalStorageState();
		if (status.equals(Environment.MEDIA_MOUNTED)){
		   return true;
		} else {
		   return false;
		}
	}
 	/* 獲得圖片 圖片高度 最大maxH
	 * @param imagePath
	 */
	Bitmap bitmap;
	int maxH = 200;//
	private void getImage(String imagePath){
		BitmapFactory.Options options = new BitmapFactory.Options();
        		options.inJustDecodeBounds = true;
        		// 獲取這個圖片的寬和高
        		bitmap = BitmapFactory.decodeFile(imagePath, options); //此時返回bm為空
         		//計算縮放比
        		int be = (int)(options.outHeight / (float)maxH);
        		int ys = options.outHeight % maxH;//求餘數
        		float fe = ys / (float)maxH;
        		if(fe>=0.5)be = be + 1;
        		if (be <= 0)
            		be = 1;
        		options.inSampleSize = be;
        
        		//重新讀入圖片,注意這次要把options.inJustDecodeBounds 設為 false
        		options.inJustDecodeBounds = false;
        		bitmap=BitmapFactory.decodeFile(imagePath,options);
        		img.setImageBitmap(bitmap);
        		img.setVisibility(View.VISIBLE);
	}

以上程式碼,實現功能實際上是直接把圖片儲存在SDcard內,然後讀取資料現實,後面之所以加上一個直接獲取資料返回的程式碼,是為了相容一些手機。測試了幾款手機後發現可正常,使用也算解決了目前遇到的問題。記錄下來,備忘。

相關推薦

android呼叫系統相機實現拍照功能

在實現拍照的功能時遇到了很多問題,搜尋了很多資料,嘗試了很多辦法,終於解決了,下面簡要的描述下在開發過程中遇到的問題。 雖然之前看過android開發的書,但是沒有做過東西,這次也是臨時決定讓我做一個android採集系統的演示程式。拍照是其中一個功能,讓網搜尋了下拍照有兩

解決Android呼叫系統相機連續拍照出現的記憶體溢位問題

記憶體溢位相信做過程式設計的人都知道一二,這裡說Android 記憶體溢位的問題:、問題描述:Android下的相機在獨自使用時,拍照沒有問題,通過我們的程式碼呼叫時,也正常,但是更換了不同廠商的平板,ROM由Android4.0變成了Android4.1後,拍照出現了Out

Android 呼叫系統相機拍照,並上傳圖片所注意的一些問題

其實android拍照這個地方還是有很多注意事項的,我在上個專案中就遇到一些坑,因此我想把它記錄下來,希望能幫助一些跟我遇到的同樣的問題的人 如果你在專案中遇到以下問題: 通過系統路徑,拍出來的圖片不清楚 在某些情況下,onActivityResult

android 呼叫 系統 相機 攝像機 拍照 拍視訊

主要內容如下:系統現有相機應用的呼叫 系統現有相機拍攝照片 獲取系統現有相機拍攝的圖片 系統現有相機拍攝圖片Demo 系統現有相機拍攝視訊 系統現有相機拍攝視訊Demo 系統現有相機應用的呼叫   對於如何呼叫系統現有應用,之前就有講解,這裡簡單再說一下。在開發的應用中呼叫

android 呼叫系統相機進行拍照及照片的裁切

呼叫系統相機進行拍照是android開發中常用到的功能,例如:拍照了直接發朋友圈等。還有常用的要進行圖片的裁剪,例如:上傳自己的頭像等。你又不能拍完照直接上傳,然後在讀取截止中間的,這樣不一定是使用者想要的部分。所以,我們通常是讓使用者自己按照我們的比例,來進行裁剪。這就

Android呼叫系統相機、相簿功能,適配6.0許可權獲取以及7.0以後獲取URI(相容多版本)

  Android中呼叫系統相機來拍攝照片的程式碼,如下:1、首先設定Uri獲取判斷以及相機請求Codepublicfinalint TYPE_TAKE_PHOTO = 1;//Uri獲取型別判斷publicfinalint CODE_TAKE_PHOTO = 1;//相機R

Android呼叫系統相機拍照並儲存到SD卡的兩種實現方式

1.呼叫照相機時通過putExtra的方式直接指定儲存路徑 String FilePath = "/sdcard/pic/"; File file = new File(FilePath); file.mkdirs();// 建立資料夾 Intent intent

Android呼叫系統相簿、拍照以及裁剪最簡單的實現(相容7.0)

/** * 相片工具類 */ public class PhotoUtils { private static final String TAG = "PhotoUtils"; /** * @param activity * 當前activity *

android呼叫系統相機拍照

獲取縮圖 直接調取相機拍照,無需任何許可權,但是隻能獲取到縮圖 Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (takePictureIntent.resolveActivit

android 呼叫系統相機拍照,返回的data為null

最近做專案,需要拍照功能,於是就想簡單的呼叫系統相機來完成這一需求(當然,如果想要個性化一點的,也可以自定義camera去實現,這裡暫時不做)。 if(Environment.getExternalStorageState().equals(Environ

android 呼叫系統相機拍照後圖片上顯示文字

 先說說自己的思路(有什麼欠缺的望噴。。。)    1、在xml 檔案寫入Imageview(用來顯示拍照圖片) 和textview (顯示想要顯示的文字)  2、將xml 佈局通過   LayoutInflater.from(context).inflate轉換為view檢

解決Android呼叫系統相機拍照後相片無法在相簿中顯示問題

目前自己使用傳送廣播實現了效果public void photo() { Intent openCameraIntent = new Intent(android.provider.MediaSt

Android 呼叫系統相機拍照的返回結果

  1.開啟相機的Intent Action: MediaStore.ACTION_IMAGE_CAPTURE,下面為它的註釋: /** * Standard Intent action that can be sent to have the camera app

Android 呼叫系統相機拍照 . 選取本地相簿

專案中,基本都有使用者自定義頭像或自定義背景的功能,實現方法一般都是呼叫系統相機–拍照,或者系統相簿–選擇照片,然後進行剪裁,最終設為頭像或背景。 我直接貼上使用的程式碼吧! 這次偷懶了,沒有做效果圖,不過這是我試過的程式碼,可以,只不過不能選取原圖,因為

Android呼叫系統相機拍照,從相簿中選擇照片,呼叫系統攝像機錄影

最近在Android Studio上折騰程式碼,昨天編譯器又很不給面子的報錯了: Error type 3 Error: Activity class {com.example.myapplication/com.example.myapplication

Android呼叫系統相機拍照 獲取原圖

拍照時候在onActivityResult中獲得相機拍照後點擊確定後的照片。 Android中用Intent提取縮圖和原始影象 可以接受照片的縮圖 Bundle bundle =data.ge

總結Android呼叫系統相機拍照遇到的坑

拍照功能在應用開發中幾乎已成為標配,例如使用者通過拍照上傳頭像。實現拍照功能的方式有兩種。第一種是使用相機API(即Camera類)來自定義拍照,第二種是使用Intent呼叫系統相機來拍照。其中最常見的方式是直接呼叫系統相機拍照來獲取照片。 呼叫系統相機獲取照片的流程如下,

android 呼叫系統相機拍照的各種異常處理

1 本文只討論呼叫系統相機出現的異常解決辦法下面是呼叫系統相機的程式碼 先看一下最簡單的寫法 Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); startAct

Android 呼叫系統相機拍照並且顯示在相簿中,以及中間可能會遇到的一些問題的解決

主要思路是在使用照相機拍照,然後為拍得的照片在SD卡新開一個儲存照片的檔案 程式碼:因為要呼叫照相機和SD卡所以需要新增以下許可權: 在manifests中新增 <uses-permission android:name="android.permission.CAM

Android調用相機實現拍照並裁剪圖片,調用手機中的相冊圖片並裁剪圖片

!= findview create 圖片剪裁 顯示 parent 學會 true mfile 在 Android應用中,非常多時候我們須要實現上傳圖片,或者直接調用手機上的拍照功能拍照處理然後直接顯示並上傳功能,以下將講述調用相機拍照處理圖片然後顯示和調用手機相冊中的