インテントを使用して内部メモリに保存された画像を共有しようとしています。"空のファイルを添付できません" - 内部メモリからGmailに画像を共有する場合
- レイアウト
- 保存内部
- メモリ共有内のファイルにこのビットマップのビットマップを生成し、次のようにプロセスがある
のみ空のファイルは思える(Gmailへ)の意図を使用してこのファイル実行時に生成される(したがって、Gmailに添付することはできません)。コードがどこで乱雑になり始めるのか分かりません。だから、ここでこれらの2つの方法が
以下のようonClickListenerの内側に配置されている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)));
}
画像を共有するためのコード
を生成するための方法およびビットマップを保存
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();
}
方法は行きます
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;
問題を見つけようとしています。何か不足していますか? また、コードを改善するための提案(もしあれば)を聞いてみたいと思います。
よろしく
EDIT約FileProvider
言及するため
感謝。お役立ち情報getCacheDir
について教えてください。しかし、FileProvider
を使用しても、私のコードは空のファイルを返し続けます。私は複数のリソースを探索してきましたが、前述のレイアウトの実際のImageを持つファイルを生成することはできません。
generateAndSaveBitmap(レイアウトの表示) - このメソッド(上記のコード)は変更されていません。
以下はAndroidManifest.xmlを FileProvider
にを関連のコードではありません - ファイル名とそのパス
を言及するために使用 -<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を議論するための新しいもの
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="sharableImage" path="images/"/>
</paths>
moreShareOptions() -
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);
}
}
何が欠けていますか?私は時間を費やして必要な結果を得る方法を探しました。何も実りありません。したがって、他の人が私がどこに間違っているかを指摘できるという希望でこのコードを投稿しています。
FileProviderについてご説明いただきありがとうございます。まだ空のファイルだけを取得しています。ビットマップの生成と保存に関するコードに何か問題がありますか?更新されたコードのEDITセクションをチェックしてください。私がうんざりしたところへのどんな種類の指示も実際に助けになるかもしれません。 – Traveller