2015-10-12 3 views
11

Мне нужно загрузить файлы на мобильное устройство и сделать их доступными для других приложений (с помощью Android и iOS).Сохранить файл в общедоступном каталоге с помощью Cordova FileTransfer

Мне удалось загрузить файл на SD-карту (cordova.file.externalDataDirectory), но это только на Android, и даже тогда я не могу полагаться на каждое устройство, имеющее SD-карту.

Когда я загружаюсь в хранилище устройства (cordova.file.dataDirectory), файл является приватным для моего приложения и поэтому недоступен для других приложений. Файл можно открыть в InAppBrowser, но я предпочел бы использовать соответствующее приложение по умолчанию.

Есть ли способ получить доступ к общедоступной директории на всех устройствах?

Пути возвращаемые решения, предложенные в https://stackoverflow.com/a/21375812/3432305 являются как частные на Android ...

EDIT:

Я думаю, что я должен описать мой случай использования, так это яснее, что я хочу для достижения: я хочу открыть файлы с моего в чате приложения, используя соответствующее приложение по умолчанию (просмотрщик pdf, просмотрщик изображений и т. д.). Поскольку Cordova File Opener plugin принимает файлы только из локальной файловой системы, сначала нужно сохранить их. Но после этого они не обязательно должны быть доступны из-за пределов моего приложения ...

ответ

14

На Android всегда существуют внешние каталоги хранения; если устройство не имеет физической SD-карты, Android будет эмулировать его. см. getExternalStorageDirectory:

Примечание: не следует путать слово «внешний» здесь. Этот каталог лучше рассматривать как носитель/общий накопитель. Это файловая система, в которой может хранить относительно большой объем данных и распределяется между всеми приложениями (не применяет разрешения). Традиционно это SD-карта, но она также может быть реализована как встроенное хранилище в устройстве , которое отличается от защищенного внутреннего хранилища и может быть , установленным как файловая система на компьютере.

Поэтому cordova.file.externalDataDirectory всегда будет решать. Однако для обмена данными между приложениями вы, вероятно, хотите использовать cordova.file.externalRootDirectory - корень внешней памяти (SD-карты). См. cordova-plugin-file.

Таким образом, вы можете хранить файлы в месте, куда проще получить доступ из другого приложения, например. /sdcard/my_shared_data/

КСН, это более трудно обмениваться файлами, поскольку приложения намеренно изолированы друг от друга из-за политики безопасности, так как Apple, Inter-App Communication Guide говорит:

приложения общаются только косвенно с другими приложениями на устройстве

Лучше всего на iOS - делиться данными, синхронизируя их через iCloud.Смотрите раздел Configuring a Common Ubiquity Container for Multiple Apps в руководстве ICloud Design, в котором говорится:

... возможно, вы предоставляете два приложения, взаимодействующие и нужно доступ к файлам друг друга. В обоих этих примерах вы получаете необходимый доступ, указав общий контейнер для вездесущности, а затем , запрашивающий доступ к нему из каждого приложения.

+0

Hi, thx для вашего ответа! Это решает мои проблемы для Android по крайней мере :) Я отредактировал свой вопрос, чтобы еще больше описать свою проблему. Не могли бы вы проверить, что это ничего не изменило для iOS? Что касается iCloud, ссылка, которую вы указали, говорит, что она не хранит «Кэш, временные или большие загруженные файлы данных», поэтому я бы предпочел не использовать ее ... Кроме того, я разрабатываю гибридное приложение, поэтому я немного ограниченные вариантами плагинов Cordova. Но я считаю, что это очень распространенный вариант использования, поэтому должно быть простое решение для iOS тоже. – kolli

+2

Открытие файла в приложении по умолчанию полностью отличается от совместного использования файлов между конкретными приложениями , и намного проще. [cordova-plugin-file-opener2] (https://github.com/pwlin/cordova-plugin-file-opener2) будет делать именно то, что вам нужно для iOS и Android. Просто следуйте приведенным ниже примерам о том, где сохранить файлы для каждой платформы, и если у вас возникла проблема, разместите сообщение на странице плагина Github. – DaveAlden

+0

Я также почувствовал, что это должна быть легкая задача. Тем не менее, я не мог найти хороший пример для iOS. Теперь я попробовал использовать «cordova.file.applicationStorageDirectory» и, похоже, работает (хотя в документации говорится, что это только для чтения ...). Повторите попытку позже, используя 'cordova.file.cacheDirectory', но я думаю, это должно быть хорошо. спасибо! – kolli