在android

时间:2017-09-11 16:19:18

标签: android canvas bitmap share

你好,所以我写了一个小游戏,最后你可以分享你的结果。结果使用画布写在图像上。问题是当共享我得到错误“错误,找不到文件”。该错误仅在屏幕上显示,而不会反映在logcat中。我已经花了无数个小时试图解决它,但似乎没有任何工作。我没有得到任何错误,但文件似乎仍然无法分享。有没有人建议为什么它不起作用?

快速回顾:加载位图,使其成为画布,绘制它,检查保存权限,保存,获取保存文件的URI,使用共享意图内的URI。我真的不明白缺少什么。

画布绘画部分单独测试,我能够使用fb库将位图共享到Facebook。不幸的是,android native共享不允许在不保存位图的情况下共享位图。

在清单中,我对内部和外部存储都有WRITE和READ权限。我真的很感激任何帮助。

点击监听器上的

分享按钮:

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;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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任何