2015-10-12 12 views
11

Potrzebuję pobrać pliki z urządzenia mobilnego i udostępnić je innym aplikacjom (z systemem Android i iOS).Zapisz plik w publicznym katalogu przy użyciu Cordova FileTransfer

udało mi się pobrać plik na karcie SD (cordova.file.externalDataDirectory), ale istnieje tylko na Androida, a nawet wtedy nie mogę polegać na każdym urządzeniu posiadającym kartę SD.

Po pobraniu do pamięci urządzenia (cordova.file.dataDirectory) plik jest prywatny dla mojej aplikacji i dlatego nie jest dostępny dla innych aplikacji. Plik można otworzyć w InAppBrowser, ale wolałbym użyć odpowiedniej domyślnej aplikacji.

Czy istnieje sposób, aby uzyskać ścieżkę do katalogu publicznie dostępnego na wszystkich urządzeniach?

Ścieżki zwracane przez rozwiązanie zaproponowane w https://stackoverflow.com/a/21375812/3432305 są zarówno prywatne na Androida ...

EDIT:

myślę, że powinienem opisać mój przypadek użycia, więc jest to bardziej przejrzyste, co usiłuję Aby osiągnąć: Chcę otworzyć pliki z mojego na czacie aplikacji przy użyciu odpowiedniej domyślnej aplikacji (przeglądarki plików PDF, przeglądarki obrazów itp.). Ponieważ Cordova File Opener plugin akceptuje tylko pliki z lokalnego systemu plików, muszę je najpierw zapisać. Ale niekoniecznie muszą być dostępne poza moją aplikacją ...

Odpowiedz

14

Na Androidzie katalogi pamięci zewnętrznej zawsze istnieją; jeśli urządzenie nie ma fizycznej karty SD, Android ją emuluje. zobacz getExternalStorageDirectory:

Uwaga: nie należy mylić słowa "zewnętrzne" tutaj. Ten katalog można lepiej uznać za nośnik/współużytkowaną pamięć masową. Jest to system plików, który może pomieścić stosunkowo dużą ilość danych i jest współdzielony przez wszystkie aplikacje (nie wymuszając uprawnień) pod . Tradycyjnie jest to karta SD, ale może być również zaimplementowana jako wbudowana pamięć w urządzeniu , która różni się od chronionej pamięci wewnętrznej i może być zamontowana jako system plików na komputerze.

Dlatego cordova.file.externalDataDirectory zawsze rozwiąże. Jednak w celu udostępniania danych między aplikacjami prawdopodobnie użyjesz cordova.file.externalRootDirectory - Korzeń pamięci zewnętrznej (karta SD). Zobacz cordova-plugin-file.

W ten sposób można przechowywać pliki w miejscu łatwiej dostępnym z innej aplikacji, np. /sdcard/my_shared_data/

iOS, jest to trudniejsze do udostępniania plików, ponieważ aplikacje są celowo odizolowane od siebie ze względu na politykę bezpieczeństwa, jak Apple Inter-App Communication Guide mówi:

Aplikacje komunikować się tylko pośrednio z innych aplikacji na urządzeniu

Najlepiej postawić na system iOS, aby udostępnić dane, synchronizując je przez iCloud.Zobacz sekcję Configuring a Common Ubiquity Container for Multiple Apps w iCloud Design Guide, który mówi:

... może podać dwie aplikacje, które byłyby kompatybilne i potrzebne dostępu do plików nawzajem. W obu tych przykładach uzyskasz wymagany dostęp, określając wspólny kontener wszechobecności, a następnie , żądając dostępu do niego z każdej aplikacji.

+0

Witam, thx za odpowiedź! To rozwiązuje moje problemy z Androidem przynajmniej :) Zmieniłem moje pytanie, aby lepiej opisać mój problem. Czy możesz sprawdzić, czy to coś zmieni dla systemu iOS? Jeśli chodzi o iCloud, podany link mówi, że nie przechowuję tam "pamięci podręcznej, tymczasowych lub dużych pobranych plików danych", więc wolałbym go nie używać ... Poza tym tworzę aplikację hybrydową, więc jestem trochę ogranicza się do opcji dostępnych w wtyczkach Cordova .. Ale uważam, że jest to bardzo powszechny przypadek użycia, więc powinno być również łatwe rozwiązanie dla iOS .. – kolli

+2

Otwieranie pliku w domyślnej aplikacji jest zupełnie inne niż udostępnianie plików między konkretnymi aplikacjami i znacznie łatwiejsze. [cordova-plugin-file-opener2] (https://github.com/pwlin/cordova-plugin-file-opener2) zrobi dokładnie to, czego potrzebujesz dla iOS i Androida. Wystarczy postępować zgodnie z przykładami, gdzie zapisać pliki dla każdej platformy, a jeśli masz problem, opublikuj problem na stronie Github wtyczki. – DaveAlden

+0

Czułem również, że powinno to być łatwe zadanie. Mimo to nie mogłem znaleźć dobrego przykładu dla iOS. Teraz spróbowałem jeszcze raz używając 'cordova.file.applicationStorageDirectory' i wydaje się, że działa (chociaż dokumentacja mówi, że jest tylko do odczytu ...). Spróbuję ponownie później, używając 'cordova.file.cacheDirectory', ale myślę, że powinno być dobrze. dzięki! – kolli

Powiązane problemy