uri.getLastPathSegment() führt zum Absturz

  • 5 Antworten
  • Letztes Antwortdatum
B

BlupBlup

Ambitioniertes Mitglied
1
Hi,

in meiner Activity habe ich einen Button. Wenn dieser Button gedrückt wird,
dann wird die Methode startPictureCamera(View view) aufgerufen.
Diese startet über startActivityForResult die Kamera.
Nachdem der Benutzer ein Foto gemacht hat, wird wieder zur aufrufenden Activity gewechselt und die Methode onActivityResult aufgerufen.
In onActivityResult wollte ich mir den Pfad ausgeben lassen, wo das Foto
abgelegt wurde. Beim dem Aufruf von uri.getLastPathSegment() stürzt
mir allerdings die App ab mit der unten angegeben Fehlermeldung.
Worin liegt der Fehler?

Code:
    public void startPictureCamera(View view)
    {    
        try
        {
            Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            int numberOfPictureFiles = new File(this.getExternalFilesDir(null) + File.separator + "coolMINT" + File.separator + "Bilder"  + File.separator + GroupColor.StringValueOf(StatusInfo.ACTUAL_GROUP_COLOR)).listFiles().length + new File(this.getExternalFilesDir(null) + File.separator + "coolMINT" + File.separator + "Bilder" + File.separator + GroupColor.StringValueOf(StatusInfo.ACTUAL_GROUP_COLOR) + File.separator + "Hidden_Files").listFiles().length;
            File file = new File(this.getExternalFilesDir(null) + File.separator + "coolMINT" + File.separator + "Bilder"  + File.separator + GroupColor.StringValueOf(StatusInfo.ACTUAL_GROUP_COLOR) + File.separator + GroupColor.StringValueOf(StatusInfo.ACTUAL_GROUP_COLOR) + "_" + numberOfPictureFiles + ".jpg");
            Uri uri = Uri.fromFile(file);
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            this.startActivityForResult(intent, Constants.RQC_PICTURE);
        }
        catch(ActivityNotFoundException e)
        {
            Toast toast = Toast.makeText(this, "Kein Zugriff auf Kamera möglich", Toast.LENGTH_SHORT);
            toast.show();
        }
    }


    protected void onActivityResult(int requestCode, int resultCode, Intent data)
    {
         if (requestCode == Constants.RQC_PICTURE)
        {
            Toast.makeText(this, "requestCode == Constants.RQC_PICTURE", Toast.LENGTH_SHORT).show();
            
           if(resultCode == RESULT_OK)
           {                 
               Toast.makeText(this, "resultCode == RESULT_OK", Toast.LENGTH_SHORT).show();

                Uri uri = (Uri)data.getExtras().get("result");
                String filename = uri.getLastPathSegment(); 
                Toast.makeText(this, filename + " gespeichert", Toast.LENGTH_SHORT).show();
           }
        }
    }
10-16 16:18:37.107: E/AndroidRuntime(19472): FATAL EXCEPTION: main
10-16 16:18:37.107: E/AndroidRuntime(19472): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=4, result=-1, data=Intent { act=inline-data dat=file:///mnt/sdcard/Android/data/com.master/files/coolMINT/Bilder/Blau/Blau_1.jpg typ=image/jpeg (has extras) }} to activity {com.master/com.master.PhaseOne}: java.lang.NullPointerException
10-16 16:18:37.107: E/AndroidRuntime(19472): at android.app.ActivityThread.deliverResults(ActivityThread.java:3007)
10-16 16:18:37.107: E/AndroidRuntime(19472): at android.app.ActivityThread.handleSendResult(ActivityThread.java:3050)
10-16 16:18:37.107: E/AndroidRuntime(19472): at android.app.ActivityThread.access$1100(ActivityThread.java:127)
10-16 16:18:37.107: E/AndroidRuntime(19472): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1188)
10-16 16:18:37.107: E/AndroidRuntime(19472): at android.os.Handler.dispatchMessage(Handler.java:99)
10-16 16:18:37.107: E/AndroidRuntime(19472): at android.os.Looper.loop(Looper.java:137)
10-16 16:18:37.107: E/AndroidRuntime(19472): at android.app.ActivityThread.main(ActivityThread.java:4448)
10-16 16:18:37.107: E/AndroidRuntime(19472): at java.lang.reflect.Method.invokeNative(Native Method)
10-16 16:18:37.107: E/AndroidRuntime(19472): at java.lang.reflect.Method.invoke(Method.java:511)
10-16 16:18:37.107: E/AndroidRuntime(19472): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
10-16 16:18:37.107: E/AndroidRuntime(19472): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
10-16 16:18:37.107: E/AndroidRuntime(19472): at dalvik.system.NativeStart.main(Native Method)
10-16 16:18:37.107: E/AndroidRuntime(19472): Caused by: java.lang.NullPointerException
10-16 16:18:37.107: E/AndroidRuntime(19472): at com.master.PhaseOne.onActivityResult(PhaseOne.java:374)
10-16 16:18:37.107: E/AndroidRuntime(19472): at android.app.Activity.dispatchActivityResult(Activity.java:4649)
10-16 16:18:37.107: E/AndroidRuntime(19472): at android.app.ActivityThread.deliverResults(ActivityThread.java:3003)
10-16 16:18:37.107: E/AndroidRuntime(19472): ... 11 more
 
  • Danke
Reaktionen: BlupBlup
Stimmt, das war der Fehler. Danke.
Über String filename = data.getDataString(); erhalte ich den Pfad zum gerade gemachten Foto.
Nun wollte ich die Größe des Fotos noch ermitteln allerdings erhalte ich immer die Angabe 0. Das kann aber nicht sein, weil die Datei existiert ja, ich seh sie ja im Dateimanager und der Toast gibt mir den richtigen Dateipfad zurück.

Code:
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
        super.onActivityResult(requestCode, resultCode, data);
         
         if (requestCode == Constants.RQC_PICTURE)
        {
            Toast.makeText(this, "requestCode == Constants.RQC_PICTURE", Toast.LENGTH_SHORT).show();
            
           if(resultCode == RESULT_OK)
           {                 
               Toast.makeText(this, "resultCode == RESULT_OK", Toast.LENGTH_SHORT).show();
    
               String filename = data.getDataString();
               File file = new File(filename);
              
               Toast.makeText(this, filename + " gespeichert", Toast.LENGTH_LONG).show();
               Toast.makeText(this, "file.length()" + file.length(), Toast.LENGTH_SHORT).show();
           }
        }
}
 
Wieder ins blaue geraten: Absoluter Pfad oder relativer Pfad? ;)
 
Absoluter Pfad. Ich habe auch mal die Prüfung
mit new File(data.getDataString()).exists(); gemacht
in der Methode onActivityResult(), und als Ergebnis erhalte ich false.
Das heißt die Datei existiert nicht. Das kann aber nicht sein,
denn ich finde die Datei ja im Dateimanager anschließend.
 
Guck dir nochmal das bei Vogella an, du erhältst nicht den String, sondern das Bild ...

stream = getContentResolver().openInputStream(data.getData());
bitmap = BitmapFactory.decodeStream(stream);
 
Zurück
Oben Unten