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


     


  • 相关阅读:
    I/O性能优化
    磁盘性能指标
    磁盘I/O工作原理
    文件系统工作原理
    Linux命令行工具之free命令
    内存性能优化
    内存工作原理
    内存中的Buffer和Cache的区别
    proc文件系统
    oracle 查询 LOB 字段大小
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6760070.html
Copyright © 2020-2023  润新知