Mam 2 aplikacje - Demo i Pro. Demo ma dostawcę treści, a kiedy Pro jest zainstalowany, musi przesłać wszystkie pliki od dostawcy demonstracyjnego.Przyznanie uprawnień użytkownika dla FileProvider daje SecurityException
Aplikacja Demo (dostawca):
<provider
android:name="***.provider.InternalStorageProvider"
android:authorities="***.demo.storage.int.provider"
android:exported="false"
android:syncable="true"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/int_storage_paths" />
</provider>
Pro app (konsument):
Eksperyment 1:
ParcelFileDescriptor PFD = cr.openFileDescriptor (exposedFileUri, "r");
Wejście FileInputStream = new FileInputStream (pfd.getFileDescriptor());
java.lang.SecurityException: Odmowa zgody: dostawca otwór .provider.InternalStorageProvider z ProcessRecord {9c85875 10734:/u0a61} (PID = 10734, UID = 10061), który nie jest wywożona z uid 10062
Eksperyment 2:
Aktywność w działaniu = getActivity(); activity.grantUriPermission (activity.getPackageName(), exposedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
ParcelFileDescriptor pfd = cr.openFileDescriptor (exposedFileUri, "r"); Wejście FileInputStream = new FileInputStream (pfd.getFileDescriptor());
java.lang.SecurityException: Uid 10061 nie ma uprawnień do Uri 0 @ treści: //***.demo.storage.int.provider/db/file1
InternalStorageProvider
jest kopią normalnego FileProvider
. Ale nie ma to znaczenia, ponieważ egzekucja nie może jej dosięgnąć. Wyjątki są generowane przed wywołaniem. Należy pamiętać, że nie są w to zaangażowane żadne czynności i zamiary. Konsument próbuje otworzyć plik ze znanego URI bezpośrednio, bez wyborów. Większość przykładów, które znalazłem używają Intent.FLAG_GRANT_READ_URI_PERMISSION
, ale w ogóle nie używam intencji.
W jaki sposób mam udzielać praw uri konsumentowi w prawidłowy sposób?
Bieganie na ten temat już teraz, przypadkiem udało ci się go rozwiązać? –
To było dawno temu, prawie nic nie pamiętam. To jest prawdziwe zło. – WindRider
Rozwiązałem to, przekazując 'FLAG_GRANT_READ_URI_PERMISSION' do absolutnie każdej innej intencji, która korzystała z URI wewnątrz mojej aplikacji –