这两天写了一下相机的使用,看了网上很多文章,不是很全的,在我自己弄出来之后,做了一个整理归纳。我用的是Android6.0真机测试,华为手机。

1、Android6.0以上,在调用相机权限时,必须要动态注册。 验证权限+重写权限



//相机权限标记,camera_permission为标记,根据你自己的标记喜好设置
private static final int camera_permission = 4;
/*
* 验证相机权限
*
*/
public static boolean cameraPermissions(Activity activity){
    if (Build.VERSION.SDK_INT < 23){
        return true;
    }
    int permission = ContextCompat.checkSelfPermission(activity, android.Manifest.permission.CAMERA);
    //
    if (permission != PackageManager.PERMISSION_GRANTED){
        ActivityCompat.requestPermissions(activity,new String[]{Manifest.permission.CAMERA},camera_permission);
        return false;
    }else {
        return true;
    }
}

//重写相机权限
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        //标记
        case camera_permission:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // 许可
            } else {
                // 权限被拒绝
                Toast.makeText(CameraActivity.this, "你禁用了相机权限", Toast.LENGTH_SHORT).show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

2、调用系统相机照相  

//图片的一个输出路径
private Uri imageUri;
//图片地址
private File outputImage;
//图片存放的文件夹地址
private File file;
//照相
private void photoGraph() {

    //建一个文件夹,保存图片的路径
    file = new File(Environment.getExternalStorageDirectory(),"/DCIM/");
    if (!file.exists()){
        file.mkdir();
    }
    /**
     * 这里将时间作为不同照片的名称
     */
    outputImage=new File(file,System.currentTimeMillis()+".PNG");

    /**
     * 如果该文件已经存在,则删除它,否则创建一个
     */
    try {
        if (outputImage.exists()) {
            outputImage.delete();
        }
        outputImage.createNewFile();
    } catch (Exception e) {
        e.printStackTrace();
    }
    if (Build.VERSION.SDK_INT >= 24) {
        imageUri = FileProvider.getUriForFile(this,"com.android.ted.gank.fileprovider", outputImage);
    } else {
        imageUri = Uri.fromFile(outputImage);
    }

    //调用系统相机
    Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
    intent.addCategory(Intent.CATEGORY_DEFAULT);
    //设置图片输出地址
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    //作一个标记,在重写onActivityResult()方法中调用
    startActivityForResult(intent, CAMERA_REQUEST_CODE);
}

3、选择手机中的照片

// 相册选择标记
private static final int PHOTO_REQUEST_GALLERY = 3;
//选择手机中的照片
private void selectPicture(){
    //打开资源库
    Intent intentSel = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intentSel, PHOTO_REQUEST_GALLERY); //PHOT_REQUEST_GALLERY标记,重写onActivityResult()调用
}

4、图片剪切

//图片剪切标记
private static final int PHOTO_REQUEST_CUT = 2;
//图片剪切
    private void setCrop(Uri imageUri){
        //裁剪界面
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.setDataAndType(imageUri, "image/*");
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

        // 设置裁剪
        intent.putExtra("crop", "true");
        // aspectX , aspectY :宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);

        // 裁剪后输出图片的尺寸大小
        intent.putExtra("outputImageX", 80);
        intent.putExtra("outputImageY", 80);

//        intent.putExtra("outputImageFormat", "JPEG");// 图片格式
//        intent.putExtra("noFaceDetection", true);// 取消人脸识别

        intent.putExtra("return-data", false);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
        // 图片剪切标记,重写onActivityResult()中调用,PHOTO_REQUEST_CUT值根据自己喜好设置
        startActivityForResult(intent, PHOTO_REQUEST_CUT);
    }

5、重写onActivityResult()方法

//注意:在使用时,一定要判断data数据是否为空,否则会出现各种找不到或者无法选取图片错误。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {
        case CAMERA_REQUEST_CODE:                   //照相标记,并剪切图片
            //此处如果不作判断,将会出现如果不点击照相,直接返回时,会生成一个空文件。
            if (resultCode == Activity.RESULT_OK){
                //通过intent,将照片保存到手机中
                Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
                intent.setData(imageUri);
                this.sendBroadcast(intent);
                setCrop(imageUri);
            }
            break;
        case PHOTO_REQUEST_CUT:                     //图片剪切标记,并显示图片
            if (data != null){
                showPicture(imageUri);
            }
            break;
        case PHOTO_REQUEST_GALLERY:                 //相册获取标记,并剪切图片
            if (data != null){
                imageUri = data.getData();
                setCrop(imageUri);
            }
            break;
    }
    super.onActivityResult(requestCode, resultCode, data);
}

6、布局初始化和点击事件

private ImageView heardImage;
private Button system_picture;
private Button take_photo;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.camera_activity);
    init();
}

private void init(){
    cameraPermissions(this);
    heardImage= findViewById(R.id.heardImage);
    system_picture = findViewById(R.id.system_picture);
    system_picture.setOnClickListener(this);
    take_photo = findViewById(R.id.take_photo);
    take_photo.setOnClickListener(this);
}
@Override
public void onClick(View view) {
    switch (view.getId()){
        case R.id.take_photo:
                photoGraph();
            break;
        case R.id.system_picture:
            selectPicture();
            break;
    }
}

7、布局界面

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/heardImage"
        android:src="@mipmap/ic_launcher"
        android:layout_centerInParent="true"
        android:layout_width="200px"
        android:layout_height="200px" />

    <Button
        android:id="@+id/system_picture"
        android:text="系统照片"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:id="@+id/take_photo"
        android:text="点击照相"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />
</RelativeLayout>