-1

일부 데이터를 파일로 내보내는 Android 앱을 씁니다.내 앱에 READ_EXTERNAL_STORAGE이 (가)없는 경우 파일 관리자가 공유 한 파일에 액세스하는 방법

파일은 ACTION_SENDIntent과 내 맞춤 ContentProvider을 통해 다른 앱에 게시됩니다. 그것은 잘 작동합니다. 파일을 전자 메일에 첨부하거나 Bluetooth을 통해 보낼 수 있습니다.

같은 이야기의 다른 측면은 앱이 가져 오기 위해 파일을받을 수 있어야한다는 것입니다. 내 의도는 사용자가 파일 관리자에서 파일을 선택하고 "공유"옵션을 선택하게하는 것입니다. 이제 내 intent-filter이 활성화되어야하고 내 앱이 파일에 액세스해야합니다.

일반적으로 외부 저장소의 파일에 액세스 할 필요가 없기 때문에 내 앱에는 READ_EXTERNAL_STORAGE 권한이 없습니다. 이 권한을 추가하고 싶지는 않지만 내 앱이 잠재적으로 자신의 사진 등에 액세스 할 수 있다는 사용자를 두려워하지 않으려 고합니다.

Intent 클래스의 설명서에 따르면 호출하는 응용 프로그램이 FLAG_GRANT_READ_URI_PERMISSION을 추가하면 내 응용 프로그램에서 공유 파일을 읽을 수있을만큼 충분해야합니다.

intent-filter :

<intent-filter> 
    <action android:name="android.intent.action.SEND"/> 
    <action android:name="android.intent.action.SENDTO"/> 
    <action android:name="android.intent.action.SEND_MULTIPLE"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <category android:name="android.intent.category.BROWSABLE"/> 
    <data android:mimeType="*/*"/> 
</intent-filter> 
인 텐트를 처리 할 내 코드가 의도 필터를 통해 수신

: 이것은 단지 "테스트"코드

Uri uri = null; 
if (uri == null) 
{ 
    uri = intent.getData(); 
} 
if (uri == null) 
{ 
    if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) 
    { 
     uri = (Uri) intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM).get(0); 
    } 
    else 
    { 
     uri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM); 
    } 
} 
if (uri != null) 
{ 
    try 
    { 
     InputStream stream = getContentResolver().openInputStream(uri); 
     stream.read(); 
     stream.close(); 
     Toast.makeText(this, "Success " + intent.getAction() + " " + uri.toString(), Toast.LENGTH_LONG).show(); 
    } 
    catch (IOException e) 
    { 
     Toast.makeText(this, "Error " + intent.getAction() + " " + uri.toString() + " " + e.getMessage(), Toast.LENGTH_LONG).show(); 
    } 
} 

, 그래서 난 그냥 아무것도 읽으려고 파일의 시작 부분부터 작동하는지 확인하십시오.

결과는 : 나는 ES는 파일 탐색기 및 내 응용 프로그램을 "공유"파일에 놀라게 사용하여 시도

  • . 보통 Uri을받은 파일은 Uri ("file://" scheme)이고이 파일을 열려고하면 내 앱이 해당 파일에 액세스 할 수 없다는 정보와 함께 openInputStream에서 실패합니다.

  • 어떤 이유로 ES 파일 탐색기에서 미디어 파일 인 파일을 공유 할 때 동작이 변경됩니다. "content://" Uri을 받고 내 앱에서 파일에 액세스 할 수 있습니다. 놀라움은 여전히 ​​"file://" Uri을 보내고 파일을 여는 데 실패합니다.

  • (가능한 경우) ClipData에서 Uris 코드를 수정하려고했지만 아무 것도 변경하지 않았습니다.

  • 내장 된 MIUI 이메일 클라이언트에서 첨부 파일을 열려고하면 file:// Uris도 수신되며 파일에 액세스 할 수 없습니다. 나는 또한 다른 방법을 시도

(이 테스트 내가 대신 ACTION_SENDACTION_VIEW 액션을 사용했다). ACTION_GET_CONTENTIntent을 사용하여 내 앱에서 파일 선택기를 호출하고 내 앱에서 Uri을 사용하려고했습니다. 심지어 "content://" Uris이 작동하지 않기 때문에 결과가 더욱 나 빠졌다.

그래서 질문은입니다 - 내 애플 READ_EXTERNAL_STORAGE permission를 추가하지 않고 공유 파일에 액세스 할 수있는 방법으로 인기있는 파일 관리자에서 공유 파일에 액세스 할 수있는 방법은 무엇입니까? ...

