1、配置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、代码部分
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;
}
}
}
代码还存在一个问题:模拟器上可以实现拍照功能,但裁剪后的图片不能展示在模拟器上;然而Android手机可以正常实现拍照和裁剪功能。
哪位朋友发现问题所在,希望可以多交流讨论!