Les nouvelles URI de KitKat ne répondent pas à Intent.ACTION_VIEW

Étant donné que KitKat a changé les URI des sélecteurs à des préférés

content://com.android.providers.media.documents/document/image:3951 

Alors aucune de mes intentions ACTION_VIEW ne fonctionne plus. Lorsque, par exemple, l'utilisateur choisit une image, j'utilise

  • Android Emulator ne fonctionnera pas sur l'application lancée depuis eclipse
  • Différences et avantages de SurfaceView vs GLSurfaceView sur Android?
  • Supprimer l'application des applications récentes par programme
  • L'activité n'a pas commencé, sa tâche actuelle a été portée à l'avant
  • Toile: essayer d'utiliser un bitmap recopié android.graphics.Bitmap dans Android
  • Le bouton ne peut pas être cliqué après TranslateAnimation
  •  public static void openImage(Fragment f, Uri uri) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "image/*"); f.startActivity(intent); } 

    Et la Galerie Android et Google+ Photos apparaissent, mais lors de leur sélection, la Galerie affiche simplement des écrans vierges, les photos indiquent "moyen non trouvé"

    La même chose avec les sons, je suis habitué à utiliser

     public static void playSound(Fragment f, Uri uri) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(uri, "audio/*"); f.startActivity(intent); } 

    Ce qui servait à afficher Google Play Music dans les versions précédentes, avec la petite interface utilisateur de dialogue de lecture blanche. Avec les nouveaux URI, je suis exceptionnel qu'aucune application n'est capable de gérer cette intention.

    // Avec les photos, ce qui est drôle est que, lorsque vous choisissez Galerie au lieu des images dans la nouvelle interface utilisateur KI, elle renvoie les anciens URI qui fonctionnent.

    Des idées? Les applications système ne sont-elles pas prêtes pour le nouvel uris? Devrais-je changer le nouvel uris vers les anciens pour que les intentions fonctionnent? Ou est-ce que je manque quelque chose?

    Merci!

    2 Solutions collect form web for “Les nouvelles URI de KitKat ne répondent pas à Intent.ACTION_VIEW”

    La solution consiste à transmettre l'indicateur FLAG_GRANT_READ_URI_PERMISSION à l'intention (sur KitKat et ci-dessus):

     intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 

    Assurez-vous également que ce contenu Uri a été récupéré à partir d'une intention ACTION_OPEN_DOCUMENT comme décrit ici: https://stackoverflow.com/a/19874645/334209

    Vous pouvez utiliser l'intention suivante pour choisir une image de la galerie

     Intent i = new Intent (Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(i, 2); 

    Et obtenez l'image sélectionnée sur OnActivityResult comme,

     @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(data==null)return; try { Bitmap bit = scaleImage(this, data.getData()); img.setImageBitmap(bit); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static Bitmap scaleImage(Context context, Uri photoUri) throws IOException { InputStream is = context.getContentResolver().openInputStream(photoUri); BitmapFactory.Options dbo = new BitmapFactory.Options(); dbo.inJustDecodeBounds = true; BitmapFactory.decodeStream(is, null, dbo); is.close(); int rotatedWidth, rotatedHeight; int orientation = getOrientation(context, photoUri); if (orientation == 90 || orientation == 270) { rotatedWidth = dbo.outHeight; rotatedHeight = dbo.outWidth; } else { rotatedWidth = dbo.outWidth; rotatedHeight = dbo.outHeight; } Bitmap srcBitmap; is = context.getContentResolver().openInputStream(photoUri); if (rotatedWidth > 100 || rotatedHeight > 100) { float widthRatio = ((float) rotatedWidth) / ((float) 100); float heightRatio = ((float) rotatedHeight) / ((float) 100); float maxRatio = Math.max(widthRatio, heightRatio); // Create the bitmap from file BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = (int) maxRatio; srcBitmap = BitmapFactory.decodeStream(is, null, options); } else { srcBitmap = BitmapFactory.decodeStream(is); } is.close(); /* * if the orientation is not 0 (or -1, which means we don't know), we * have to do a rotation. */ if (orientation > 0) { Matrix matrix = new Matrix(); matrix.postRotate(orientation); srcBitmap = Bitmap.createBitmap(srcBitmap, 0, 0, srcBitmap.getWidth(), srcBitmap.getHeight(), matrix, true); } String type = context.getContentResolver().getType(photoUri); ByteArrayOutputStream baos = new ByteArrayOutputStream(); if (type.equals("image/png")) { srcBitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); } else if (type.equals("image/jpg") || type.equals("image/jpeg")) { srcBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); } byte[] bMapArray = baos.toByteArray(); baos.close(); return BitmapFactory.decodeByteArray(bMapArray, 0, bMapArray.length); } public static int getOrientation(Context context, Uri photoUri) { /* it's on the external media. */ Cursor cursor = context.getContentResolver().query(photoUri, new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); if (cursor.getCount() != 1) { return -1; } cursor.moveToFirst(); return cursor.getInt(0); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.