2016-04-22 5 views
1

Ich versuche, das im internen Speicher gespeicherte Bild mit Absicht zu teilen. Der Prozess ist als"Kann keine leere Datei anhängen" - Wenn ich Bild aus dem internen Speicher zu Google Mail teile

  • folgt
  • Bitmap eines Layouts generieren
  • speichern Bitmap in einer Datei im internen
  • Speicher teilen diese Datei Absicht mit (zu Gmail)

Nur leere Datei erscheinen bei der Ausführung generiert werden (kann daher nicht an Google Mail angehängt werden). Ich bin mir nicht sicher, wo der Code unordentlich wird. So, hier geht den Code

Methode zum Erzeugen und Speichern Bitmap

public void generateAndSaveBitmap(View layout) { 
//Generate bitmap 
     layout.setDrawingCacheEnabled(true); 
     layout.buildDrawingCache(); 
     Bitmap imageToSave = layout.getDrawingCache(); 
     layout.destroyDrawingCache(); 

//Create a file and path 
     File directory = layout.getContext().getDir("images", Context.MODE_PRIVATE); 
     File fileName = new File(directory, "sharableImage.jpg"); 
     if (fileName.exists()) 
      fileName.delete(); 

//Compress and save bitmap under the mentioned fileName 
     FileOutputStream fos = null; 
     try { 
      fos = new FileOutputStream(fileName); 
      imageToSave.compress(Bitmap.CompressFormat.JPEG, 100, fos); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (fos != null) { 
       try { 
        fos.flush(); 
        fos.close(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
// return directory.getAbsolutePath(); 
    } 

Methode das Bild zu teilen

public void moreShareOptions(Context context) { 
    Intent shareIntent = new Intent(Intent.ACTION_SEND); 
    shareIntent.setType("image/jpg"); 
    File photoFile = new File("sharableImage.jpg"); 
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(photoFile)); 
    context.startActivity(Intent.createChooser(shareIntent, context.getResources().getText(R.string.opsh_share_this))); 
} 

Diese beiden Methoden platziert werden innerhalb OnClickListener wie unten

case R.id.more_share_options: 
     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       optionsShareThis.generateAndSaveBitmap(toolbarWebView); 
      } 
     }); 

     t.start(); 
     optionsShareThis.moreShareOptions(this); 
     break; 

Versuchen, das Problem zu finden. Fehle ich etwas? Außerdem würde ich gerne Vorschläge (falls vorhanden) hören, um den Code zu verbessern.

Grüße

EDIT:

Danke für etwa FileProvider zu erwähnen. Gut zu wissen über getCacheDir. Aber auch nach der Verwendung von FileProvider gibt mein Code weiterhin eine leere Datei zurück. Ich habe mehrere Ressourcen untersucht, konnte jedoch keine Datei mit dem aktuellen Image des angegebenen Layouts erstellen.

generateAndSaveBitmap (Layout anzeigen) - Es wurden keine Änderungen an dieser Methode vorgenommen (Code oben).

Unten ist der zu FileProvider bezogenen Code

AndroidManifest.xml - nichts Neues

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="com.example.android" 
    android:exported="false" 
    android:grantUriPermissions="true"> 

    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/file_path" /> 

</provider> 

file_path.xml zu diskutieren - verwendet, um die Dateinamen und

seinen Weg zu erwähnen
<?xml version="1.0" encoding="utf-8"?> 

<paths> 
    <files-path name="sharableImage" path="images/"/> 
</paths> 

mehrShareOptions() -

public void moreShareOptions(Context context) { 

// concatenate the internal cache folder with the document its path and filename 
     final File file = new File(context.getFilesDir(), "images/sharableImage.jpg"); 
// let the FileProvider generate an URI for this private file 
     final Uri uri = FileProvider.getUriForFile(context, "com.example.android", file); 
// create an intent, so the user can choose which application he/she wants to use to share this file 

     final Intent intent; 
     if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { 
      intent = ShareCompat.IntentBuilder.from((Activity) context) 
        .setType("image/jpg") 
        .setStream(uri) 
        .createChooserIntent() 
        .addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT) 
        .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

      context.startActivity(intent); 
     }else { 
     intent = ShareCompat.IntentBuilder.from((Activity) context) 
       .setType("image/jpg") 
       .setStream(uri) 
       .createChooserIntent() 
       .addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET) 
       .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

      context.startActivity(intent); 
     } 
    } 

Was habe ich vermisst? Ich habe stundenlang nach Wegen gesucht, um das notwendige Ergebnis zu bekommen. Nichts Fruchtbares. Daher poste ich diesen Code mit der Hoffnung, dass andere möglicherweise darauf hinweisen könnten, wo ich falsch liege.

Antwort

0

Drittanbieter-Apps haben keinen Zugriff auf Ihren internen Speicher. Und, besonders beginnend mit Android N, sharing files is strongly discouraged in general.

Stattdessen use FileProvider to share the content. Dies wird auch in the documentation behandelt.

+0

Vielen Dank für den Hinweis auf FileProvider. Immer noch nur eine leere Datei. Gibt es etwas falsch mit dem Code zum Erstellen und Speichern der Bitmap? Bitte überprüfen Sie den Abschnitt EDIT für aktualisierten Code. Jede Art von Hinweis darauf, wo ich versagt habe, könnte tatsächlich helfen. – Traveller

Verwandte Themen