web-dev-qa-db-fra.com

BitmapFactory: Impossible de décoder le flux: Java.io.FileNotFoundException

J'ai un problème concernant le BitMapFactory.decodeFile.

Dans mon application, je souhaite que l'utilisateur puisse sélectionner une image à partir de son appareil ou prendre une photo. Ceci doit ensuite être affiché dans un ImageView

Voici l'extrait de code:

Uri selectedImage = data.getData();
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(selectedImage, filePathColumn, null, null, null);
                    cursor.moveToFirst();
                    int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
                    String picturePath = cursor.getString(columnIndex);
                    cursor.close();
                    MyImage image = new MyImage();
                    image.setTitle("Test");
                    image.setDescription("test choose a photo from gallery and add it to " + "list view");
                    image.setDatetime(System.currentTimeMillis());
                    image.setPath(picturePath); 

Et je reçois cette exception:

BitmapFactory: Unable to decode stream: Java.io.FileNotFoundException: /storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20170302-WA0012.jpg: open failed: EACCES (Permission denied)

Comment résoudre ce problème.Veuillez m'aider.Merci d'avance .. 

4
Monali

En raison de son problème d’autorisation, vous devez ajouter une autorisation dans manifeste pour le stockage en lecture externe, puis, une fois que vous êtes en mesure de l’utiliser et si vous utilisez os supérieur à 6.0, vous devez utiliser l’autorisation Easy.

Pour écrire: 

<uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />

Pour lire: 

<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />

Au-dessus de 6.0:

private String[] galleryPermissions = {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE};

if (EasyPermissions.hasPermissions(this, galleryPermissions)) {
            pickImageFromGallery();
        } else {
            EasyPermissions.requestPermissions(this, "Access for storage",
                    101, galleryPermissions);
        }
15
Jd Prajapati

Vous devez demander l’autorisation d’exécution pour le stockage READ-EXTERNAL lorsque vous démarrez votre objectif CAMERA:

final int MyVersion = Build.VERSION.SDK_INT;
        if (MyVersion > Build.VERSION_CODES.Lollipop_MR1) {
            if (!checkIfAlreadyhavePermission()) {
                ActivityCompat.requestPermissions(new String[]{Android.Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
            } else {
               startYourCameraIntent();
            }
        }

méthode checkIfAlreadyhavePermission ():

private boolean checkIfAlreadyhavePermission() {
        int result = ContextCompat.checkSelfPermission(getActivity(), Manifest.permission.WRITE_EXTERNAL_STORAGE);
        return result == PackageManager.PERMISSION_GRANTED;
    }

Action de bouton "Autoriser" et "Refuser" dans les boîtes de dialogue d'autorisations dans onRequestPermission ():

@Override
        public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1: {
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                   startYourCameraIntent();

                } else {
                    Toast.makeText(getActivity(), "Please give your permission.", Toast.LENGTH_LONG).show();
                }
                break;
            }
        }
    }

Et ajoutez ceci à la balise d'application de votre manifeste:

<uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />
1
tahsinRupam