0

インテントを使用して写真のパスを取得し、それらをファイルに開きます。「/storage/emulated/0/DCIM/Camera/IMG_20160817_232858.jpg」のように「カメラ」フォルダに配置されたファイルを開くことはできますが、「/storage/emulated/0/Pictures/1634894_.png」のような場所のファイルを開くことができません。 . file.exists() を使用すると、そうではないと言うだけです。私は API 23 を使用していて、READ_EXTERNAL_STORAGE を要求していると言う必要があるので、これは問題になりません...しかし、それでもそれらのファイルにアクセスできません。何が間違っている可能性がありますか?

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == RESULT_LOAD_IMG && resultCode == RESULT_OK && null != data) {
            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);
            File file = new File(picturePath);
            if(file.exists()) {

            } else {

            }
            cursor.close();
        }
    }

更新: 同じフォルダーのすべてのファイルで発生するわけではなく、一部のファイルで発生しますが、ギャラリーから開くことができるため、実際に存在します。

Update2: このインテントを使用します。

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

Update3: 実行時のアクセス許可:

if (Build.VERSION.SDK_INT >= 23) {
                if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                        == PackageManager.PERMISSION_GRANTED) {
                    SomeWork();
                } else {
                    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                }
            }
            else { 
                SomeWork();
            }

マニフェストのアクセス許可:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
4

2 に答える 2

1

MediaStoreは、ファイル システムからアクセスできないイメージのインデックスを作成します。DATA列が使用可能な値を返す必要はありません。

代わりに、 を取得しようとするのをやめて、それ自体File使用しUriます。

  • getContentResolver().openInputStream()それに乗るためInputStream
  • DocumentFile.fromSingleUri()DocumentFileメタデータ (MIME タイプなど) に簡単にアクセスするための
于 2016-08-24T12:09:35.927 に答える