你好,我寫一個小遊戲,最後你可以分享你的結果。結果使用畫布寫在圖像上。問題是共享時我得到錯誤「錯誤,找不到文件」。該錯誤僅出現在屏幕上,並未反映在logcat中。我已經花了無數小時試圖解決它,但似乎沒有任何工作。我從來沒有得到任何錯誤,但文件似乎仍然不可能分享。有沒有人有建議,爲什麼它不工作?在Android上分享canvas圖像
快速回顧:加載位圖,使其成爲畫布,繪製它,檢查保存的權限,保存它,獲取保存文件的URI,在共享意圖內使用URI。我真的沒有看到缺少的東西。
畫布繪畫部分被單獨測試,我可以使用fb庫將位圖分享到Facebook。不幸的是,android本地共享不允許共享位圖而不保存它們。
在清單中,我具有對內部和外部存儲的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;
}
}
}
,而不是'FileProvider'(和將'Bitmap'存儲在物理文件中)是否嘗試設置「ContentProvider」並覆蓋'openFile'方法? – pskink
感謝您的解釋。有用。如果有人會考慮這個解決方案,我使用的文件路徑如下: 。花了我一些時間弄清楚。 –