web-dev-qa-db-ja.com

BitmapFactory:ストリームをデコードできません:Java.io.FileNotFoundException

BitMapFactory.decodeFileに関して問題があります。

私のアプリでは、ユーザーがデバイスから画像を選択したり、写真を撮ったりできるようにしたいと考えています。次に、これをImageViewに表示する必要があります

ここにコードスニペットがあります:

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

そして私はこの例外を得ています:

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

解決方法。助けてください。よろしくお願いします。

7
Monali

その権限の問題は、外部読み取りストレージの権限をマニフェストに追加する必要があり、それを使用できるようになってから、6.0以上のOSを使用している場合は、簡単な権限を使用する必要があります。

書き込みの場合:

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

読み取りの場合:

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

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);
        }
20
Jd Prajapati

CAMERAインテントを開始するときに、READ-EXTERNALストレージの実行時の許可を求めています。

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

checkIfAlreadyhavePermission()メソッド:

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

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

これをマニフェストのアプリケーションタグに追加します。

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