10

Ich muss den Benutzer ein Bild (aus der Galerie oder von einer Kamera-App) mit Android 6.0 machen lassen.Erstelle Bild ohne Erlaubnis mit Android 6.0

Weil ich nicht die Kamera steuern müssen, wollte ich eine Absicht verwenden, wie hier beschreiben:

Wenn Sie jedoch Sie keine Kontrolle benötigen, nur eine ACTION_IMAGE_CAPTURE Absicht verwenden, ein Bild anfordern Wenn Sie die Absicht starten, wird der Benutzer aufgefordert, eine Kamera-App auszuwählen (wenn es nicht bereits eine Standard-Kamera-App gibt), und diese App nimmt das Bild an. Die Kamera-App gibt das Bild an die onActivityResult() -Methode Ihrer App zurück.

https://developer.android.com/preview/features/runtime-permissions.html

Aber für diesen ACTION_IMAGE_CAPTURE, müssen Sie die zusätzliche „MediaStore.EXTRA_OUTPUT“ zu füllen, die eine Uri in eine temporäre Datei (ohne diese param werde ich nur ein Thumbnail haben) . Diese temporäre Datei muss sich im externen Speicher befinden (damit die Kamera-App darauf zugreifen kann). Sie benötigen die Berechtigung WRITE_EXTERNAL_STORAGE, um eine Datei auf dem externen Speicher zu erstellen.

es ist also nicht möglich, ein Bild durch native Dialoge/apps ohne Erlaubnis zu erfassen android.permission.CAMERA oder android.permission.WRITE_EXTERNAL_STORAGE. Ist das korrekt?

Dank

+0

Sie können gerne versuchen, ein 'content: //' 'Uri' in' EXTRA_OUTPUT' zu übergeben, das auf einen 'ContentProvider' zeigt, den Sie schreiben, wo Sie die Daten akzeptieren können. Ich habe das nicht ausprobiert, und ich schätze, dass es eine Reihe von Kamera-Apps geben wird, die keinen solchen Wert erwarten und daran ersticken werden. – CommonsWare

+0

hast du jemals eine Arbeit dafür gefunden? – AndroidEnthusiast

Antwort

4

Es ist möglich, wenn Sie sich auf ab Android 4.4, Sie MediaStore.EXTRA_OUTPUT angeben können, wird eine Datei unter Ihrem paketspezifische Verzeichnisse

Ab Android 4.4 zu sein Der Besitzer, die Gruppe und die Modi der Dateien auf externen Speichergeräten werden nun basierend auf dem Verzeichnis Struktur synthetisiert. Dadurch können Apps ihre paketspezifischen Verzeichnisse auf externem Speicher verwalten, ohne dass sie die breite WRITE_EXTERNAL_STORAGE-Berechtigung besitzen müssen. Zum Beispiel kann die App mit dem Paket Name com.example.foo nun frei auf Android/data/com.example.foo/auf externen Speichergeräten ohne Berechtigungen zugreifen. Diese synthetisierten Berechtigungen werden von ausgeführt, die rohe Speichergeräte in einen FUSE-Daemon einpacken.

https://source.android.com/devices/storage/

+0

Haben Sie das tatsächlich versucht? Dies gibt Ihrer App Zugriff auf das Verzeichnis, aber nicht auf die CAMERA-App, was das Problem ist. –

+0

@Derek Fung können Sie ein Beispielprojekt teilen? –

+0

Die Kamera hat keinen Zugriff auf das private Verzeichnis des privaten Cache-Verzeichnisses. @ Jonathan Astes Lösung funktioniert. – Makalele

1

Dies ohne eine der beiden CAMERA und WRITE_EXTERNAL_STORAGE Berechtigungen möglich ist.

Sie können ein temporäres Verzeichnis im Cache-Verzeichnis Ihrer App erstellen und anderen Apps Zugriff darauf gewähren.Das macht die Datei beschreibbar durch die Kamera-App:

File tempFile = File.createTempFile("photo", ".jpg", context.getCacheDir()); 
tempFile.setWritable(true, false); 

Jetzt müssen Sie nur für die Kamera Absicht diese Datei als Ausgabedatei zu übergeben:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempFile)); // pass temp file 
startActivityForResult(intent, REQUEST_CODE_CAMERA); 

Hinweis: Die Datei Uri wird nicht Wenn Sie im Aktivitätsergebnis an Sie übergeben werden, müssen Sie einen Verweis auf die tempFile speichern und von dort abrufen.

+0

Scheint nicht mehr beim Marshmallow-Targeting zu funktionieren. – wiradikusuma

+0

diese Option scheint vielversprechend, hat jemand irgendwelche Rückmeldungen in Bezug auf Kompatibilität? – Zapnologica

+0

Funktioniert nicht. Die Kamera-App hat keinen Zugriff auf das App-Cache-Verzeichnis. – Makalele

2

Da die Kamera-App nicht auf die privaten Verzeichnisse Ihrer App zugreifen kann, müssen Ihre Anwendungen die Fotodatei in dieses Verzeichnis schreiben. Ich bin nicht wirklich sicher über diese, aber das funktioniert für mich:

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()) 
      .format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
    return File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 
} 

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
    // Create the File where the photo should go 
    File photoFile = null; 
    try { 
     photoFile = createImageFile(); 
     takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath); 
    } catch (IOException ex) { 
     // Error occurred while creating the File 
     Log.e(TAG, "Unable to create Image File", ex); 
    } 

    // Continue only if the File was successfully created 
    if (photoFile != null) { 
     takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
       Uri.fromFile(photoFile)); 
    } else { 
     takePictureIntent = null; 
    } 
} 

Aber Sie müssen noch WRITE_EXTERNAL_STORAGE Erlaubnis, bevor KITKAT:

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

Try this:

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
File file = new File(getActivity().getApplicationContext().getExternalFilesDir(android.os.Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + "yourPicture.jpg"); 
Uri uri = Uri.fromFile(file); 
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, url); 

Dies gibt Ihnen Zugriff auf einen "externen" Speicher, der in diesem Fall für Kamera-Apps beschreibbar ist. Die Dateien sind jedoch nur in Ihrer App sichtbar. Um ein wenig mehr über Speicherplätze in Android zu erfahren, siehe https://www.youtube.com/watch?v=C28pvd2plBA

Hoffe es hilft Ihnen!

+2

Dies ist die einzige funktionierende Lösung, die ich bisher gefunden habe und die unter Android 6 nicht kaputt geht. :) –

+0

Funktioniert! Keine Notwendigkeit für WRITE_EXTERNAL_STORAGE oder READ_EXTERNAL_STORAGE. – Makalele

+0

Danke! In 'onActivityResult' erhalten Sie' RESULT_OK' und 'data == null'. In diesem Fall sollten Sie entweder eine Datei aus dem Pfad (Variable 'uri') lesen oder https://stackoverflow.com/questions/32043222/how-to-get-full-size-picture-and-thumbnail-from- Kamera-in-der-gleiche-Absicht. Sie müssen die Erlaubnis zum Lesen von Dateien auf API> = 23 bekommen. – CoolMind