2015-07-10 18 views
6

In meiner App ist ein Capture-Button vorhanden, um ein Bild mit Gerätekamera zu erfassen, so habe ich eine Methode captureImage() auf das Click-Ereignis dieser Schaltfläche verwendet.Wenn ich auf die Schaltfläche klicken, wird eine Nullzeiger-Ausnahme ausgelöst.Ich konnte nicht verstehe, wie das passiert Kann jemand helfen? Danke im Voraus!Nullzeiger Ausnahme für Datei-URI?

Aufnahmetaste auf auf Create() Methode

photoButton.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      /* 
      Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
      startActivityForResult(cameraIntent, CAMERA_REQUEST);*/ 
      captureImage(); 
     } 
    }); 

captureImage() Methode

private void captureImage() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE); 

    intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

    // start the image capture Intent 
    startActivityForResult(intent, CAMERA_REQUEST); 
} 

Null-Zeiger-Ausnahme auf dieser Methode

public Uri getOutputMediaFileUri(int type) { 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

/** 
* returning image/video 
*/ 
private static File getOutputMediaFile(int type) { 

    // External sdcard location 
    File mediaStorageDir = new File(
      Environment 
        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      Config.IMAGE_DIRECTORY_NAME); 

    // Create the storage directory if it does not exist 
    if (!mediaStorageDir.exists()) { 
     if (!mediaStorageDir.mkdirs()) { 
      Log.d(TAG, "Oops! Failed create " 
        + Config.IMAGE_DIRECTORY_NAME + " directory"); 
      return null; 
     } 
    } 

    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", 
      Locale.getDefault()).format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator 
       + "IMG_" + timeStamp + ".jpg"); 
    } else { 
     return null; 
    } 

    return mediaFile; 
} 

Logcat

java.lang.NullPointerException: file 
     at android.net.Uri.fromFile(Uri.java:447) 
     at com.riafy.user.imagegallerydemo.MainActivity.getOutputMediaFileUri(MainActivity.java:235) 
     at com.riafy.user.imagegallerydemo.MainActivity.captureImage(MainActivity.java:97) 
     at com.riafy.user.imagegallerydemo.MainActivity.access$100(MainActivity.java:29) 
     at com.riafy.user.imagegallerydemo.MainActivity$2.onClick(MainActivity.java:68) 
     at android.view.View.performClick(View.java:4761) 
     at android.view.View$PerformClick.run(View.java:19767) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5312) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
+0

mediaStorageDir ist null – DJphy

Antwort

1

getOutputMediaFile (Typ) gibt null zurück.

public Uri getOutputMediaFileUri(int type) { 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

Sie kehren hier:

// Create the storage directory if it does not exist 
if (!mediaStorageDir.exists()) { 
    if (!mediaStorageDir.mkdirs()) { 
     Log.d(TAG, "Oops! Failed create " 
       + Config.IMAGE_DIRECTORY_NAME + " directory"); 
     return null; 
    } 
} 

Haben Sie addierten folgende Erlaubnis

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

zu Ihrem Manifest?

+0

ist getOutputMediaFileUri und andere ist Uri.fromFile (getOutputMediaFile (Typ)) ; , verschiedene Methoden – Gibs

+0

Siehe meine bearbeitete Antwort. – barq

+0

Hallo Barq: können Sie genaue Antwort geben, wie wir immer noch null Zeiger Ausnahme erhalten, weil Steuerelement in mediaStorageDir.exists() eingeben – Anand

1

Meine Lösung war einfach.

Realisierte den Fehler. Android Manifest hatte eine maxSDKVersion auf 18 gesetzt, um in den Speicher schreiben zu können. Nach dem Entfernen funktionierte es perfekt.

1
File mediaStorageDir = new File(
      Environment 
        .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), 
      Config.IMAGE_DIRECTORY_NAME); 

Ich kopierte direkt auf Code von Android erste Seite begonnen. Mein Problem war, dass ich es auf Emulator laufen ließ. Daher glaube ich, dass der Code, den ich verwendet habe, mein Dateisystem nicht beurteilen konnte.

0

In meinem Fall habe ich herausgefunden, SDK-Version 23 und up benötigt möglicherweise Laufzeit-Berechtigung zum Schreiben von externem Speicher. So löste ich wie folgt aus:

public Uri getOutputMediaFileUri(int type) { 
     requestRuntimePermission(); 
     return Uri.fromFile(getOutputMediaFile(type)); 
    } 

public void requestRuntimePermission() { 
     if (Build.VERSION.SDK_INT >= 23) { 
      if (ContextCompat.checkSelfPermission(context,android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
        != PackageManager.PERMISSION_GRANTED) { 
       ActivityCompat.requestPermissions(activity, 
         new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); 
      } 
     } 
    } 

Hinweis: Sie this setzen könnte statt context und activity oben ggf.

Verwandte Themen