2017-09-11 83 views
0

你好,我寫一個小遊戲,最後你可以分享你的結果。結果使用畫布寫在圖像上。問題是共享時我得到錯誤「錯誤,找不到文件」。該錯誤僅出現在屏幕上,並未反映在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; 
     } 
    } 
} 

回答

0

getImageContentUri()不會工作。您的文件位於internal storage;第三方應用程序(包括MediaStore)無法訪問它。

擺脫getImageContentUri()Set up FileProvider服務於getFilesDir()的文件。然後,使用FileProvider.getUriForFile()獲得Uri,您可以在您的ACTION_SENDIntent中使用。

另外:

  • 您將需要添加FLAG_GRANT_READ_URI_PERMISSIONACTION_SENDIntent

  • 你不需要READ_EXTERNAL_STORAGE任何的這種

+0

,而不是'FileProvider'(和將'Bitmap'存儲在物理文件中)是否嘗試設置「ContentProvider」並覆蓋'openFile'方法? – pskink

+0

感謝您的解釋。有用。如果有人會考慮這個解決方案,我使用的文件路徑如下:。花了我一些時間弄清楚。 –