2017-09-11 4 views
0

안녕하세요. 결과적으로 나만의 작은 게임을 작성합니다. 결과는 캔버스를 사용하여 이미지에 기록됩니다. 문제는 "오류, 파일을 찾을 수 없습니다"오류를 공유하는 것입니다. 오류는 화면에만 표시되며 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; 
     } 
    } 
} 

답변

0

getImageContentUri()은 작동하지 않습니다. 파일은 internal storage입니다. MediaStore을 비롯한 타사 앱에는 액세스 권한이 없습니다.

getImageContentUri()을 제거하십시오. getFilesDir()에서 파일을 제공하는 Set up FileProvider 그런 다음 FileProvider.getUriForFile()을 사용하여 ACTION_SENDIntent에서 사용할 수있는 Uri을 얻으십시오. 또한

:

  • 대신 FileProvider``이

+0

의에 대한 READ_EXTERNAL_STORAGE 필요하지 않습니다 당신은 ACTION_SENDIntent

  • FLAG_GRANT_READ_URI_PERMISSION를 추가해야합니다 (그리고 'Bitmap'을 물리적 인 파일에 저장하는 것) 당신은'ContentProvider'를 설정하고'openFile' 메소드를 오버라이드하려고 했습니까? – pskink

  • +0

    설명해 주셔서 감사합니다. 그것은 작동합니다. 누구나이 솔루션을 조사한다면, 내가 사용한 파일 경로는 <파일 경로 이름 = "파일"경로 = "."/>와 같습니다. 그것을 알아낼 시간을 좀 보냈습니다. –