хранить дерево файлов в .apk - PullRequest
0 голосов
/ 08 апреля 2011

Как я могу хранить обычное дерево файлов в Android .apk без всяких странностей концепций Ressource или Asset?Кажется, мне нужно сделать что-то нехорошее, чтобы использовать файлы из текущего пути, как это делает любое не-Android-приложение Java?

Ответы [ 4 ]

2 голосов
/ 08 апреля 2011

«использовать файлы с текущего пути» и «хранить ... в файле Android .apk» не имеют ничего общего друг с другом.

Поскольку, по статистике, вы, вероятно, знакомы с Windows, давайтеНарисуйте некоторые аналогии.

«хранить ... внутри файла Android .apk» в Windows будет «хранить ... внутри файла Windows .exe».Это довольно редко встречается в Windows, по крайней мере, последнее, что я проверил.

«Использовать файлы с текущего пути» в Windows будет означать файлы, которые, возможно, существуют в каталоге Program Files приложения или аналогичном.В Android это работает довольно условно - используйте getFilesDir() и файловый ввод / вывод Java.

То, что существует в Windows и не существует в Android, - это концепция упаковки файлов, которые должны быть установлены во время установки черезустановочный пакет, такой как .msi файл.

Поскольку вы отказались сообщить нам, что такое «нормальное дерево файлов» и почему вы думаете, что оно должно быть «внутри Android .apk», это невозможночтобы дать вам совет о том, как избежать «странностей», которые, по вашему мнению, существуют в «концепциях Ressource [sic] или активов».Все, что я могу вам сказать, это то, что эквивалент в других ОС для выпекания файлов в исполняемый файл, скорее всего, будет «странным».

0 голосов
/ 08 апреля 2011

Хорошо, я не проверял это, но решением может быть добавление дополнительных файлов в APK перед подписанием. Вы можете автоматизировать это из командной строки:

$ ant release
$ zip -r bin/MyApp-unsigned.apk <custom_folder>
$ jarsigner -verbose -keystore <keystore> -storepass <password> bin/MyApp-unsigned.apk <alias>
$ zipalign -v 4 bin/MyApp-unsigned.apk bin/MyApp-signed.apk

А затем в своей деятельности откройте APK с ZipFile, чтобы получить доступ к своей пользовательской папке:

ZipFile apk = new ZipFile(getApplicationInfo().sourceDir);

Я не уверен, как Android Market отреагирует на этот нестандартный APK.

0 голосов
/ 08 апреля 2011

Один из подходов, который может сработать для вас, - это открыть APK с помощью ZipFile и ZipEntry , поскольку это дает вам доступ, очень похожий на обычную структуру каталогов, доступную только для чтения.

В качестве альтернативы, вы можете использовать getResourceAsStream для работы с традиционной файловой структурой - вы можете найти этот отчет об ошибке полезным, если вы используете этот подход - он показывает некоторыеОпасность работы с getResourceAsStream на Android.

Я должен добавить, что вы не должны думать об APK, как о чем-то извлеченном - файлы внутри APK не находятся в файловой системе, оникак ресурсы внутри файла JAR в среде J2ME или J2SE (или WAR / EAR для J2EE).

Надеюсь, это поможет,

Фил Лелло

0 голосов
/ 08 апреля 2011

С активами у вас может быть дерево файлов в APK, к которому можно обратиться с помощью AssetManager , возвращаемого getAssets () .

Весь смысл этого механизма - экономия места. Файлы не извлекаются в файловую систему при установке приложения. Когда вы читаете содержимое ресурса, он распаковывается (разархивируется) на лету из APK. Это имеет смысл. Экономия места важна на устройствах Android.

Но ничто не запрещает вам извлекать дерево ресурсов в файловую систему при первом запуске приложения, если вам это нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...