码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2014-09-28 16:55:53      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:android   io   os   ar   java   for   文件   数据   sp   

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


 


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

标签:android   io   os   ar   java   for   文件   数据   sp   

原文地址:http://blog.csdn.net/superjunjin/article/details/39525663

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!