首页 > 代码库 > 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。相冊和拍照button的点击事件

                // 相冊
		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文件。本地图片没问题,再换回拍照截图也没问题了


 


android项目中的拍照和本地图片截图