1

Ich entwickle eine App, in der es eine Schaltfläche gibt, mit der Bilder entweder aus der Galerie oder von der Kamera aufgenommen werden können. Wenn ich ein Bild aus der Galerie wähle, gibt es kein Fehlerbild, das am Ende gut aussieht, aber wenn ich das Bild von meiner Kamera-App aufzeichne, stürzt es ab.Fehler beim Ausgeben des Ergebnisses beim Auswählen eines Bildes aus der Kamera, aber kein Problem beim Auswählen eines Bildes aus der Galerie

Es folgt der Fehler:

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=66, result=-1, data=null} to activity 

{com.byteshaft.prospectform/com.byteshaft.prospectform.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.content.Intent.getData()' on a null object reference 
                       at android.app.ActivityThread.deliverResults(ActivityThread.java:4297) 
                       at android.app.ActivityThread.handleSendResult(ActivityThread.java:4347) 
                       at android.app.ActivityThread.-wrap20(ActivityThread.java) 
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1557) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:173) 
                       at android.app.ActivityThread.main(ActivityThread.java:6459) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:938) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:828) 
                      Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.net.Uri android.content.Intent.getData()' on a null object reference 
                       at com.byteshaft.prospectform.MainActivity.onActivityResult(MainActivity.java:400) 
                       at android.app.Activity.dispatchActivityResult(Activity.java:6926) 
                       at android.app.ActivityThread.deliverResults(ActivityThread.java:4293) 
                       at android.app.ActivityThread.handleSendResult(ActivityThread.java:4347)  
                       at android.app.ActivityThread.-wrap20(ActivityThread.java)  
                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1557)  
                       at android.os.Handler.dispatchMessage(Handler.java:102)  
                       at android.os.Looper.loop(Looper.java:173)  
                       at android.app.ActivityThread.main(ActivityThread.java:6459)  
                       at java.lang.reflect.Method.invoke(Native Method)  
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:938)  
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:828)  

Mein Code Bild aus der Galerie/Kamera zum Aufnehmen:

public void openImageIntent() { 

     File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 

     String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String fname = "Prospect-form" + timeStamp; 

     final File sdImageMainDirectory = new File(storageDir, fname); 
     outputFileUri = Uri.fromFile(sdImageMainDirectory); 

     // Camera. 
     final List<Intent> cameraIntents = new ArrayList<>(); 
     final Intent captureIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
     final PackageManager packageManager = getPackageManager(); 
     final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0); 
     for(ResolveInfo res : listCam) { 
      final String packageName = res.activityInfo.packageName; 
      final Intent intent = new Intent(captureIntent); 
      intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
      intent.setPackage(packageName); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri); 
      cameraIntents.add(intent); 
     } 


     //Gallery. 
     Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 

     // Filesystem. 
     final Intent fsIntent = new Intent(); 
     fsIntent.setType("*/*"); 
     fsIntent.setAction(Intent.ACTION_GET_CONTENT); 
     cameraIntents.add(fsIntent); 



     //Create the Chooser 
     final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source"); 
     chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()])); 

     startActivityForResult(chooserIntent, 66); 
    } 

onActivityResult Code: `

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if(resultCode == Activity.RESULT_OK) 
      switch (requestCode){ 
       case 5: 
        Uri selectedImage = data.getData(); 
        try { 
         Bitmap bitmap = MediaStore.Images.Media.getBitmap(MainActivity.this.getContentResolver(), selectedImage); 
         Bitmap resizedBitMap; 
         resizedBitMap = Bitmap.createScaledBitmap(bitmap, 100, 100, true); 
         imageView.setImageBitmap(resizedBitMap); 
         System.out.println(Helpers.getPath(MainActivity.this, selectedImage)); 
         imagePath = Helpers.getPath(MainActivity.this, selectedImage); 

        } catch (IOException e) { 
         Log.i("TAG", "Some exception " + e); 
        } 
        break; 
      } 
    }` 

gibt es einige sehr nützliche Antworten auf Stackoverflow, aber ich kann mein Problem nicht lösen m. Nur der Fehler kommt, wenn ich ein Bild von der Kamera nehme, sonst gibt es überhaupt keinen Fehler, wenn ich Bild von der Galerie wähle.

Irgendwelche Vorschläge?

Antwort

1

Das passiert, weil das Aufnehmen eines Bildes von der Kamera und von der Galerie nicht das gleiche Ergebnis liefert, Sie müssen überprüfen, welches der Benutzer gewählt hat, indem Sie die Absicht betrachten; Sie können es auf diese Weise tun

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == mRequestCode) { 
      if (resultCode == Activity.RESULT_OK) { 
       boolean isCamera = true; 
       if (data != null && data.getData() != null) { 
        String action = data.getAction(); 
        isCamera = MediaStore.ACTION_IMAGE_CAPTURE.equals(action); 
       } 

       try { 
        Uri uriFileSrc = isCamera ? mOutputFileUri : data.getData(); 

        //Do what do you need with the Uri 

       } catch (Exception ex) { 
        Toast.makeText(mActivity, R.string.error_creating_file, Toast.LENGTH_SHORT).show(); 
       } 
      } 
     } 
} 
+0

Perfekt! Es hat funktioniert, danke! –

Verwandte Themen