2017-09-14 4 views
0

カメラの意図を呼び出すことによって画像を撮って、画像ビューで表示しようとしています。私のコードは、kitkatバージョンのMIデバイス以外のほとんどすべてのデバイスで動作します。ここに私のコードは、誰かが私がこれを固定助けてください画像を撮影して結果を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

をオーバーライドして、これらのマイルキットカットデバイスSDカードであなたの外部ストレージですか?はいの場合、KitKatのSDカードへの書き込みに問題があります。 https://stackoverflow.com/a/22603042/3635454 – pleft

答えて

0

そのMIデバイスのセキュリティ上の問題。選択したファイルの直接のパスを取得できません。コンテンツプロバイダのURLだけを提供します。 私はこのCoomar Picker Libraryを使用することを提案しました。非常に多くのdays.This私はit.Thisを発見した唯一の解決策は

あなたの時間を節約し、ここで私はあなたが(意図)startActivityForResultを呼び出しているとき、あなたのimageUriがnullになってきていると思う、それWIKI

0

のためのwikiですしますですメソッドを使用すると、他のデバイスで問題を再現することができます。 この問題。あなたの活動の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")); 
    } 
} 
関連する問題