2017-01-28 27 views
0

Ich schreibe eine App, die Kamera verwendet. Ich bin auf ein seltsames Problem gestoßen. Die "createImageFile()" erstellt eine Datei erfolgreich auf meinem virtuellen Gerät mit API 16. Wenn ich jedoch die App auf meinem Sony Xperia Z3 (Android 6.0.1, API 23) ausführen, wird die Datei nicht erstellt. Ich bekomme nicht einmal einen Fehler. Ich klicke einfach auf den Knopf, auf dem die Kamera läuft() und nichts passiert.Erstellen von ImageFile für Foto funktioniert nicht

Nach einigen debugging, habe ich 3 Toasts in createImageFile() erstellt.

All Toast arbeiten an Virtual Device API 16.

Nur Toast1 auf meinem Xperia Z3 arbeitet

public void cameraChoosen(){ 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    // Ensure that there's a camera activity to handle the intent 

    if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
     // Create the File where the photo should go 
     File photoFile = null; 

     try { 
      photoFile = createImageFile(); 
     } catch (IOException ex) { 
      // Error occurred while creating the File 
      //... 
     } 

     // Continue only if the File was successfully created 
     if (photoFile != null) { 
      Uri photoURI = FileProvider.getUriForFile(this, "com.example.karol.carendal", photoFile); 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
      startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
     } 
    } 
} 

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 

    Toast.makeText(getBaseContext(), "Toast1", Toast.LENGTH_SHORT).show(); 


    File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    Toast.makeText(getBaseContext(), "Toast2", Toast.LENGTH_SHORT).show(); 

    if (image.exists()){ 
     Toast.makeText(getBaseContext(), "File created successfully", Toast.LENGTH_SHORT).show(); 
    } 

    // Save a file: path for use with ACTION_VIEW intents 
    mCurrentPhotoPath = image.getAbsolutePath(); 
    return image; 
} 

Irgendwelche Ideen, was das Problem verursacht?

Grüße :)

+0

Setzen Sie einen Toast auch in diesen Catch-Block. Du hast den Haken. Die Ausnahme ist auch im Logcat sichtbar. – greenapps

+0

Auch wenn dieser Fang passiert, wird nicht nur ein Trinkspruch angezeigt, sondern auch eine Rückkehr. Da macht es keinen Sinn mit dem Code weiterzumachen. Zeigen Sie e.getMessage im Toast an. – greenapps

+0

Weiter ist es schlechter Code, da Sie nicht bereits eine Datei mit File.createTempFile() erstellen sollten. Entfernen Sie es. Sie sollten nur einen geeigneten Bilddateipfad erstellen. – greenapps

Antwort

0

Für Android 6 und höher Sie in manifest nicht nur Schreibanforderung externe Speicher Erlaubnis sollte.

Sie müssen auch zur Laufzeit den Benutzer bitten, diese Berechtigung einmal zu bestätigen.

Google für Laufzeitberechtigung.

Alternativ kann der Benutzer Ihrer App zu den Android-Einstellungen für Ihre App wechseln und den Speicherberechtigungsschalter umschalten.

Verwandte Themen