내가 FLAG_GRANT_READ_URI_PERMISSION에 대한 안드로이드 문서에서 읽을 수

file:// Uris 안드로이드 7.0부터 금지된다, 그래서 모든 그것을 작동하게하는 이론적 준비가되어 있지만, 현실 세계에서 나는 벽에 부딪

항상 내 앱에 READ_EXTERNAL_STORAGE 권한을 추가하거나 사용자가 파일을 내 앱의 외부 저장소 디렉토리 (경로 : getExternalFilesDir)로 직접 복사 한 다음 파일에 액세스하도록 요청할 수는 있지만 이러한 두 가지 작업에는 심각한 단점이 있습니다. 허가 또는 빈약 한 사용자 경험).

내가 사용할 수있는 다른 옵션이 있습니까?

+0

'ACTION_GET_CONTENT 인 텐트를 사용하여 내 앱에서 파일 선택기를 호출했으며 내 앱에서 반환 된 Uri를 사용하고 싶습니다. 그 결과는 "content : //"Uris가 작동하지 않기 때문에 더욱 악화되었습니다. 죄송합니다. 나는 작동하지 않을 것이 무엇인지 이해하지 못합니다. 앱은 콘텐츠 구성표를 사용하여 파일을 열 수 있습니다. 너는 무엇을 원하니? – greenapps

+0

시스템에 권한이 없기 때문에이 경우 Uris 컨텐츠를 열 수 없다는 것이 문제입니다. 피커 앱이 내 앱으로 전송 된 인 텐트의 FLAG_GRANT_READ_URI_PERMISSION 플래그를 설정하지 않았지만 ES 파일 탐색기의 소스가 없으므로이를 확인할 수 없습니다. – Bieniu

+0

믿기 힘듭니다. 나는 ACTION_GET_CONTENT에 의해 얻어진 내용 체계가 쓸모 없다는 것을 본 적이 없다. ACTION_GET_CONTENT에 대해 이야기하면서 ES 파일 탐색기에 대해 언급하는 이유는 무엇입니까? – greenapps

답변

0

Intent 클래스의 문서에 따르면 호출하는 앱이 FLAG_GRANT_READ_URI_PERMISSION을 추가하면 내 앱이 공유 파일을 읽을 수있을만큼 충분해야합니다.

이는 content 체계에서만 작동합니다.

내 앱에서 ACTION_GET_CONTENT 인 텐트를 사용하여 파일 선택기를 호출했으며 내 앱에서 반환 된 Uri를 사용하고 싶습니다. 결과적으로 "content : //"Uris가 작동하지 않기 때문에 더 나빴습니다.

코드에 버그가있는 것 같습니다. 당신은 그것에 대한 별도의 스택 오버 플로우 질문을 여는 것을 고려할 수도 있습니다.

또한 API 레벨 19 이상에서는 ACTION_OPEN_DOCUMENT을 사용할 수 있습니다. 이는 Intent으로 권장됩니다.

내 애플 READ_EXTERNAL_STORAGE 권한을 추가하지 않고 공유 파일에 액세스 할 수 있도록하는 방식으로 인기있는 파일 관리자에서 공유 파일에 액세스 할 수있는 방법은 무엇입니까?

그들이 당신에게 줄 경우 fileUri. 그리고 불행히도 ACTION_SEND은 스키마별로 필터링을 제공하지 않습니다. 안드로이드 7.0 이상 24+의 targetSdkVersion와 애플리케이션에 대한 Intent에 포함하려고 애플 리케이션을 나누기로 :-(이제

는 장기적으로 fileUri 값은 페이드 아웃됩니다.

+0

답변 해 주셔서 감사합니다. 그래서 나는 지금까지 행운이 없다고 생각합니다. 안드로이드 7.0+가 표준이 될 때까지 기다려야합니다. :) – Bieniu

0

안드로이드 다른 응용 프로그램에서 파일을 공유하기위한 지원 라이브러리에 FileProvider 클래스를 발표했다. 이것은 보안을 위해 도입되었습니다.

는 물론 안드로이드 7.0

당신이 파일 접두사와 URI를 액세스 할 수 없습니다.

을하지 않는 한 파일까지 관리자는 // 대신 콘텐츠 : // 대신 URI를 제공하므로 파일에 액세스 할 수 없습니다.