2017-04-10 3 views
1

Da ich meine App zu Android N mit FileProvider migriert habe, kann ich meine Bilder in der Galerie des Telefons (auch mit der Version unter Android N) nicht sehen. Also habe ich eine kleine Test-App erstellt, um dies zu debuggen, ohne Erfolg.Kann nicht speichern in Galerie nach dem Bild mit FileProvider

In meinem Manifest

<uses-permission android:name="android.permission.CAMERA"/> 
<uses-feature android:name="android.hardware.camera"/> 

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/> 

<application 
    ...> 
    ... 


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

In file_paths.xml

<paths> 
<external-files-path 
    name="test_images" 
    path="Pictures/TestPictures"/> 
</paths> 

Und machte ich eine kleine Aktivität, die zuletzt aufgenommene Bild zeigt, um sicherzustellen, dass URI korrekt ist:

private final static int REQUEST_CAMERA = 1102; 
public static final String CAMERA_IMAGES_DIR = "TestPictures"; 
String mOutputFilePath; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      onCamera(); 
     } 
    }); 
} 

public void onCamera() { 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    if (intent.resolveActivity(getPackageManager()) != null) { 
     File photoFile = createImageFile(); 
     Uri photoURI = FileProvider.getUriForFile(this, 
       getPackageName() + ".fileprovider", 
       photoFile); 
     mOutputFilePath = photoFile.getAbsolutePath(); 
     intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
     startActivityForResult(intent, REQUEST_CAMERA); 
    } 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (resultCode == Activity.RESULT_OK && requestCode == REQUEST_CAMERA) 
     onCaptureImageResult(); 
} 

private void onCaptureImageResult() { 
    if (mOutputFilePath != null) { 
     File f = new File(mOutputFilePath); 
     Uri finalUri = Uri.fromFile(f); 
     galleryAddPic(finalUri); 
     ((ImageView) findViewById(R.id.imageView)).setImageURI(finalUri); 
    } 
} 

public File createImageFile() { 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), CAMERA_IMAGES_DIR + "/"); 
    if (!storageDir.exists()) 
     storageDir.mkdir(); 
    return new File(storageDir, imageFileName + ".jpg"); 
} 

private void galleryAddPic(Uri contentUri) { 
    Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, contentUri); 
    sendBroadcast(mediaScanIntent); 
} 

Mein Bild ist in meiner App und in meinem Dateibrowser wie erwartet, aber ich kann es nicht in der Fotogalerie sehen. Ich habe versucht, FileProvider Uri zu verwenden, das funktioniert auch nicht.

+1

https://stackoverflow.com/questions/32789157/how-to-write-files-to-external-public-storage-in-android-so- that-this-are-visibl – CommonsWare

+0

Der Weg, um mein Foto in der Galerie hinzuzufügen, war nicht das Problem, aber ich bemerkte das Verzeichnis in dem Thread, den Sie freigegeben haben, und es hilft mir, die Lösung zu finden, thx. – Silwek

Antwort

2

Das Problem scheint der Speicherort der Datei zu sein, die der Galerie hinzugefügt werden soll, und nicht die Art, sie hinzuzufügen.

getExternalFilesDir (Environment.DIRECTORY_PICTURES) funktioniert nicht für die Medienüberprüfung aber Environment.getExternalStoragePublicDirectory (Environment.DIRECTORY_PICTURES) tut. Allerdings können wir das letzte nicht mit FileProvider verwenden, daher muss ich eine Kopie des aufgenommenen Bildes im öffentlichen Verzeichnis erstellen.

ich meinen Code wie aktualisieren:

private void onCaptureImageResult() { 
    if (mOutputFilePath != null) { 
     File f = new File(mOutputFilePath); 
     try { 
      File publicFile = copyImageFile(f); 
      Uri finalUri = Uri.fromFile(publicFile); 
      galleryAddPic(finalUri); 
      ((ImageView) findViewById(R.id.imageView)).setImageURI(finalUri); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public File copyImageFile(File fileToCopy) throws IOException { 
    File storageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), CAMERA_IMAGES_DIR + "/"); 
    if (!storageDir.exists()) 
     storageDir.mkdir(); 
    File copyFile = new File(storageDir, fileToCopy.getName()); 
    copyFile.createNewFile(); 
    copy(fileToCopy, copyFile); 
    return copyFile; 
} 

public static void copy(File src, File dst) throws IOException { 
    InputStream in = new FileInputStream(src); 
    OutputStream out = new FileOutputStream(dst); 
    byte[] buf = new byte[1024]; 
    int len; 
    while ((len = in.read(buf)) > 0) { 
     out.write(buf, 0, len); 
    } 
    in.close(); 
    out.close(); 
} 
+0

siehe https://stackoverflow.com/a/33031091/966789 (Android hinzugefügt neues Berechtigungsmodell für Android 6.0 Marshmallow) –

Verwandte Themen