2015-07-10 17 views
6

Nella mia app è presente un pulsante di acquisizione per catturare un'immagine utilizzando la fotocamera del dispositivo, quindi ho utilizzato un metodo captureImage() sull'evento click di quel pulsante. Quando faccio clic sul pulsante viene lanciata un'eccezione di puntatore nullo. capisci come questo può aiutare qualcuno? Grazie in anticipo!Puntatore nullo Eccezione su file URI?

pulsante di acquisizione su su Create() Metodo

metodo

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 un'eccezione di puntatore su questo metodo

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) 
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()

+0

mediaStorageDir è nullo – DJphy

risposta

1

getOutputMediaFile (type) restituisce null.

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

State ritornando qui:

// 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; 
    } 
} 

Avete aggiunto il seguente autorizzazione

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

al vostro manifesto?

+0

uno è getOutputMediaFileUri e altro è Uri.fromFile (getOutputMediaFile (tipo)) ; , diversi metodi – Gibs

+0

Vedere la mia risposta modificata. – barq

+0

hi barq: puoi dare una risposta esatta poiché otteniamo ancora un'eccezione del puntatore nullo perché il controllo entra all'interno di mediaStorageDir.exists() – Anand

1

La mia soluzione era semplice.

Realizzato l'errore. Android Manifest ha collocato una versione maxSDK a 18 con il permesso di scrivere sullo spazio di archiviazione. Dopo aver rimosso ciò, funzionava perfettamente.

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

Ho copiato direttamente sul codice dalla pagina iniziale di Android. Il mio problema era che lo stavo eseguendo su emulatore. Quindi penso che il codice sopra che ho usato non possa valutare il mio file system.

0

Nel mio caso, ho scoperto che l'SDK versione 23 e successive potrebbe richiedere l'autorizzazione di runtime per la scrittura di memoria esterna. Così ho risolto in questo modo:

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); 
      } 
     } 
    } 

Nota: Si potrebbe mettere this invece di context e activity sopra, se applicabile