6

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?

+0

Bieganie na ten temat już teraz, przypadkiem udało ci się go rozwiązać? –

+0

To było dawno temu, prawie nic nie pamiętam. To jest prawdziwe zło. – WindRider

+0

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 –

Odpowiedz

1

Trzeba dać pozwolenie na pro aplikacji ...

activity.grantUriPermission("pro app package name", exposedFileUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);