IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

BitmapFactory et Android 5 et +


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Par défaut BitmapFactory et Android 5 et +
    Bonjour à toutes et tous,

    Voici un code récupérant une image, que j'affiche ensuite sur dans une ImageView :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
            protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
     
            if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data) {
                Uri selectedImage = data.getData();
                String[] filePathColumn = { MediaStore.Images.Media.DATA };
     
                Cursor cursor = getContentResolver().query(selectedImage,
                        filePathColumn, null, null, null);
                if (cursor != null) {
                    cursor.moveToFirst();
                    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                    String picturePath = cursor.getString(columnIndex);
                    soumissionIMG.setImageBitmap(BitmapFactory.decodeFile(picturePath));
                    imageChange = true;
                    cursor.close();
                }
            }
        }
    Du très classique, on va dire.

    Sur Android 4, pas de soucis, j'affiche bien l'image sélectionnée, à la taille de mon ImageView, et quand je la transmets (autre partie du code), je la récupère bien.

    Sous Android 5 et 6 (j'ai fait le test sur les deux), picturePath retourne bien le chemin de l'image, mais à l'affichage, soumissionIMG semble vide (je dis semble, car soumissionIMG est pré-remplie d'une image par défaut. Si je ne sélectionne rien, c'est cette image qui s'affiche. Mais là, plus d'image par défaut, et pas l'image sélectionnée). Et si d'aventure je transmets mon image "fantôme", j'ai le droit à un magnifique rectangle noir.

    Une idée de ce qui a changé entre les deux versions ?

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur
    Inscrit en
    Avril 2003
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur

    Informations forums :
    Inscription : Avril 2003
    Messages : 724
    Par défaut
    Salut,

    Regarde ce lien, il y a peut être la solution à ton problème:
    https://github.com/hdodenhof/CircleImageView/issues/31

    Cordialement

  3. #3
    Membre confirmé Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Par défaut
    Bonjour Philippe,

    Essayé avec :

    soumissionIMG.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

    qui semblait être la solution la plus établie (contestée dans sa qualité, mais le plus reconnue en tant que solution), mais ça ne change rien. Mon image est toujours invisible.

    La doc parle essentiellement de cas de dépassement de mémoire, mais je n'ai aucun message en ce sens.

    ==================================

    Quelques investigations de plus.

    Si je suis pas à pas le code, d'un côté avec un Android 4, de l'autre avec un Android 5, les valeurs retournées semblent identiques (au détail près que ce ne sont pas les mêmes images, et pas mêmes Id bien sûr).

    Cependant, si j'édite soumissionIMG après le .setImageBitmap, dans le cas d'Android 4, j'obtiens bien mon image si je la visualise à partir de la valeur mDrawable, alors que dans le cas d'Android 5, j'obtiens "Unable to obtain bitmap from drawable". D'où mon image fantôme.

    Mais alors qu'est ce qui cloche ? Le type ? .jpeg sur le poste en Android 4, .JPG sur celui en Android 5 ? Des paramètres non passés, devenus obligatoires en Android 5 ?

    J'ai vraiment du mal avec ce langage qui fonctionne avec une version et pas avec la suivante. Je sais, ça fait partie du jeu, mais j'ai quand même du mal...

    ===================================

    De fait, si je rajoute :

    Bitmap test = BitmapFactory.decodeFile(picturePath);

    test est null. Alors qu'il y a bien un chemin d'image....

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur mobile iOS / Android
    Inscrit en
    Décembre 2008
    Messages
    259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur mobile iOS / Android
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 259
    Par défaut
    Bonjour,

    Tu as visiblement des problèmes de permission. Depuis Android 5 Google a ajouté la gestion des permissions et donc tu as besoin de le demander explicitement dans ton code.
    Jettes un oeil dans la documentation officielle

    Bon courage
    « Il est assez difficile de trouver une erreur dans son code quand on la cherche. C’est encore bien plus dur quand on est convaincu que le code est juste. » - Steve McConnell

    N'oubliez pas de consulter les FAQ Swift, Android
    Tutoriel : Développer une application multilingue sous iOS

  5. #5
    Membre confirmé Avatar de Cabos
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Novembre 2010
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Novembre 2010
    Messages : 108
    Par défaut
    Seelass, tu es un génie !

    Nan, sérieux, je le savais le coup des permissions, mais j'ai pas pensé au côté explicite obligatoire du code (je pensais juste aux autorisations accordées par l'utilisateur !!!).

    Donc, un simple <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> au manifest, et l'affaire est entendue, ça ronronne comme ça doit (et comme en Android 4, où cette permission n'était pas nécessaire !).

    C'est peut aussi lié au fait que sur mon ancien poste, j'allais chercher l'image sous /sdcard0 et sur l'Android 5 sous /external ? May be, n'empêche que c'était bien les permissions !

    Merci encore Seelass, un + pour ta réponse.

    Affaire résolue.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Android challenge : Construction d'une équipe projet
    Par myDroid dans le forum Android
    Réponses: 0
    Dernier message: 15/11/2007, 20h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo