Android呼び出しシステムカメラで撮影機能を実現


写真を撮る機能を実現する際に多くの問題に直面し、多くの資料を検索し、多くの方法を試み、ついに解決した.以下、開発過程で出会った問題を簡単に説明する.
以前androidが開発した本を読んだことがありますが、何もしたことがありません.今回もandroid採集システムのデモプログラムを作ることにしました.写真を撮るのはその中の1つの機能で、ネットに下の写真を検索させて2つの方式があって、その中の1つはシステムカメラを呼び出して写真を撮る機能を実現します.
カメラを起動して写真を撮るコードは以下の通りです.
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に直接格納し、データの現実を読み取り、その後、直接データを取得して返すコードを追加したのは、一部の携帯電話との互換性のためです.いくつかの携帯電話をテストしたところ、正常であることがわかり、使用も現在直面している問題を解決した.メモをとる.