Доступ к активам из другого приложения? - PullRequest
6 голосов
/ 16 марта 2010

Я получаю много запросов в своем приложении, чтобы разрешить пакеты пользовательских значков от BetterCut / Open Home. Кажется, это работает, если вы устанавливаете BetterCut или Open Home, а затем можете установить множество бесплатных пакетов значков с рынка. После установки оба эти приложения (и другие приложения) будут опрашивать эти пакеты значков и использовать значки.

Я хочу знать, как опрашивать установочные приложения для доступных папок ресурсов. Я открыл несколько пакетов значков и убедился, что там есть папка ресурсов, и они заполнены всеми файлами значков png.

Я искал здесь, на других сайтах с кодом, Google и т. Д., Но не нашел ни одного клиента.

UPDATE:

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

Resources r = this.getResources();
AssetManager a = r.getAssets();
String[] list = a.list("/");
Log.d("test", "Length of / is "+list.length);
for (String s : list) {
    Log.d("test", s);
}

Log.d("test", "Length of /assets is "+a.list("/assets").length);
Log.d("test", "Length of /assets/ is "+a.list("/assets/").length);
Log.d("test", "Length of /assets/ is "+a.list("/assets/").length);
Log.d("test", "Length of ./assets/ is "+a.list("./assets/").length);
Log.d("test", "Length of ./assets is "+a.list("./assets").length);

Это вывод:

03-16 12:25:04.591: DEBUG/test(13526): Length of / is 6
03-16 12:25:04.591: DEBUG/test(13526): AndroidManifest.xml
03-16 12:25:04.591: DEBUG/test(13526): META-INF
03-16 12:25:04.591: DEBUG/test(13526): assets
03-16 12:25:04.591: DEBUG/test(13526): classes.dex
03-16 12:25:04.591: DEBUG/test(13526): res
03-16 12:25:04.591: DEBUG/test(13526): resources.arsc
03-16 12:25:04.614: DEBUG/test(13526): Length of /assets is 0
03-16 12:25:04.637: DEBUG/test(13526): Length of /assets/ is 0
03-16 12:25:04.661: DEBUG/test(13526): Length of /assets/ is 0
03-16 12:25:04.692: DEBUG/test(13526): Length of ./assets/ is 0
03-16 12:25:04.716: DEBUG/test(13526): Length of ./assets is 0

ОБНОВЛЕНИЕ 2 99% Там !!!:

Я понял, что вы можете читать из каталога ресурсов, фактически не используя имя папки:

InputStream is = assetManager.open("test.png");

Я также попробовал это с активом в Приложении 2 из Приложения 1, где путь к папке /asset/icon/image.png:

InputStream is = assetManager.open("icon/image.png");

Далее я понял, что вы можете перечислить каталог внутри ресурсов:

String[] list = assetManager.list("icons");

Это тоже прекрасно работает. Единственное, что сейчас не работает, это как составить список основных ресурсов каталога.

Ответы [ 3 ]

4 голосов
/ 16 марта 2010

Чтобы получить базовую папку /assets, вам нужно использовать AssetsManager, чтобы получить список каталогов с кавычками:

AssetManager am = this.getAssets();
String[] names = am.list("");

В списке будет несколько дополнительных файлов: изображения, звуки, веб-набор, возможно, другие. Вы можете игнорировать эти каталоги, они являются частью каталога ресурсов frameworks. Это цитата из groups.google.com :

В настоящее время менеджер активов объединяет каталог активов из каркаса ресурсы вместе с вашими собственными файлами помещены в «активы». Мы должны вероятно, изменить это поведение (это было часть старого ресурса / локализация модель), но это не наносит большого ущерба кроме того, что вы видите больше файлы / каталоги в ваших собственных активах чем вы могли ожидать. Любой из ваших файлы, которые совпадают с одним в вместо этого будут использоваться базовые активы, при доступе через ваш AssetManager.

Вы также можете перечислить подпапку внутри каталога активов и не использовать косую черту:

String[] names= am.list("subfolder");

Обратите внимание, что я не включил "/assets" в имя файла. Наконец, когда у вас есть список файлов, вы можете загрузить их в виде:

InputStream in = am.open("file.png");

Это загрузит файл в папке базовых активов. Или вы можете загрузить файл в подпапку следующим образом:

InputStream in = am.open("subfolder/file.png");

Если вам нужно загрузить эти png-файлы в растровое изображение, вы также можете сделать следующее:

Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
3 голосов
/ 16 марта 2010

Объект Resources предоставляет вам доступ к активам. PackageManager может предоставить вам доступ к Resources для приложения.

2 голосов
/ 16 марта 2010

Вероятно, вы должны получить общее представление о том, как работают ресурсы и ресурсы, прежде чем копаться в вещах. :)

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

Во-вторых, в .apk есть два основных типа пользовательских файлов: необработанные ресурсы и структурированные ресурсы.

Первый - это произвольная иерархия файлов, которые можно получить с помощью http://developer.android.com/reference/android/content/res/AssetManager.html#open(java.lang.String)

Последние обрабатываются встроенными инструментами в структурированную таблицу, что позволяет варьировать их в зависимости от конфигурации. Доступ к ним осуществляется с помощью ресурсов и связанных классов. Drawables, строки, цвета и большинство других типов данных, которые вы извлекаете из .apk, обычно хранятся как ресурс, а не как актив.

Вы можете использовать инструмент aapt, чтобы просмотреть все ресурсы в .apk: aapt dump resources

Наконец, если вы хотите прочитать данные из этих .apks, как насчет их информации о том, как их построить? Это должно дать вам много базовой информации о том, как они структурированы.

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