こんにちは、私は最終的にあなたの結果を共有することができる小さなゲームを書く。結果はキャンバスを使用して画像に書き込まれます。問題は、共有するときに「エラー、ファイルを見つけることができませんでした」というエラーが表示されることです。エラーは画面にのみ表示され、logcatには反映されません。私はすでにそれを解決しようと無数の時間を費やしましたが、何も動作していないようです。これまでどんなエラーも出ませんでしたが、ファイルはまだ共有できないようです。誰もそれがうまくいかない理由についての提案をしていますか?アンドロイドのキャンバスイメージを共有する
クイックリキャップ:ビットマップを読み込んでキャンバスにし、ペイントして保存し、保存し、保存したファイルのURIを取得し、共有インテントのURIを使用します。私は本当に欠けているものは見ません。
キャンバスペイント部分は別にテストされ、fbライブラリを使用してビットマップをFacebookに共有できました。残念ながら、アンドロイドのネイティブシェアでは、ビットマップを保存せずにシェアすることはできません。
マニフェストには、内部ストレージと外部ストレージの両方に書き込み権限と読み取り権限があります。私は本当に助けていただければ幸いです。
クリックリスナー上の共有]ボタン:
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.Myimage);
mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
Canvas canvas = new Canvas(mutableBitmap);
Paint paint = new Paint();
paint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
paint.setColor(Color.BLACK);
paint.setTextSize(170);
int top_margin = 1000;
int left_margin = 1700;
canvas.drawText("You got a ton of points", left_margin, top_margin, paint);
ActivityCompat.requestPermissions(test_process.this,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
許可結果:
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 1: {
if (grantResults.length > 0
&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {
sharethis(mutableBitmap);
} else {
Toast.makeText(test_process.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
}
return;
}
}
}
共有方法:
public void sharethis(Bitmap bitmap){
File file_path = getFilesDir();
File file = new File(file_path, "resultImg.jpg");
FileOutputStream fOut;
try {
fOut = new FileOutputStream(file);
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fOut);
fOut.flush();
fOut.close();
} catch (Exception e) {
e.printStackTrace();
Log.i("file saving problem", String.valueOf(e));
}
Uri uri = Uri.fromFile(file);
Uri uriContent = getImageContentUri(this, file);
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/jpeg");
Log.i("Uri", String.valueOf(uri));
Log.i("UriContent", String.valueOf(uriContent));
intent.putExtra(Intent.EXTRA_STREAM, uriContent);
startActivity(Intent.createChooser(intent, "Share Cover Image"));
}
そして、URIコンバータ:
public static Uri getImageContentUri(Context context, File imageFile) {
String filePath = imageFile.getAbsolutePath();
Cursor cursor = context.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[] { MediaStore.Images.Media._ID },
MediaStore.Images.Media.DATA + "=? ",
new String[] { filePath }, null);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor
.getColumnIndex(MediaStore.MediaColumns._ID));
Uri baseUri = Uri.parse("content://media/external/images/media");
return Uri.withAppendedPath(baseUri, "" + id);
} else {
if (imageFile.exists()) {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, filePath);
return context.getContentResolver().insert(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
} else {
return null;
}
}
}
のいずれかのために
READ_EXTERNAL_STORAGE
を必要としないあなたがACTION_SEND
Intent
に
FLAG_GRANT_READ_URI_PERMISSION
を追加する必要があります(と'Bitmap'を物理ファイルに格納する)あなたは' ContentProvider'をセットアップして 'openFile'メソッドをオーバーライドしようとしましたか? – pskinkあなたの説明をありがとう。できます。誰かがこのソリューションを検討している場合、私が使用したファイルパスは です。私はそれを理解する時間を取った。 –