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