2016-10-29 21 views
5

Jak mogę wyświetlać pliki z pamięci zewnętrznej SECONDARY przy użyciu FileProvider?FileProvider i dodatkowa pamięć zewnętrzna

Obecna implementacja FileProvider obsługuje tylko pierwszy katalog, zwrócony przez ContextCompat.getExternalFilesDirs

...  
} else if (TAG_EXTERNAL_FILES.equals(tag)) { 
    File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null); 
    if (externalFilesDirs.length > 0) { 
     target = externalFilesDirs[0]; 
    } 
} 
... 

Wydaje się, że nie ma sposobu, aby zdefiniować <path> wpis dla FileProvider, który pasuje do wtórnego ścieżkę pamięci zewnętrznej. ..

+0

Co masz na myśli z dodatkowym zewnętrznym dyskiem? – greenapps

+0

Katalogi zwrócone przez 'ContextCompat.getExternalFilesDirs' ze wskaźnikiem tablicy> 0. Na większości urządzeń prawdopodobnie będzie to wymienna karta SD. – artkoenig

+0

AFAIK, 'FileProvider' nie obsługuje tego. Możesz połączyć coś z [moim 'StreamProvider'] (https://github.com/commonsguy/cwac-provider), ale nie ma na to żadnego wsparcia" po wyjęciu z pudełka ". Dodałem, że do mojej listy rzeczy do zrobienia dla "StreamProvider", jak zrobić dobry punkt. Zwłaszcza, że ​​w przypadku tych lokalizacji nie są stosowane żadne uprawnienia do aplikacji, powinny one być dostępne, przynajmniej wtedy, gdy istnieją. Tym, co może być trudne, jest prawidłowe postępowanie w przypadku, gdy wymienny nośnik pamięci nie jest dostępny, ale użytkownik zażądał jego doręczenia. – CommonsWare

Odpowiedz

4

Odpowiedź jest ... FileProvider nie obsługuje tego. W przypadku systemu Android 7 jest to jeszcze bardziej problematyczne, ze względu na wycofanie schematu Uri file://.

Wydałem numer bug report.

1

Jako obejście można użyć bezwzględne Ścieżki edukacyjne:

<!-- secondary external storage with path /storage/extSdCard --> 
<root-path path="/storage/extSdCard/Android/data/YOUR_PACKAGE/files/" name="extSdCard" /> 

<!-- secondary external storage with path /storage/sdcard1 --> 
<root-path path="/storage/sdcard1/Android/data/YOUR_PACKAGE/files/" name="sdcard1" /> 
+1

W przypadku nowszych urządzeń ścieżka zewnętrzna zależy od włożonej karty SD, ponieważ wykorzystuje identyfikator referencyjny, więc niemożliwe jest użycie ścieżki bezwzględnej. – 3c71

1

Więc skończyło się w następujący sposób:

spróbować stworzyć do Uri poprzez FileProvider, Jeśli to się nie powiedzie z powodu:

java.lang.IllegalArgumentException: Failed to find configured root that contains 

Po prostu tworzę zwykłego Uri.

Oto mój kod:

try { 
     uri = FileProvider.getUriForFile(context, 
       MY_AUTHORITY_STRING, 
       imageFile); 
    } catch (Exception e) { 
     CLog.d(TAG, e); 
     uri = Uri.fromFile(imageFile); 
    } 

Nie wiem dlaczego, ale to działa, FileProvider nie może uzyskać dostępu do pliku (jak to w średnim pamięci zewnętrznej), a następnie uri zostanie pomyślnie utworzony w klauzula catch.

Dziwne Google ... bardzo dziwne.

+1

ulega awarii w wersji 7.0+ –

2

Aby obsłużyć pliki znajdujące się na sdcards zewnętrznych, zmieniłem provider_paths.xml do

<paths> 
    <external-path path="." name="external_files" /> 
    <root-path path="." name="sdcard1" /> 

</paths> 
2

FileProvider nie obsługują przechowywanie wtórnego ze względu na poniższy kod:

kodu ze wsparcia: Wsparcie-core-utils : 26.1.0 FileProvider

  } else if (TAG_EXTERNAL_FILES.equals(tag)) { 
       File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null); 
       if (externalFilesDirs.length > 0) { 
        target = externalFilesDirs[0];// Code here, That's why!!! 
       } 
      } else if (TAG_EXTERNAL_CACHE.equals(tag)) { 

Jednakże, istnieje specjalna TAG w FileProvider: root-path, którego nie uwzględniono w oficjalnym odnośniku.

  if (TAG_ROOT_PATH.equals(tag)) { 
       target = DEVICE_ROOT;// DEVICE_ROOT = new File("/"); 
      } else if (TAG_FILES_PATH.equals(tag)) { 

Ścieżka korzenia pasuje do wszystkich ścieżek.

Po prostu wpisz ten kod w swoim pliku XML FileProvider, a następnie FileProvider może obsługiwać plik w magazynie wtórnym.

<root-path name="root" path="." /> 

Należy pamiętać, że może to spowodować wyciek struktury katalogów.

Powiązane problemy