2016-05-23 24 views
3

Hinweis: ähnliche Frage ist unter SO Links gefragt vorbei, aber keiner der vorgeschlagene Lösung für mich gearbeitet, damit dieses Thema zu starten.MediaStore.Images.Media.insertImage - java.io.FileNotFoundException - Android

  1. MediaStore.Images.Media.insertImage is returning null when trying to save the image
  2. Why Images.Media.insertImage return null

Problemstellung: ich das Bild von einer URL herunterzuladen und dann das gleiche zu teilen versuchen. Dazu benötige ich den Uri, den ich durch Speichern des Bildes in MediaStore.Images.Media erhalte.

Code:

A. Erhalten heruntergeladene Bild von einer AsyncTask Klasse

public void processDownloadedImage(Bitmap bitmap) { 
     if (bitmap == null) { 
      Toast.makeText(this,"Image could not be downloaded and shared!",Toast.LENGTH_LONG).show(); 
     } 
     else { 
      downloadedImage = bitmap; 
      checkPermissionShowShareSheet(); 
     } 
    } 

B. Überprüfen Erlaubnis für Eibisch und höher

public void checkPermissionShowShareSheet() { 

     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (!Settings.System.canWrite(this)){ 
       requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE},2909); 
      } 
      else { 


      updateImageUri(downloadedImage); 
      showShareSheet(downloadedImageUri); 
     } 
    } 
    else { 
     updateImageUri(downloadedImage); 
     showShareSheet(downloadedImageUri); 
    } 
} 

C. Gewinnung Bild Uri

private void updateImageUri(Bitmap inImage){ 
     ByteArrayOutputStream bytes = new ByteArrayOutputStream(); 
     inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes); 

     fixMediaDir(); 
     String path = MediaStore.Images.Media.insertImage(this.getContentResolver(), inImage, "SomeImage", null); 
     storePathInSharedPreferences(path); 
     Uri uri = Uri.parse(path); 

     downloadedImageUri = uri; 
    } 

    void fixMediaDir() { 
     File sdcard = Environment.getExternalStorageDirectory(); 
     if (sdcard != null) { 
      File mediaDir = new File(sdcard, "DCIM/Camera"); 
      if (!mediaDir.exists()) { 
       mediaDir.mkdirs(); 
      } 
     } 
    } 

D. Manifest-Datei verwendet, um Berechtigungen

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

Problem: Wert von unten Zeile zurückgegeben wird, ist null

String path = MediaStore.Images.Media.insertImage(this.getContentResolver(), inImage, "SomeImage", null); 

Irgendwelche Ideen?

Hier ist Teil Stackbacktrace:

Failed to insert image java.io.FileNotFoundException: No such file or directory  
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146) 
at android.content.ContentProviderProxy.openAssetFile(ContentProviderNative.java:620) 
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:939) 
at android.content.ContentResolver.openOutputStream(ContentResolver.java:686) 
at android.content.ContentResolver.openOutputStream(ContentResolver.java:662) 
at android.provider.MediaStore$Images$Media.insertImage(MediaStore.java:934) 
at myorg.myapp.ImageDescription.updateImageUri(ImageDescription.java:165) 

Antwort

0

Ändern Sie diese

<uses-permission android:name="android.permission.read_external_storage" /> 

Um

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 
+0

tat aber dasselbe Ergebnis :(.. Weg –

+0

noch null ist, ich habe habe meinen Beitrag mit einem Teil des Stack Backtrace aktualisiert, bitte schauen Sie –