2016-11-29 10 views
0

Wie gewährst du die richtigen Berechtigungen und den richtigen Pfad, um eine apps Fotos in der nativen Android Gallery App mit FileProvider in Android Nougat anzuzeigen?App-Bilder in Android-Galerie mit Android-Nougat zeigen

Unten ist der aktuelle Code. Es speichert Fotos lokal, aber die Fotos werden nicht in der Android Gallery App angezeigt.

CameraActivity.java

public class CameraPreviewActivity extends AppCompatActivity 
    implements CameraPreviewFragment.Callback { 
    ... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     showCamera(); 
    } 

    public void showCameraPreviewFile() { 
     _photoFileUri = generateTimestampPhotoUri(); 
     if (_photoFileUri != null) { 
      Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, _photoFileUri); 
      startActivityForResult(intent, PHOTO_INTENT_WITH_FILENAME); 
     } 
    } 

    File getPhotoDirectory() { 
     File outputDir = null; 
     String externalStorageState = Environment.getExternalStorageState(); 
     if (externalStorageState.equals(Environment.MEDIA_MOUNTED)) { 
      File picturesDir = 
        Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
      outputDir = new File(picturesDir, getString(R.string.app_name)); 
      if (!outputDir.exists()) { 
       if (!outputDir.mkdirs()) { 
        Log.e(LOG_TAG, "outputDir.mkdirs: error"); 
        outputDir = null; 
       } 
      } 
     } 
     return outputDir; 
    } 

    Uri generateTimestampPhotoUri() { 
     Uri photoUri = null; 
     File outputDir = getPhotoDirectory(); 
     File photoFile = null; 

     if (outputDir != null) { 
      String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
      String photoFileName = "IMG_" + timeStamp + ".jpg"; 
      photoFile = new File(outputDir, photoFileName); 
     } 

     if (photoFile != null) { 
      photoUri = FileProvider.getUriForFile(
        this, 
        this.getApplicationContext().getPackageName() + ".provider", 
        photoFile 
      ); 
     } 

     return photoUri; 
    } 

AndroidManifest.xml

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="${applicationId}.provider" 
    android:exported="false" 
    android:grantUriPermissions="true"> 
    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/provider_paths" /> 

xml/provider_paths.xml

<?xml version="1.0" encoding="utf-8"?> 
<paths> 
    <external-path name="MyApp" path="."/> 
</paths> 

Antwort

2

Es ist keine einzige "native Android Gallery App". Es gibt ~ 2 Milliarden Android-Geräte, verteilt auf Tausende von Gerätemodellen. Auf diesen Geräten befinden sich Hunderte von vorinstallierten "Galerie" -Apps, da die Gerätehersteller routinemäßig ihre eigenen liefern. Es gibt auch "Galerie" -Apps, die Benutzer von App-Märkten aus installieren können.

Ihr Verhalten wird variieren. Viele verwenden MediaStore, um die Fotos zum Anzeigen zu finden. Sie tun nichts, um Ihr Bild durch die MediaStore indizieren zu lassen. Verwenden Sie MediaScannerConnection und seine scanFile() Methode in onActivityResult(), um die MediaStore aktualisieren Sie den Katalog, um Ihr Bild aufzunehmen.

+0

Ich konnte es aufrufen, und der 'onScanCompletedListener' Rückruf war erfolgreich. Ich sehe das Bild jedoch noch nicht in der Galerie. Nimmt es etwas Zeit zum Synchronisieren? Dies ist auch mein Dateipfad: 'content: // com.myapp.myapp.provider/Myapp/Pictures/Myapp/IMG_20161129_073601.jpg' Ich nehme an, dass dies ein gültiger Dateipfad ist, der von der Gallery App erkannt werden soll? Vielen Dank für deine Hilfe. Es gibt so viel zu lernen in Android, es fühlt sich einfach an, stecken zu bleiben. –

+1

@AaronLevel: "Das ist mein Dateipfad" - das ist kein Dateipfad. "Ich gehe davon aus, dass es sich um einen gültigen Dateipfad handelt, der von der Galerie-App erkannt werden kann." -- Nein. Das ist ein 'Uri', der auf deinen' FileProvider' zeigt. Ihr Dateipfad befindet sich im 'photoFile'-Objekt. Sie müssen diesen Wert auch über Konfigurationsänderungen hinweg beibehalten (z. B. "onSaveInstanceState()" verwenden). Und Sie müssen den Dateipfad von 'photoFile' in Ihrem' scanFile() 'Aufruf verwenden. – CommonsWare