android调用相机和相册以及截图功能

第一次写这个也,也不知道怎么写,希望可以帮助到一些人吧 。下边我就直接上代码了  

 

 

先加权限    
    
    
    

调用相机

private void onCamera() {
    Intent intent = new Intent();
    File file = getOutputMediaFile();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {  //针对Android7.0,需要通过FileProvider封装过的路径,提供给外部调用
        imageUri = FileProvider.getUriForFile(this, getApplicationContext().getPackageName() + ".provider", file);//通过FileProvider创建一个content类型的Uri,进行封装
    } else { //7.0以下,如果直接拿到相机返回的intent值,拿到的则是拍照的原图大小,很容易发生OOM,所以我们同样将返回的地址,保存到指定路径,返回到Activity时,去指定路径获取,压缩图片
        imageUri = Uri.fromFile(file);
    }
    intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI
    startActivityForResult(intent, 100);//启动拍照

}

创建个图片文件

private File getOutputMediaFile() {
    File mediaStorageDir = new File(Environment.getExternalStorageDirectory()
            + "/Android/data/"
            + getApplicationContext().getPackageName()
            + "/Files");
    if (!mediaStorageDir.exists()) {
        if (!mediaStorageDir.mkdirs()) {
            return null;
        }
    }
    File mediaFile;
    String mImageName = "cut.png";
    mediaFile = new File(mediaStorageDir.getPath() + File.separator + mImageName);
    return mediaFile;
}

调用相册

private void onPhoto() {
    Intent gallery_Intent = new Intent(Intent.ACTION_PICK, null);
    gallery_Intent.setType("image/*");
    startActivityForResult(gallery_Intent, 200);
}

系统截图

//裁剪图片
private void performCrop(Uri uri) {
    try {
        Intent intent = new Intent("com.android.camera.action.CROP");
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        }

        intent.setDataAndType(uri, "image/*");
        intent.putExtra("crop", "true");
        intent.putExtra("aspectX", 2);
        intent.putExtra("aspectY", 3);
        intent.putExtra("outputX", 500);
        intent.putExtra("outputY", 750);
        intent.putExtra("scale", true);
        intent.putExtra("noFaceDetection", true);
        //裁剪之后,保存在裁剪文件中,关键
        // intent.putExtra("return-data", true);
        imageUri = Uri.parse("file://" + "/" + Environment.getExternalStorageDirectory().getPath() + "/" + "small.jpg");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        intent.putExtra("noFaceDetection", true);
        startActivityForResult(intent, 300);


    } catch (ActivityNotFoundException anfe) {
        String errorMessage = "你的设备不支持裁剪行为!";
        Toast toast = Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT);
        toast.show();
    }
}

写到这儿差不多就快完了   接下来是个回传值

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        case 100:
            try {
                if (null != imageUri) {

                    performCrop(imageUri);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;
        case 200:
            try {
                if (data.getData() != null) {

                    performCrop(data.getData());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            break;

        case 300:
            Bitmap bitmap = null;
            try {
                bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageUri));
                imageView.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                e.printStackTrace();

            }

            break;

    }


}

下边在给大家说一下7.0的 解决问题


    

file_paths



    
    

到这儿就结束了,希望可以帮助大家,不喜勿喷

 

点击下载demo

 

你可能感兴趣的:(android调用相机和相册以及截图功能)