Android realizes the function of taking pictures and screenshots

1. Configure AndroidManifest.xml

<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" />

2. Code part

public class MainActivity extends AppCompatActivity implements View.OnClickListener, EasyPermissions.PermissionCallbacks {
    
    
	private String[] permissions = {
    
    Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE};//获取权限参数
    private Uri imageUri;//拍照图片uri
    private Uri cropImgUri;//裁剪图片uri
    private File tempFile;//拍照图片
    private File file_headimg;//装束图片

	//拍照请求码
    public static final int TAKE_PHOTO = 1;
    //剪裁请求码
    private static final int CROP_REQUEST_CODE = 2;
	//拍照按钮
	Button btn_camera;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.person_myinformation);
        btn_camera= (Button) findViewById(R.id.btn_camera);
        btn_camera.setOnClickListener(this);
    }
    //监听事件
	@Override
    public void onClick(View v) {
    
    
        int id = v.getId();
        if (id == R.id.btn_camera) {
    
    
        	getPermission();
        }
	}
	
	/**
     *1、获取相应权限
     */
    private void getPermission() {
    
    
        if (EasyPermissions.hasPermissions(this, permissions)) {
    
    
            //已经打开权限
            Toast.makeText(this, "已经申请相关权限", Toast.LENGTH_SHORT).show();
            goCamera();
        } else {
    
    
            //没有打开相关权限、申请权限
            EasyPermissions.requestPermissions(this, "需要获取您的相册、照相使用权限", 1, permissions);
        }
    }
    
    /**
     * 处理权限申请的回调结果
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    
    
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //框架要求
        EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this);
    }

    /**
     *2、权限申请成功返回函数
     */
    @Override
    public void onPermissionsGranted(int requestCode, List<String> perms) {
    
    
        Toast.makeText(this, "相关权限获取成功", Toast.LENGTH_SHORT).show();
        goCamera();
    }

    /**
     * 权限申请失败返回函数
     */
    @Override
    public void onPermissionsDenied(int requestCode, List<String> perms) {
    
    
        Toast.makeText(this, "请同意相关权限,否则功能无法使用", Toast.LENGTH_SHORT).show();
    }

	/**
     * 3、拍照
     */
    public void goCamera() {
    
    
        tempFile = new File(getExternalCacheDir(), "output_image.jpg");
        try {
    
    
            if (tempFile.exists()) {
    
    
                tempFile.delete();
            }
            tempFile.createNewFile();
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
        //调用系统拍照
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    
    
            imageUri = FileProvider.getUriForFile(this, "com.megainpad.homework.fileprovider", tempFile);
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        } else {
    
    
            imageUri = Uri.fromFile(tempFile);
        }
        //输出到imageUri
        intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
        startActivityForResult(intent, TAKE_PHOTO);
    }
    
	/**
     * 4、裁剪
     */
    private void cropPhoto(Uri imageUri) {
    
    
    	//调用系统裁剪
        Intent intent = new Intent("com.android.camera.action.CROP");
        intent.putExtra("scale", true);
        //新增宽高比
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);
        //新增输出尺寸设定
        intent.putExtra("outputX", 150);
        intent.putExtra("outputX", 150);
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
        intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        intent.putExtra("return-data", false);
        intent.setDataAndType(imageUri, "image/*");
        intent.putExtra(MediaStore.EXTRA_OUTPUT, cropImgUri);
        startActivityForResult(intent, CROP_REQUEST_CODE);
    }

	/**
     *5、活动回调函数
     */
    @TargetApi(LOLLIPOP)
    @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    
    
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
    
    
            case TAKE_PHOTO:
                if(resultCode == RESULT_OK){
    
    
                	//拍照结束,进行裁剪工作
                    cropPhoto(imageUri);
                }
                break;
            case CROP_REQUEST_CODE:     //调用剪裁后返回
                cropImgUri = Uri.fromFile(tempFile );
                //此处进行裁剪后的图片处理操作
                ......
                break;
            default:
                break;

        }
    }

}

There is also a problem with the code: the camera function can be implemented on the emulator, but the cropped pictures cannot be displayed on the emulator; however, Android phones can perform the camera and crop functions normally.

Which friend found the problem, I hope I can exchange and discuss more!

Guess you like

Origin blog.csdn.net/weixin_43477545/article/details/106970701