Есть ли какой-нибудь способ узнать, из какой папки накачан ресурс? - PullRequest
2 голосов
/ 16 июня 2010

Кто-нибудь знает, как определить, к какой папке будет обращаться система Android, когда я запрашиваю определенный ресурс в ресурсах (например, drawable-long против drawable-notlong)?Я хочу убедиться, что он загружает ресурсы так, как я ожидал (например, чтобы убедиться, что татуировка действительно ldpi, а не mdpi, поскольку она находится прямо на границе).

Я мог бывсегда распечатывай внутренний размер рисунка после того, как я получу его из Ресурсов, и проверяй его по разным размерам изображений, которые у меня есть, но это своего рода боль.Кроме того, моя компания позволяет своим клиентам создавать скины для своих приложений до того, как они будут выпущены, поэтому после того, как они будут обработаны, я не смогу полагаться на этот метод.

Я пытался использовать Resources.getName(resId), но это не даетимя папки, и, насколько я знаю, вы можете получить AssetFileDescriptor для ресурса, но вы не можете получить фактическое имя файла.

ОБНОВЛЕНИЕ: С тех пор как я задал этот вопрос, у меня естьобнаружил, что вы можете получить доступ ко многим из имен квалификаторов ресурсов через классы Configuration и DisplayMetrics (оба доступны через getResources()).DisplayMetrics может дать вам обозначение ldpi / mdpi / hdpi, а Configuration может дать вам small / normal / large размер экрана, соотношение сторон long / notlong, локаль, коды мобильной сети и другая аппаратная информация.Тем не менее, это все еще не является положительным подтверждением того, что вы получаете ожидаемые ресурсы, если у вас есть сложный набор ресурсов.Он также не защищает вас от ошибок, которые сообщают о неправильных значениях, таких как ошибка Motorola Droid, когда DisplayMetrics сообщает о неправильных xdpi и ydpi (он сообщает 96dpi, где реальное значение больше похоже на 265dpi! Ужасная ошибка.).

Ответы [ 2 ]

4 голосов
/ 19 января 2012

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

Если вы действительно хотите сойти с ума, создайте изображение с надписью «ldpi» или «xhdpi» и т. Д. Для каждой папки и когда вызапустив свой проект, вы можете заметить, какие из них подошли для каждого устройства, для которого вы хотели явное тестирование.


С Марк Эллисон , та же идея, но каталог значений со строками, который содержитназвание корзины, в которой он находится - это меньше усилий, чем создание изображений!

0 голосов
/ 19 июня 2011

Я знаю, вы пишете, что вы можете просмотреть все ресурсы и сравнить размеры с размером растрового изображения.Но я не знаю, если бы вы думали так же, как я, так что это может помочь вам или кому-то еще.

Так вот, я так и сделал.Сначала я загружаю размеры (в байтах) для всех нарисованных изображений.

String defType = "drawable";
String drawableDirPrefix = "res/drawable";
SparseArray<SparseArray<String>> resourceDirs = new SparseArray<SparseArray<String>>();

ZipInputStream apk = null;
try {
    apk = new ZipInputStream(new FileInputStream(getPackageResourcePath()));

    ZipEntry entry = null;
    while ((entry = apk.getNextEntry()) != null) {
        String resourcePath = entry.getName();
        if (resourcePath.startsWith(drawableDirPrefix)) {
            int firstSlashPos = resourcePath.indexOf('/');
            int lastSlashPos = resourcePath.lastIndexOf('/');
            int dotPos = resourcePath.lastIndexOf('.');

            String resourceDir = resourcePath.substring(firstSlashPos + 1, lastSlashPos);
            String resourceName = resourcePath.substring(lastSlashPos + 1, dotPos);
            int resourceId = getResources().getIdentifier(resourceName, defType, getPackageName());
            int resourceSize = (int) entry.getSize();

            SparseArray<String> resourceInfo = resourceDirs.get(resourceId);
            if (resourceInfo == null) {
                resourceInfo = new SparseArray<String>();
                resourceInfo.append(resourceSize, resourceDir);
                resourceDirs.append(resourceId, resourceInfo);
            } else {
                resourceInfo.append(resourceSize, resourceDir);
            }
        }
    }
} catch (IOException e) {
    Log.e("tag", "Error", e);
} finally {
    if (apk != null) {
        try {
            apk.close();
        } catch (IOException e) {
            Log.e("tag", "Error", e);
        }
    }
}

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

InputStream bitmapStream = null;
try {
    int bitmapId = R.drawable.icon;
    bitmapStream = getResources().openRawResource(bitmapId);
    int bitmapSize = bitmapStream.available();

    String bitmapDir = resourceDirs.get(bitmapId).get(bitmapSize);
    Log.i("tag", bitmapDir);
} catch (Exception e) {
    Log.e("tag", "Error", e);
} finally {
    if (bitmapStream != null) {
        try {
            bitmapStream.close();
        } catch (IOException e) {
            Log.e("tag", "Error", e);
        }
    }
}

Хорошо, это будет работать, только если изображения имеют разные размеры.Или вы можете сравнить другие вещи, такие как ширина, высота и т. Д.

Может быть, это не то, что вы ищете, но, по крайней мере, это удовлетворило мои потребности.

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