Я пытаюсь поделиться файлом (типа PDF, но это не важно), присутствующим в моем каталоге «external_files» App1 (/storage/emulated/0/Android/data/com.package.app1/files), в мое приложение App2. Я тестирую это в эмуляторе Android 10 (из Android Studio, последняя версия), оба приложения используют Scoped Storage, а поддержка устаревшего внешнего хранилища не включена.
Кажется, все определяется «книгой» в манифесте App1:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="com.package.app1.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/my_paths" />
</provider>
тогда my_paths.xml имеет
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-files-path name="external_files" path="." />
</paths>
Затем в App1:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setPackage("com.package.app2");
File file = new File(context.getExternalFilesDir(null), "MyFile.pdf");
Uri uri = FileProvider.getUriForFile(context, "com.package.app1.fileprovider", file);
context.grantUriPermission("com.package.app2", uri,
FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndTypeAndNormalize(uri, "application/pdf");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
activity.startActivityForResult(intent, MY_REQUEST_CODE);
App2 имеет в своем манифесте:
<activity android:name=".MainActivity" android:configChanges="orientation|screenSize|keyboardHidden"
android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/pdf" />
</intent-filter>
</activity>
В App2: активность onCreate():
Uri uri = getIntent().getData(); // The content:// uri looks correct
if (uri != null) {
DocumentFile docFile = DocumentFile.fromSingleUri(this, uri);
Log.d("myTag", uri.toString + ": EXISTS: ", docFile.exists(), ", can read: ", docFile.canRead());
}
Вывод всегда, независимо от того, что я делаю:
content://com.package.app1.fileprovider/external_files/MyFile.pdf: EXISTS: true, can read: false
Что я делаю не так, почему я не могу получить "can read: true"?