Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android項目中的拍照和本地圖片截圖

android項目中的拍照和本地圖片截圖

編輯:關於Android編程

1,得到保存截圖文件的地址

private static final String IMAGE_FILE_LOCATION = Environment.getExternalStorageDirectory()+"/temp.jpg";


private Uri imageUri;


imageUri = Uri.fromFile(new File(IMAGE_FILE_LOCATION));


2,相冊和拍照按鈕的點擊事件

                // 相冊
		imageViewLocalPhoto.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
				intent.setDataAndType(
						MediaStore.Images.Media.EXTERNAL_CONTENT_URI,//content://media/external/images/media
						IMAGE_UNSPECIFIED);
				startActivityForResult(intent, PHOTOZOOM);
			}
		});

		// 拍照
		imageViewTakePhoto.setOnClickListener(new OnClickListener() {

			public void onClick(View v) {
				Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
				intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(
						Environment.getExternalStorageDirectory(), "temp.jpg")));
				System.out.println("============="
						+ Environment.getExternalStorageDirectory());
				startActivityForResult(intent, PHOTOHRAPH);
			}
		});

3,在onActivityResult回調方法中

拍照和本地圖片傳入的uri不同

 // 拍照 顯示圖片頁面
		if (requestCode == PHOTOHRAPH) {
			
			startPhotoZoom(imageUri);
		}

		// 讀取相冊縮放圖片 顯示圖片頁面
		if (requestCode == PHOTOZOOM) {
			
			startPhotoZoom(data.getData());
		}

4,截圖方法

public void startPhotoZoom(Uri uri, int flag) {

			Intent intent = new Intent("com.android.camera.action.CROP");
			intent.setDataAndType(uri, "image/*");
			intent.putExtra("crop", "true");
			intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//圖像輸出
			intent.putExtra("outputFormat",
					Bitmap.CompressFormat.JPEG.toString());
			intent.putExtra("noFaceDetection", true);
			intent.putExtra("return-data", false);//回調方法data.getExtras().getParcelable("data")返回數據為空
			startActivityForResult(intent, PHOTORESOULT);
		

}


5,回調方法返回截圖結果

@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		
	    // 處理結果 處理縮放過後的圖片
	    if (requestCode == PHOTORESOULT) {
                flag_layout = "layout2";
		Bundle extras = data.getExtras();
		if (extras != null) {
		    photo = extras.getParcelable("data");			
		}
            if(photo==null)//加載本地截圖
            {
            	Bitmap bm = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/temp.jpg");
            	imageView.setImageBitmap(bm);
            }
            else//加載接收的圖片數據
            {												
    	        imageView.setImageBitmap(photo);
            }

	  }

	  super.onActivityResult(requestCode, resultCode, data);
	}

傳統的截圖方法為:1,不加這句intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//圖像輸出,,

2,這句改為返回數據為true:intent.putExtra("return-data", true);

3,也就沒有剪切後的輸出圖片,通過data.getExtras().getParcelable("data")接收返回的圖像數據

說明:經試驗,傳統的截圖方法經常死機,報綁定數據過大的錯誤,所以改用本例的方法比較好用了,就是截好圖片後,直接加載本地圖片就好了

bug:如果刪除temp.jpg文件後,拍照截圖時會一直截刪掉的temp.jpg文件,本地圖片沒問題,再換回拍照截圖也沒問題了



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved