2010-03-16 2 views
6

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

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

Я искал здесь, другие кодовые сайты, google и т. Д., Но havn't нашел какие-либо выводы.

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 

UPDATE 2 99% Там !!!:

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

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

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

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

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

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

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

ответ

4

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

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

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

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

Вы также можете перечислить подпапку внутри директории активов и не нуждаются в какой-либо косой черте:

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

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

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

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

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

Если вам нужно загрузить этот PNGs в Bitmap вы также можете сделать следующее:

Bitmap bitmap = BitmapFactory.decodeStream(inputStream); 
+1

Это похоже на трюк, спасибо! Также смешно, что цитата о слиянии ресурсов инфраструктуры с папкой с ресурсами принадлежит сотруднику Google Hackbod, который является тем же человеком, который не предоставил ответ здесь. – pcm2a

3

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

+0

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

+1

См. Http://stackoverflow.com/questions/1495585/how-can-i-get-a-directory-listing-of-resources-from-my-android-app – CommonsWare

+0

Я попытался использовать точный метод «displayFiles» для людей и поместите в печать, чтобы увидеть длину списка, которая по-прежнему равна нулю для всех тестов, кроме корневой папки «/». Я никогда не получаю список файлов в «/ assets», чтобы иметь возможность их перечислять. Я также попытался перейти к файлу в папке с моими ресурсами: InputStream is = a.open ("/ assets/test.png"); Это исключает исключение из файла. – pcm2a

2

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

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

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

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

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

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

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

+0

Мне не нужен доступ к файлу на моем компьютере. Мне нужно получить доступ к каталогу активов в приложении 2 из приложения 1 на самом телефоне. Я получаю лодку запросов, чтобы добавить поддержку пакетов значков BetterCut, которые бесплатны на рынке. Поэтому из моего приложения я хочу, чтобы пользователь мог выбирать значки оттуда (они хранятся в папке с ресурсами, я смотрел). Большинство вещей, которые вы упомянули, действительно не имеют отношения к исходной проблеме. Мне не нужно руководство для создания apks, извлечение изображений или использование Drawables или других ресурсов внутри моего собственного приложения из папки res. – pcm2a

Смежные вопросы