2016-07-25 10 views
0

Eine Datei wird von der Kamera erfasst. Wir verwenden nicht Intent, aber speichern Sie eine Datei in tempfile Objekt. Dies ist der CodeWas könnte Dateipfad NULL nur auf Galaxy S4 5.0.1 verursachen?

private static final int IMAGE_CAPTURE = 1002; //class-wide 
private String mCurrentPhotoPath; //class-wide 

//... 
File photoFile = createImageFile(); 
Uri uri = Uri.fromFile(photoFile); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); 
startActivityForResult(intent, IMAGE_CAPTURE); 

//... 
private File createImageFile() throws IOException { 
     imageName = mCodeContent + "_" + Integer.toString(randomNumber) + ".png"; 
     File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
     File image = File.createTempFile(imageName, ".png", storageDir); 
     mCurrentPhotoPath = image.getAbsoluteFile().getPath(); 
     mImageNameList.add(imageName); 
     return image; 
} 

Aber dieser Moment, eine Variable mCurrentPhotoPath kein Null ist.

Nachdem jedoch ein Benutzer ein Bild nimmt, wird die Variable mCurrentPhotoPath NULL in der onActivityResult so ist dies ein Absturz schafft

case IMAGE_CAPTURE: 
    try { 
      Uri uri = Uri.fromFile(new File(mCurrentPhotoPath)); //<---CRASH!!! 
      handleCameraImage(uri); 
      } catch (Exception e) { 
      Toast.makeText(this, "ERROR (IMAGE_CAPTURE)" + "\nmCurrentPhotoPath=" + 
           mCurrentPhotoPath + "\n Log: " + e.getMessage(), Toast.LENGTH_LONG).show(); 
     } 
     break; 

Der Bildpfad auf S4 wie /storage/emulated/0/pictures/imageName.png aussieht.

Was verursacht oder löscht mCurrentPhotoPath? Und nur auf S4, nicht auf anderen Geräten.

PS. Ich habe versucht, diesen Wert in den gemeinsamen Einstellungen zu speichern, aber irgendwann werden sie auch gelöscht.

+0

Ihre Aktivität hinter der Kamera und geschlossen. Es wird neu erstellt, wenn die Kamera verschwindet. Sie sollten onSaveInstanceState() verwenden, um den Wert zu speichern. Holen Sie es in onCreate vom savedInstanceState-Parameter zurück. – greenapps

+0

Gemeinsame Vorräte sollten immer funktionieren. – greenapps

Antwort

0

Für Jungs in einer ähnlichen Situation. Nachdem ich dieses Gerät bekommen hatte, sah ich das Problem.

Nämlich, S4 eingebaute Kamera erzwingt Landscape-Modus. Wenn Ihre App für das Hochformat gesperrt ist, wie bei uns, wird dadurch eine zusätzliche Drehung erzeugt, die zu einer zusätzlichen Änderung des Lebenszyklus führt.

onSaveInstanceState() wird Ihnen hier nicht helfen, aber Sie müssen onRestoreInstanceState() implementieren und Ihre Objekte dort auch initialisieren.

1

Bei Samsung-Telefonen ändert sich die Ausrichtung, wenn die Kamera-App geöffnet wird. Dadurch wird unsere Aktivität neu gestartet.

So fügen configchanges zu dieser Tätigkeit in Manifest-Datei war

android:configChanges="orientation"