public static final int TAKE_PHOTO = 1;
public static final int CHOOSE_PHOTO = 2;
public static final int CROP_REQUEST_CODE = 5;
/**
* 文件相关
*/
private File outputImage;
private Uri imageUri;
private File cropImageFile;
private Uri cropImageUri;
/**
* 照片选择弹框
*/
private void showSelectorPhotoDialog() {
final RxPermissions rxPermissions = new RxPermissions(this);
final SelectorPhotosDialog photosDialog = new SelectorPhotosDialog(MyInfoActivity.this);
photosDialog.show();
//选择相机
photosDialog.OnClickCamera(new View.OnClickListener() {
@Override
public void onClick(View v) {
//请求相机权限
rxPermissions.request(Manifest.permission.CAMERA).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if (aBoolean){
openCarema();
}else {
toSystemSetting();
}
}
});
photosDialog.dismiss();
}
});
//选择相册
photosDialog.OnClickPhotos(new View.OnClickListener() {
@Override
public void onClick(View v) {
//请求相册权限
rxPermissions.request(Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE).subscribe(new Consumer<Boolean>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if (aBoolean){
openAlbum();
}else {
toSystemSetting();
}
}
});
photosDialog.dismiss();
}
});
}
/**
* 当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置
*/
public void toSystemSetting() {
SystemSettingDialog settingDialog = new SystemSettingDialog();
settingDialog.showDialog(MyInfoActivity.this);
}
/**
* 打开相机
*/
private void openCarema() {
//创建File对象,用于存储拍照后的照片
outputImage = new File(getExternalCacheDir(), "head.jpg");
if (outputImage.exists()) {
outputImage.delete();
}
try {
outputImage.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
if (Build.VERSION.SDK_INT >= 24) {
imageUri = FileProvider.getUriForFile(MyInfoActivity.this, getPackageName()+".fileProvider", outputImage);
} else {
imageUri = Uri.fromFile(outputImage);
}
//启动相机程序
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, TAKE_PHOTO);
}
/**
* 打开相册
*/
private void openAlbum() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");
startActivityForResult(intent, CHOOSE_PHOTO);
}
/**
* 裁剪图片
*/
private void cropPhoto(Uri uri) {
cropImageFile = new File(getExternalCacheDir(), "crop_head.jpg");
try {
if (cropImageFile.exists()){
cropImageFile.delete();
}
cropImageFile.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
cropImageUri = Uri.fromFile(cropImageFile);
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 300);
intent.putExtra("outputY", 300);
intent.putExtra("return-data", false);//注意这里返回false,因为在部分手机上获取不到返回的数据
intent.putExtra(MediaStore.EXTRA_OUTPUT,cropImageUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivityForResult(intent, CROP_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode==RESULT_OK){
switch (requestCode) {
case TAKE_PHOTO:
cropPhoto(imageUri);
break;
case CHOOSE_PHOTO:
cropPhoto(data.getData());
break;
case CROP_REQUEST_CODE:
Bitmap headImage = null;
try {
headImage = BitmapFactory.decodeStream(getContentResolver().openInputStream(cropImageUri));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
infoitem1.setAvater(headImage);
break;
default:
break;
}
}
}
进入系统权限设置弹框
public class SystemSettingDialog {
public void showDialog(final Context context){
//当拒绝了授权后,为提升用户体验,可以以弹窗的方式引导用户到设置中去进行设置
new AlertDialog.Builder(context)
.setMessage("需要开启权限才能使用此功能")
.setPositiveButton("设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//引导用户到设置中去进行设置
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.fromParts("package", context.getPackageName(), null));
context.startActivity(intent);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
//finish();
}
})
.create()
.show();
}
}