2017-09-11 2 views
0

Bonjour, alors j'écris un petit jeu où à la fin vous pouvez partager votre résultat. Le résultat est écrit sur une image en utilisant le canevas. Le problème est lors du partage je reçois l'erreur "Erreur, impossible de localiser le fichier". L'erreur est vue à l'écran uniquement et n'est pas reflétée dans logcat. J'ai déjà passé d'innombrables heures à essayer de le résoudre, mais rien ne semble fonctionner. Je ne reçois aucune erreur quoi que ce soit, mais le fichier semble toujours impossible à partager. Est-ce que quelqu'un a une suggestion sur pourquoi cela ne fonctionne pas?Partager l'image de la toile sur android

Récapitulatif rapide: charger bitmap, en faire un canevas, le peindre, vérifier les autorisations pour enregistrer, enregistrer, obtenir l'URI du fichier enregistré, utiliser l'URI à l'intérieur de l'intention de partager. Je ne vois vraiment pas ce qui manque.

La partie peinture sur toile a été testée séparément et j'ai pu partager l'image bitmap avec Facebook en utilisant la bibliothèque fb. Malheureusement, le partage natif android ne permet pas de partager des bitmaps sans les sauvegarder.

Dans le manifeste, j'ai les autorisations WRITE et READ pour le stockage interne et externe. J'apprécierais vraiment toute aide.

bouton Partager sur clic d'écoute:

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); 

résultat Permission:

@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; 
     } 
    } 
} 

méthode Partager:

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")); 
} 

Et URI convertisseur:

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; 
     } 
    } 
} 

Répondre

0

getImageContentUri() ne va pas fonctionner. Votre fichier est sur internal storage; Les applications tierces, y compris les MediaStore, n'y ont pas accès.

Débarrassez-vous de getImageContentUri(). Set up FileProvider pour servir des fichiers de getFilesDir(). Ensuite, utilisez FileProvider.getUriForFile() pour obtenir un Uri que vous pouvez utiliser dans votre ACTION_SENDIntent.

aussi:

  • Vous devrez ajouter FLAG_GRANT_READ_URI_PERMISSION au ACTION_SENDIntent

  • Vous n'avez pas besoin READ_EXTERNAL_STORAGE pour tout cela

+0

au lieu de 'FileProvider' (et en stockant le 'Bitmap' dans le fichier physique) avez-vous essayé d'installer une méthode' ContentProvider' et de surcharger 'openFile'? – pskink

+0

Merci pour vos explications. Ça marche. Juste si quelqu'un va chercher dans cette solution, le chemin de fichier que j'ai utilisé est comme suit: . Ça m'a pris du temps pour le comprendre. –