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

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

 

 

先加权限    
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.CAMERA"/>

调用相机

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的 解决问题

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.youranning.cutimage.provider"
    android:exported="false"
    android:grantUriPermissions="true">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>

file_paths

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <root-path path="." name="camera_photos" />
    <external-path path="." name="files_root" />
</paths>

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

 

点击下载demo

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值