2016-08-24 3 views
0

私はインテントを使って画像のパスを取得し、ファイルに開きます。 "/storage/emulated/0/DCIM/Camera/IMG_20160817_232858.jpg"のように "Camera"フォルダに割り当てられたファイルを開くことができますが、 "/storage/emulated/0/Pictures/1634894_.png"のような場所にファイルを開くことはできません。 。 file.exists()を使うと、file.exists()はそうではないと言います。 私はAPI 23を使用していて、READ_EXTERNAL_STORAGEを要求しているので、これは問題ではありません...しかし、それらのファイルにもアクセスできません。 何が間違っていますか?いくつかのファイルがあるENOENT

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

更新日:それは、同じフォルダからすべてのファイルと起こり、それらのほんの一部が、私は、ギャラリーからそれらを開くことができますので、彼らは本当に存在していません。

更新2: 私はこのインテントを使用します。

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" /> 
+0

あなたは6.0で動作していますか? –

+0

はい、私はMarshmallow – PaulD

+0

を使用して実行時のアクセス権を取得していますか? –

答えて

1

MediaStore意志のインデックス画像。 DATA列には、使用できる値を返す必要はありません。代わりに

File、およびuse the Uri itselfを取得しようと停止します。

  • getContentResolver().openInputStream()メタデータ(例えば、MIMEタイプ)へ簡単にアクセスするためのDocumentFileを取得するためにInputStreamDocumentFile.fromSingleUri()
  • 、その上を取得するために
+0

同じファイルにまだアクセスできません。 – PaulD

+0

ここにあなたはあります:https://i.gyazo.com/0bf31c2030baf9f0a4e36ba71777c028.pngしかし他のファイルはうまく動作します – PaulD

+0

@パウルド:OK、これはかなり奇妙です。ちょうど確かめてください:あなたのコードは 'onActivityResult()'によって直接引き起こされます(あなたの質問のコードとよく似ています)、結果の 'Intent'に' Uri'を使用していますか?あなたのアプリの過去の動きから、いくつかの「Uri」が保存されたのではないでしょうか?その場合、あなたの問題は[Uriによって識別されるコンテンツにアクセスするあなたの権利は非常に限られている](https://commonsware.com/blog/2016/08/10/uri-access-生涯 - 思考よりも短い.html)。 – CommonsWare

関連する問題