Zugriff auf Dateien im assets Verzeichnid und bei Dokuments

  • 8 Antworten
  • Letztes Antwortdatum
D

digifant

Neues Mitglied
0
Ich habe zwei Probleme, die zusammenhängen. Im regulären android_asset/ liegen Grafiken. Diese sollen in einem WebView angezeigt werden.
Das klappt auch!

Code:
pfad = "file:///android_asset/grafik.svg"
web_view.loadDataWithBaseURL(null, "<style>body {margin:0px;} img {display:inline;height:100%;}</style><img src=\"" + pfad +"\">" , "text/html", "UTF-8", null);

Ich will aber vorab prüfen, ob diese Datei auch wirklich existiert. Ich probierte jetzt schon mehrere Varianten von diesem Code aus:

Code:
File file = new File (getApplicationContext().getFilesDir() + "/android_asset/grafik.svg");
if (file.isFile()) {
 Log.i("MyApp", "OK");
}

Das liefert immer, die Datei existiert nicht (kein "OK")

Wo ist mein Fehler? Danke


Ein ähnliches Problem ist, daß ich gerne auf eine Datei vom Benutzer im Ordner Documents o.ä. zugreifen würde, um diese über den WebView als Bild anzuzeigen. Hierbei klappt zwar die Abfrage, ob die Datei existiert, aber ich kann sie dann nicht im obigen WebView nutzen.
 
a)
(getApplicationContext().getFilesDir() + "/android_asset/grafik.svg"
Du suchst auch in /[device]/[emulator]/../[package]/data/files/android_assets/ - Dort befinden sich keine Assets
Siehe dazu AssetManager | Android Developers


b)
Ein ähnliches Problem ist, daß ich gerne auf eine Datei vom Benutzer im Ordner Documents o.ä. zugreifen würde, um diese über den WebView als Bild anzuzeigen. Hierbei klappt zwar die Abfrage, ob die Datei existiert, aber ich kann sie dann nicht im obigen WebView nutzen.
Das ist auch richtig so, denn die (externe) Datei befindet sich ja nicht im gleichen Context wie der WebContent.

Für Daten außerhalb des lokalen WebContextes benötigst du grundsätzlich eine Bridge :

1) Entweder einen lokalen Proxy nehmen (was ich hier für das Ziel empfehle)
2) Oder eine Injektion eines passenden webkit.JavaScriptInterface (eher hier nicht zu empfehlen, da sehr starr)

Aufbereitung:
Für beide Varianten musst du dir vorher eine lokale Kopie der Daten in den Shares bilden oder sie im Memory in einem byteArray binarisiert mitführen, damit du sie beim Request content-type abhängig gültig zurück liefern kannst.

Hinweis :
Für solch eine Operation ist auch der lokale WebView überhaupt nicht angedacht, deshalb der aufgezeigte Weg.
Daher benötigst Du auch beim lokalen Proxy zusätzlich eine Genehmigung von Google, wenn du die App dort veröffentlichen möchtest.



Viel Erfolg !
 
Zuletzt bearbeitet:
Ich glaube mein Problem ist falsch rübergekommen.

Mit dem WebView ist alles in Ordnung. Klappt wunderbar, die Grafiken aus dem Asset-Ordner zu zeigen.
Ich will aber vor dem Anzeigen sicherstellen, daß die Datei auch vorhanden ist (vergessen beim Compilieren dahin zu kopieren oder falsch gezählt usw.) und wenn nicht, soll eine Fehlermeldung erscheinen (404 sozusagen). Früher vor irgendeinem SDK oder Android Update ging das auch so einfach, wie oben gezeigt. Jetzt aber eben nicht mehr.
 
Zuletzt bearbeitet:
Du musst den Root zu den Assets mit dem AssetManager ermitteln - nicht mit getFilesDir()
Deshalb auch extra farbig von mir dargestellt.

Den Link zur API Dokumentation habe ich dir bereits zweimal in Post#2 und Post#4 dazu gegeben.

Hier zusätzlich der Link zu den übergeordneten Context Funktionen
Context | Android Developers

P.S. Ein weiteres "Danke" kommt Dir nicht über die Lippen ,wenn man sich schon die Mühe gibt ?
(Wir haben auch einen Knopf dazu, wenn man nicht schreiben mag)
 
Zuletzt bearbeitet:
Bisher hast Du nurgesagt, was ich nicht machen soll und auf ein endloses Dok verwiesen.
Ein Danke gibt's dafür nicht
 
Bisher hast Du nurgesagt, was ich nicht machen soll
Eindeutig wieder falsch :

Die Lösung, wie du an deine Assets kommst (dein Wunsch) , steht bereits in zweiten Satz von Post#2 und im ersten Satz von Post#6
Wie oft also noch ?

und auf ein endloses Dok verwiesen
Das notwendige tägliche Arbeitswerkzeug jeden Android Entwicklers - Ohne das geht gar nichts.
Wer es nicht versteht, kann somit auch keinen code umsetzen.


Ein Danke gibt's dafür nicht
Dann auch nicht mehr die geringste Unterstützung meinerseits :)
 
Zuletzt bearbeitet:
Hallo einen kleinen Tipp würde ich hier geben.
digifant schrieb:
Und wie bekomme ich dann den richtigen Ordner?

Denn wirst du auch nicht bekommen. Dir wurde schon gesagt das du über den AssetManager gehen musst.
Da solltest du dir mal die Methode „list“ genauer anschauen was die zurück gibt.
Du willst prüfen was in den Assets enthalten ist wie du eine Liste des Inhaltes bekommst weißt du jetzt.


Wünsche viel Erfolg.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: swa00

Ähnliche Themen

M
  • MikelKatzengreis
Antworten
5
Aufrufe
585
swa00
swa00
S
Antworten
7
Aufrufe
358
Silvasurf
S
B
Antworten
4
Aufrufe
935
bb321
B
Zurück
Oben Unten