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

    あなたの説明をありがとう。できます。誰かがこのソリューションを検討している場合、私が使用したファイルパスはです。私はそれを理解する時間を取った。 –

    関連する問題