안녕하세요. 결과적으로 나만의 작은 게임을 작성합니다. 결과는 캔버스를 사용하여 이미지에 기록됩니다. 문제는 "오류, 파일을 찾을 수 없습니다"오류를 공유하는 것입니다. 오류는 화면에만 표시되며 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설명해 주셔서 감사합니다. 그것은 작동합니다. 누구나이 솔루션을 조사한다면, 내가 사용한 파일 경로는 <파일 경로 이름 = "파일"경로 = "."/>와 같습니다. 그것을 알아낼 시간을 좀 보냈습니다. –