2017-09-14 80 views
0

我试图通过调用相机意图拍照并将其显示在图像视图中。我的代码几乎适用于所有设备,除了某些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 

请人帮我解决这个。它适用于所有其他设备。

+0

是您的外部存储在这些MI奇巧设备的SD卡?如果是,则在KitKat中写入SD卡时出现问题。 https://stackoverflow.com/a/22603042/3635454 – pleft

回答

0

它是一个MI设备安全issue.You不会能够得到您所选择的文件的直接路径,他们将只提供唯一的内容提供者URL 我建议你使用这个Coomar Picker Library。我还就死在同一个问题的这么多days.This是唯一的解决方案,我发现it.This将节省您的时间

,这里是为维基它WIKI

0

我觉得你imageUri正在成为当你的呼吁startActivityForResult(意向)空方法,您可以通过转到开发人员选项来在其他设备上复制问题,以便不要让活动选项克服 这个问题。覆盖在你的活动onSaveInstanceStateonRestoreInstanceState方法

@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")); 
    } 
} 
相关问题