在 android 上分享 canvas 图片
Share canvas image on android
你好,我写了一个小游戏,最后你可以分享你的结果。结果使用 canvas 写在图像上。问题是共享时出现错误 "Error, could not locate the file"。该错误仅在屏幕上显示,未反映在 logcat 中。我已经花了无数个小时试图解决它,但似乎没有任何效果。我没有得到任何错误,但文件似乎仍然无法共享。有没有人建议为什么它不起作用?
快速回顾:加载位图,将其设为 canvas,绘制,检查保存权限,保存,获取保存文件的 URI,使用共享意图中的 URI。我真的不明白缺少什么。
canvas 绘画部分单独测试,我可以使用 fb 库将位图共享到 Facebook。不幸的是 android 本机共享不允许在不保存的情况下共享位图。
在清单中,我拥有内部和外部存储的写入和读取权限。我真的很感激任何帮助。
点击监听器上的分享按钮:
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;
}
}
}
getImageContentUri()
是行不通的。您的文件在 internal storage 上;第三方应用程序(包括 MediaStore
)无法访问它。
去掉getImageContentUri()
。 Set up FileProvider
提供来自 getFilesDir()
的文件。然后,使用 FileProvider.getUriForFile()
得到一个 Uri
可以在 ACTION_SEND
Intent
.
中使用
还有:
您需要将 FLAG_GRANT_READ_URI_PERMISSION
添加到 ACTION_SEND
Intent
你不需要READ_EXTERNAL_STORAGE
来完成这些
你好,我写了一个小游戏,最后你可以分享你的结果。结果使用 canvas 写在图像上。问题是共享时出现错误 "Error, could not locate the file"。该错误仅在屏幕上显示,未反映在 logcat 中。我已经花了无数个小时试图解决它,但似乎没有任何效果。我没有得到任何错误,但文件似乎仍然无法共享。有没有人建议为什么它不起作用?
快速回顾:加载位图,将其设为 canvas,绘制,检查保存权限,保存,获取保存文件的 URI,使用共享意图中的 URI。我真的不明白缺少什么。
canvas 绘画部分单独测试,我可以使用 fb 库将位图共享到 Facebook。不幸的是 android 本机共享不允许在不保存的情况下共享位图。
在清单中,我拥有内部和外部存储的写入和读取权限。我真的很感激任何帮助。
点击监听器上的分享按钮:
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;
}
}
}
getImageContentUri()
是行不通的。您的文件在 internal storage 上;第三方应用程序(包括 MediaStore
)无法访问它。
去掉getImageContentUri()
。 Set up FileProvider
提供来自 getFilesDir()
的文件。然后,使用 FileProvider.getUriForFile()
得到一个 Uri
可以在 ACTION_SEND
Intent
.
还有:
您需要将
FLAG_GRANT_READ_URI_PERMISSION
添加到ACTION_SEND
Intent
你不需要
READ_EXTERNAL_STORAGE
来完成这些