2 Stimmen

Gibt es eine Möglichkeit zu erkennen, aus welchem Ordner eine zeichenbare Ressource aufgeblasen wurde?

Kennt jemand einen Weg, um festzustellen, welchen Ordner das Android-System auflöst, wenn ich ein bestimmtes Drawable aus den Ressourcen anfordere ( drawable-long vs. drawable-notlong zum Beispiel)? Ich möchte sicherstellen, dass die Ressourcen so geladen werden, wie ich es erwarte (z. B. um sicherzustellen, dass das Tattoo wirklich ldpi und nicht mdpi da es genau an der Grenze liegt).

Ich könnte immer ausdrucken die intrinsische Größe des drawable, nachdem ich es aus Ressourcen holen, und überprüfen Sie, dass gegen die verschiedenen Bildgrößen, die ich habe, aber das ist Art von Schmerz. Plus, mein Unternehmen erlaubt seinen Kunden, ihre app zu skinnen, bevor es freigegeben wird, so dass, nachdem es skinned ich nicht in der Lage, auf diese Methode zu verlassen.

Ich habe es mit Resources.getName(resId) aber das gibt den Ordnernamen nicht an, und soweit ich weiß, kann man eine AssetFileDescriptor für die Ressource, aber Sie können keinen tatsächlichen Dateinamen erhalten.

UPDATE: Seitdem ich diese Frage gestellt habe, habe ich entdeckt, dass man auf viele der Namen der Ressourcenbezeichner durch die ConfigurationDisplayMetrics Klassen (beide zugänglich über getResources() ). DisplayMetrics kann Ihnen die ldpi / mdpi / hdpi Bezeichnung, und Configuration können Sie small / normal / large Bildschirmgröße, long / notlong Seitenverhältnis, Gebietsschema, Mobilfunknetzcodes und andere Hardware-Informationen. Dies ist jedoch immer noch keine positive Bestätigung dafür, dass Sie die Ressourcen erhalten, die Sie erwarten, wenn Sie einen komplizierten Ressourcensatz haben. Es schützt Sie auch nicht vor Fehlern, die falsche Werte melden, wie der Motorola Droid-Fehler, bei dem die DisplayMetrics meldet die falschen xdpiydpi (er meldet 96dpi, obwohl der tatsächliche Wert eher 265dpi beträgt! Schrecklicher Fehler).

4voto

ataulm Punkte 14775

Ein anderer Ansatz wäre, zwei verschiedene Bilder mit demselben Namen zu verwenden, rot in einem Ressourcenordner, blau im anderen. Wenn es sich aufbläht, können Sie sehen, von welchem Bild es stammt.

Wenn Sie wirklich verrückt werden wollen, erstellen Sie ein Bild mit der Aufschrift "ldpi" oder "xhdpi" usw. für jeden Ordner, und wenn Sie Ihr Projekt starten, können Sie notieren, welche Bilder für jedes Gerät, für das Sie explizit testen wollten, angezeigt wurden.


Von Mark Allison Die gleiche Idee, aber das Werteverzeichnis mit Zeichenketten, die den Namen des Eimers enthalten, in dem es sich befindet - das ist weniger Aufwand als das Erstellen von Bildern!

0voto

branoholy Punkte 963

Ich weiß, Sie schreiben, dass Sie alle Ressourcen durchgehen und die Größen mit der Bitmap-Größe vergleichen können. Aber ich weiß nicht, ob du genauso gedacht hast wie ich, also könnte das dir oder jemand anderem helfen.

Also habe ich es so gemacht. Zuerst lade ich die Größen (in Bytes) für alle zeichenbaren Bilder.

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);
        }
    }
}

Wenn ich dann den Ordner wissen will, kann ich die Bitmap-Größe mit den geladenen Größen vergleichen.

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);
        }
    }
}

Das funktioniert aber nur, wenn die Bilder unterschiedlich groß sind. Sie können auch andere Dinge vergleichen, wie Breite, Höhe usw.

Vielleicht ist es nicht das, wonach Sie suchen, aber zumindest hat es meine Bedürfnisse befriedigt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X