2016-08-24 9 views
0

인 텐트를 사용하여 사진 경로를 가져 와서 파일로 엽니 다. "/storage/emulated/0/DCIM/Camera/IMG_20160817_232858.jpg"와 같은 "카메라"폴더에 할당 된 파일을 열 수 있지만 "/storage/emulated/0/Pictures/1634894_.png"와 같은 위치에서 파일을 열 수 없습니다. . 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); 

갱신 3 : 실행 시간 권한 : 매니페스트에

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를 얻기 위해 그것을에 InputStream
  • DocumentFile.fromSingleUri()를 얻을 수
+0

여전히 동일한 파일에 액세스 할 수 없습니다. – PaulD

+0

여기 있어요 : https://i.gyazo.com/0bf31c2030baf9f0a4e36ba71777c028.png하지만 다른 파일은 잘 작동합니다. – PaulD

+0

@ PaulD : 이제는 기괴합니다. 그냥 확인해보십시오 : 여러분의 코드는'onActivityResult()'에 의해 직접 트리거됩니다 (여러분의 질문에있는 코드와 비슷합니다). 결과에'Uri'를 사용하면됩니까? 과거의 앱 실행으로 저장된 'Uri'가 아닙니다. 맞습니까? 이 경우 귀하의 문제는 [Uri가 지정한 콘텐츠에 액세스 할 수있는 귀하의 권리는 매우 제한적입니다] (https://commonsware.com/blog/2016/08/10/uri-access- 평생 - 생각보다 짧을 수도 있습니다 .html). – CommonsWare