在 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来完成这些