安卓调用系统图库和相机

调用系统图库和相机拍照再系统裁剪处理


这里需要先讲解一下Intent的一些用法:

  1. Intent intent=Intent(String action, Uri uri),此方法的action可以传入系统定义好的action值:如启动相机,访问图库,启动裁剪等动作,uri为对应动作要访问到的资源,如某张照片的uri,或者整个系统图库的uri
  2. Intent.setDataAndType(Uri data, String type),此方法是设置访问资源的类型,如访问某张图片,可以设置data为这张图片的uri,type指定这张图片的类型

  • 启动系统图库
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, 1);
  • 启动系统相机
Intent intent1=new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri=Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/temp.jpg"));
//设置照片拍摄后的输出路径
intent1.putExtra(MediaStore.EXTRA_OUTPUT,uri);

startActivityForResult(intent1,2);
;
  • onActivityResult中处理返回结果,requestcode为1处理图库返回的结果,2处理裁剪返回的结果,3处理相机返回的结果
@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == 1 && resultCode == RESULT_OK) {
            Uri uri = data.getData();
            Cursor cursor = getContentResolver().query(uri, null, null, null, null);
            if (cursor != null && cursor.moveToFirst()) {
                path = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
  //path定义为全局变量,这里赋值后被裁剪功能中调用,为图片的绝对路径
                Log.i("path", path);

                Intent intent = new Intent("com.android.camera.action.CROP");
                intent.setDataAndType(uri, "image/*"); //表示Intent要打开的图片
                intent.putExtra("aspectX", 1);
                intent.putExtra("aspectY", 1);
               //裁剪照片比例
                intent.putExtra("outputX", 300);
                intent.putExtra("outputY", 300);
                //裁剪照片宽高
                intent.putExtra("return-data", true);
                startActivityForResult(intent, 2);
            }
        }else if(requestCode==2&&resultCode==RESULT_OK){

            Bitmap bitmap = data.getParcelableExtra("data");

            String filename=path.substring(path.lastIndexOf("/")+1);

            Log.i("path-file",filename);

            //此处裁剪完成后将照片从bitmap转成file格式,再将照片进行上传,因为使用的是Bmob云服务器
            //上传方法有所不同,所以此处不贴这两个方法的代码了,知道怎么处理即可
            File file=bitmapToFile(bitmap,filename);

            uploadHead(file);
            //显示裁剪后的照片
            iv_head.setImageBitmap(bitmap);

        }else if(requestCode==3&&resultCode==Rog.i("path",uriPath.toString());
           /**    
           Bundle bundle=data.getExtras();
            Bitmap bitmap=(Bitmap)bundle.get("data");
            Uri uriPath=null;
            if(data.getData()!=null){
                uriPath=data.getData();
            }else {
                uriPath=Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(),bitmap,null,null));
            }
            Log.i("path",uriPath.toString());
           **/

           //拍完照后将图片保存到此路径(此方法为保存原图比较清晰,上述代码则为缓存图是不清晰的几十k而已,建议用下面这种方法)
            File file=new File(Environment.getExternalStorageDirectory()+"/temp.jpg");
            Uri uriPath=Uri.fromFile(file);
            //同样设置path给后面的裁剪功能使用
            path=Environment.getExternalStorageDirectory()+"/temp.jpg";

            Intent intent = new Intent("com.android.camera.action.CROP");
            intent.setDataAndType(uriPath, "image/*"); //表示Intent要打开的图片
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
            intent.putExtra("outputX", 300);
            intent.putExtra("outputY", 300);
            intent.putExtra("return-data", true);
            startActivityForResult(intent, 2);
        }
    }

你可能感兴趣的:(安卓)