일부 데이터를 파일로 내보내는 Android 앱을 씁니다.내 앱에 READ_EXTERNAL_STORAGE이 (가)없는 경우 파일 관리자가 공유 한 파일에 액세스하는 방법
파일은 ACTION_SEND
Intent
과 내 맞춤 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_SEND
의 ACTION_VIEW
액션을 사용했다). ACTION_GET_CONTENT
Intent
을 사용하여 내 앱에서 파일 선택기를 호출하고 내 앱에서 Uri
을 사용하려고했습니다. 심지어 "content://" Uris
이 작동하지 않기 때문에 결과가 더욱 나 빠졌다.
그래서 질문은입니다 - 내 애플
READ_EXTERNAL_STORAGE permission
를 추가하지 않고 공유 파일에 액세스 할 수있는 방법으로 인기있는 파일 관리자에서 공유 파일에 액세스 할 수있는 방법은 무엇입니까? ...
내가
FLAG_GRANT_READ_URI_PERMISSION
에 대한 안드로이드 문서에서 읽을 수
그 file:// Uris
안드로이드 7.0부터 금지된다, 그래서 모든 그것을 작동하게하는 이론적 준비가되어 있지만, 현실 세계에서 나는 벽에 부딪
항상 내 앱에 READ_EXTERNAL_STORAGE
권한을 추가하거나 사용자가 파일을 내 앱의 외부 저장소 디렉토리 (경로 : getExternalFilesDir
)로 직접 복사 한 다음 파일에 액세스하도록 요청할 수는 있지만 이러한 두 가지 작업에는 심각한 단점이 있습니다. 허가 또는 빈약 한 사용자 경험).
내가 사용할 수있는 다른 옵션이 있습니까?
'ACTION_GET_CONTENT 인 텐트를 사용하여 내 앱에서 파일 선택기를 호출했으며 내 앱에서 반환 된 Uri를 사용하고 싶습니다. 그 결과는 "content : //"Uris가 작동하지 않기 때문에 더욱 악화되었습니다. 죄송합니다. 나는 작동하지 않을 것이 무엇인지 이해하지 못합니다. 앱은 콘텐츠 구성표를 사용하여 파일을 열 수 있습니다. 너는 무엇을 원하니? – greenapps
시스템에 권한이 없기 때문에이 경우 Uris 컨텐츠를 열 수 없다는 것이 문제입니다. 피커 앱이 내 앱으로 전송 된 인 텐트의 FLAG_GRANT_READ_URI_PERMISSION 플래그를 설정하지 않았지만 ES 파일 탐색기의 소스가 없으므로이를 확인할 수 없습니다. – Bieniu
믿기 힘듭니다. 나는 ACTION_GET_CONTENT에 의해 얻어진 내용 체계가 쓸모 없다는 것을 본 적이 없다. ACTION_GET_CONTENT에 대해 이야기하면서 ES 파일 탐색기에 대해 언급하는 이유는 무엇입니까? – greenapps