2015-07-10 12 views
6

W mojej aplikacji przycisk przechwytywania służy do przechwytywania obrazu za pomocą kamery urządzenia, więc użyłem metody captureImage() w przypadku zdarzenia kliknięcia tego przycisku. Po kliknięciu przycisku wyrzucono wyjątek wskaźnika pustego. Nie mogłem zrozumieć, jak to się dzieje Czy ktoś może pomóc? Z góry dziękuję!Wskaźnik zerowy Wyjątek w pliku-URI?

przycisk przechwytywania na Create() metoda

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

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 pointer wyjątek na tej metodzie

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 jest null – DJphy

Odpowiedz

1

getOutputMediaFile (type) zwraca null.

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

Wracasz tutaj:

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

Czy dodano następujące uprawnienia

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

do manifestu?

+0

jeden jest getOutputMediaFileUri a druga jest Uri.fromFile (getOutputMediaFile (typ)) ; , różne metody – Gibs

+0

Zobacz moją zredagowaną odpowiedź. – barq

+0

Witam barq: możesz udzielić dokładnej odpowiedzi, ponieważ wciąż otrzymujemy wyjątek wskaźnika pustego, ponieważ kontrola wchodzi w mediaStorageDir.exists() – Anand

1

Moje rozwiązanie było proste.

Zrealizowano błąd. Android Manifest ustawił wartość maxSDKVersion na 18, jeśli chodzi o pozwolenie na zapis do pamięci masowej. Po usunięciu to działało idealnie.

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

Bezpośrednio skopiowałem kod do strony początkowej Androida. Mój problem polegał na tym, że uruchomiłem go na emulatorze. Dlatego uważam, że powyższy kod, którego użyłem, nie mógł ocenić mojego systemu plików.

0

W moim przypadku dowiedziałem się, że SDK w wersji 23 i nowszej może wymagać zezwolenia na wykonywanie czasu na zapisywanie pamięci zewnętrznej. Więc rozwiązane tak:

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

Uwaga: Można umieścić this zamiast context i activity powyżej jeżeli dotyczy

Powiązane problemy