在Fragment中使用时回传要放到嵌套Fragment的Activity里面
private static final int CODE_GALLERY_REQUEST = 0xa0;
private static final int CODE_CAMERA_REQUEST = 0xa1;
private static final int CODE_RESULT_REQUEST = 0xa2;
private static final int CAMERA_PERMISSIONS_REQUEST_CODE = 0x03;
private static final int STORAGE_PERMISSIONS_REQUEST_CODE = 0x04;
/**
* 自动获取相机权限
*/
private void autoObtainCameraPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
ToastUtils.show("您已经拒绝过一次");
}
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE}, CAMERA_PERMISSIONS_REQUEST_CODE);
} else {//有权限直接调用系统相机拍照
if (hasSdcard()) {
fileUri = new File(getExternalCacheDir() + "/photo.jpg");
try {
if (fileUri.exists()) {
fileUri.delete();
}
fileUri.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
imageUri = Uri.fromFile(fileUri);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
imageUri = FileProvider.getUriForFile(XGActivity.this, "db.lanxing.xylm.fileprovider", fileUri);//通过FileProvider创建一个content类型的Uri
PhotoUtils.takePicture(this, imageUri, CODE_CAMERA_REQUEST);
} else {
ToastUtils.show("设备没有SD卡!");
}
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
//动态申请权限的回调方法:
case CAMERA_PERMISSIONS_REQUEST_CODE: {
//调用系统相机申请拍照权限回调
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
if (hasSdcard()) {
fileUri = new File(getExternalCacheDir() + "/photo.jpg");
try {
if (fileUri.exists()) {
fileUri.delete();
}
fileUri.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
imageUri = Uri.fromFile(fileUri);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
imageUri = FileProvider.getUriForFile(XGActivity.this, "db.lanxing.xylm.fileprovider", fileUri);//通过FileProvider创建一个content类型的Uri
PhotoUtils.takePicture(this, imageUri, CODE_CAMERA_REQUEST);
} else {
ToastUtils.show("设备没有SD卡!");
}
} else {
ToastUtils.show("请允许打开相机!!");
}
break;
}
case STORAGE_PERMISSIONS_REQUEST_CODE:
//调用系统相册申请Sd卡权限回调
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
PhotoUtils.openPic(this, CODE_GALLERY_REQUEST);
} else {
ToastUtils.show("请允许打操作SD卡!!");
}
break;
}
}
private int output_X = 480;
private int output_Y = 480;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case CODE_CAMERA_REQUEST://拍照完成回调
fileCropUri = new File(getExternalCacheDir().getPath() + "/crop_photo.jpg");
try {
if (fileCropUri.exists()) {
fileCropUri.delete();
}
fileCropUri.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
cropImageUri = Uri.fromFile(fileCropUri);
PhotoUtils.cropImageUri(this, imageUri, cropImageUri, 1, 1, output_X, output_Y, CODE_RESULT_REQUEST);
break;
case CODE_GALLERY_REQUEST://访问相册完成回调
if (hasSdcard()) {
fileCropUri = new File(getExternalCacheDir().getPath() + "/crop_photo.jpg");
try {
if (fileCropUri.exists()) {
fileCropUri.delete();
}
fileCropUri.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
cropImageUri = Uri.fromFile(fileCropUri);
Uri newUri = Uri.parse(PhotoUtils.getPath(this, data.getData()));
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
newUri = FileProvider.getUriForFile(this, "db.lanxing.xylm.fileprovider", new File(newUri.getPath()));
PhotoUtils.cropImageUri(this, newUri, cropImageUri, 1, 1, output_X, output_Y, CODE_RESULT_REQUEST);
} else {
ToastUtils.show("设备没有SD卡!");
}
break;
case CODE_RESULT_REQUEST:
String path = cropImageUri.getPath();
if (path != null) {
file = new File(path);
RequestBody requetbody = RequestBody.create(MediaType.parse("multipart/from-data"), file);
MultipartBody mybody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getName(), requetbody).build();
p.getPQiniuUpload(mybody.parts());
}
break;
}
}
}
/**
* 自动获取sdk权限
*/
private void autoObtainStoragePermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, STORAGE_PERMISSIONS_REQUEST_CODE);
} else {
PhotoUtils.openPic(this, CODE_GALLERY_REQUEST);
}
}
/**
* 检查设备是否存在SDCard的工具方法
*/
public static boolean hasSdcard() {
String state = Environment.getExternalStorageState();
return state.equals(Environment.MEDIA_MOUNTED);
}
在res目录下创建xml文件夹在创建provider_paths.xml文件
在AndroidManifest.xml里配置