应用程序崩溃后拍摄照片,同时将结果提供给onActivityResult
问题描述:
我试图通过调用相机意图拍照并将其显示在图像视图中。我的代码几乎适用于所有设备,除了某些MI设备使用kitkat版本。这里是我的代码应用程序崩溃后拍摄照片,同时将结果提供给onActivityResult
private void initializeCameraIntent() {
Permiso.getInstance().requestPermissions(new Permiso.IOnPermissionResult() {
/* if (ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA)
== PackageManager.PERMISSION_DENIED){*/
@Override
public void onPermissionResult(Permiso.ResultSet resultSet) {
if (resultSet.areAllPermissionsGranted()) {
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File photoFile = null;
try {
photoFile = createImageFile();
} catch (IOException ex) {
Log.e(TAG, "onTileSelected: ", ex);
}
if (photoFile != null) {
Uri uri = Uri.fromFile(photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
imageUri = uri.toString();
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
}
} else {
Toast.makeText(MessagesFragment.this.getActivity(),
getString(R.string.msg_permission_required), Toast.LENGTH_LONG).show();
}
}
@Override
public void onRationaleRequested(Permiso.IOnRationaleProvided callback, String... permissions) {
Permiso.getInstance().showRationaleInDialog(null,
getString(R.string.msg_permission_required),
null, callback);
}
}, Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
protected File createImageFile() throws IOException {
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
String imageFileName = "IMG_" + timeStamp;
File storageDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES);
if (!storageDir.exists()) {
if (!storageDir.mkdirs()) {
return null;
}
}
return File.createTempFile(imageFileName, ".jpg", storageDir);
}
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
switch (requestCode) {
case REQUEST_IMAGE_CAPTURE:
if (!imageUri.isEmpty()) {
showSendImageFragment(imageUri);
imageUri = "";
}
break;
}
及以下一些设备抛出的异常
Caused by: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=65537, result=-1, data=null} to activity {com.xxx.xxx/com.xxx.xxx.view.activity.MainActivity}: java.lang.NullPointerException
请人帮我解决这个。它适用于所有其他设备。
答
它是一个MI设备安全issue.You不会能够得到您所选择的文件的直接路径,他们将只提供唯一的内容提供者URL 我建议你使用这个Coomar Picker Library。我还就死在同一个问题的这么多days.This是唯一的解决方案,我发现it.This将节省您的时间
,这里是为维基它WIKI
答
我觉得你imageUri正在成为当你的呼吁startActivityForResult(意向)空方法,您可以通过转到开发人员选项来在其他设备上复制问题,以便不要让活动选项克服 这个问题。覆盖在你的活动onSaveInstanceState
和onRestoreInstanceState
方法
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (imageUri != null){
outState.putString("cameraImageUri", imageUri.toString());
}
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState.containsKey("cameraImageUri")){
imageUri = Uri.parse(savedInstanceState.getString("imageUri"));
}
}
是您的外部存储在这些MI奇巧设备的SD卡?如果是,则在KitKat中写入SD卡时出现问题。 https://*.com/a/22603042/3635454 – pleft