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>
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. –
@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