0

에뮬레이터에서 내 앱을 테스트하고 있습니다. 외부 저장소의 다운로드 디렉토리에있는 파일을 만들고 쓰는 내보내기 기능이 있습니다. 또한 외부 저장소의 다운로드 디렉토리에서 파일을 읽는 가져 오기 기능이 있습니다. Android documentation에서외부 저장소에서 파일을 읽는 데 READ_EXTERNAL_STORAGE 권한 요청이 필요하지 않은 이유는 무엇입니까?

:

장치가 안드로이드 5.1 이하 또는 앱의 대상 SDK를 실행하는 경우는 22 이하이다 : 당신이 당신의 매니페스트에 위험한 권한을 나열하는 경우, 사용자는 권한을 부여해야 그들이 앱을 설치할 때; 권한을 부여하지 않으면 시스템에서 앱을 전혀 설치하지 않습니다.

기기가 Android 6.0 이상을 실행하고 앱의 대상 SDK가 23 이상인 경우 : 앱은 매니페스트에 권한을 나열해야하며 앱이 실행되는 동안 필요한 위험한 권한을 각각 요청해야합니다. 사용자는 각 권한을 부여하거나 거부 할 수 있으며 사용자가 권한 요청을 거부하더라도 제한된 기능으로 앱을 계속 실행할 수 있습니다.

내 에뮬레이터가 Android 6.0에서 실행되고 내 앱의 대상 SDK가 25이므로 해당 앱이 실행되는 동안 필요한 위험한 권한을 각각 요청해야합니다. 나는 수출 기능을 위해 그렇게했고 모든 것이 제대로 작동합니다. 그러나 가져 오기 기능을 구현할 때 런타임 중에 권한을 요청하지 않았습니다. 이상한 점은 READ_EXTERNAL_STORAGE를 요청하지 않고 런타임에 권한을 부여하지 않고도 외부 저장소의 권한을 읽을 수 있다는 것입니다. READ_EXTERNAL_STORAGE는 (는) Android documentation에 따른 위험한 권한입니다.

확인하려면 기능을 사용하기 전에 사용 권한을 사용하지 않도록 설정했는지 확인한 다음 해당 기능을 완료 한 후에 사용 권한이 여전히 부여되지 않았 음을 다시 확인했습니다. 런타임에 권한을 요청하지 않고도 작동하기 때문에 동작에 만족하지만 문서에 따르면이 동작이 예상되는 것은 아닙니다. 이것이 내가 앱의 변경 사항을 게시하기 전에 원인을 파악하고 문제를 파악하려는 이유입니다.

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

내가 파일을 선택할 코드 조각은 읽기 : 여기

내 매니페스트의 코드 조각입니다

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
      intent.setType("text/*"); 
      startActivityForResult(intent, GET_FILE_RESULT_CODE); 

나는 코드에서 선택한 파일을 읽어 코드 위에서 (exportFile은 단순히 onActivityResult의 URI 임) :

BufferedReader br; 
    try { 
     br = new BufferedReader(new InputStreamReader(context.getContentResolver().openInputStream(exportFile))); 
     String line; 
     // Skip first header line 
     br.readLine(); 
     while ((line = br.readLine()) != null) {...} 

감사합니다.

답변

0

당신도 이미 매니페스트에서 WRITE_EXTERNAL_STORAGE 권한을 신청 했으므로 Android 런타임 권한이 그룹화되어 있으므로 READ_EXTERNAL_STORAGE 권한을 신청할 필요가 없습니다. 둘 다 같은 그룹입니다.

+0

안녕하십니까, 감사합니다. WRITE_EXTERNAL_STORAGE를 요청하면 내 매니페스트에서 READ_EXTERNAL_STORAGE를 선언 할 필요가 없다는 것을 알았습니다. 나는 "응용 프로그램이 매니페스트의 사용 권한을 나열해야하며 응용 프로그램이 실행되는 동안 필요한 각 위험한 권한을 요청해야합니다."라고 언급했습니다. 나는 그것을 수입하지 않았다. –

1

잘 설명 here,

보호를 제공

READ_EXTERNAL_STORAGE 외부 저장 장치에 대한 읽기 권한이있다. Android 4.1의 경우 기본값은 모든 애플리케이션에 여전히 읽기 권한이 있습니다.이 응용 프로그램이이 사용 권한을 사용하여 명시 적으로 읽기 액세스를 요구하도록하기 위해 향후 릴리스에서 으로 변경됩니다. 응용 프로그램에 이미 이 쓰기 액세스를 요청하면 자동으로 읽기 액세스 권한도 얻습니다. 개발자가 의 Android가 앞으로 어떻게 작동할지에 대한 응용 프로그램을 테스트 할 수 있도록 읽기 액세스 제한을 설정하는 새로운 개발자 옵션이 있습니다. 한마디로

, READ_EXTERNAL_STORAGE은 젤리 빈 (레벨 16)의 존재합니다. 따라서 Jelly Bean 전화를 사용하고 개발자 옵션 "Protect USB storage"을 설정하지 않으면 문제가되지 않습니다.

+0

Hello Prokash, 입력 해 주셔서 감사합니다. 그러나 내 내보내기 기능이 런타임 중에 액세스를 요청하더라도 런타임 동안 권한이 요청되지 않도록 프로세스를 거치지 않습니다. 테스트 할 때 에뮬레이터에 권한이 부여되지 않았으며 명시 적으로 매니페스트의 사용 권한을 제거했으며 가져 오기를 시도 할 때 런타임에 요청 된 매니페스트 및 사용 권한에 명시된 권한 없이도 작동합니다. –

+0

btw가 (외부 저장소에서 읽는) 가져 오기 기능이 아닌 내 내보내기 기능 (외부 저장소에 쓰는 기능)을 사용하지 않도록 설정 했으므로 매니페스트에서 권한을 제거해야합니다. –