2009-11-10 13 views
4

J'ai un WebView que j'utilise pour ouvrir certains fichiers stockés dans le répertoire assets/ de mon projet. Cela fonctionne très bien pour la plupart des fichiers, mais il y en a un en particulier (et je suis sûr que d'autres que je n'ai pas trouvé) que c'est juste que ouvrira non.Pourquoi WebView ne peut-il pas ouvrir certaines URL locales (Android)?

Le fichier que je vais avoir des problèmes avec est nommé:

"assets/ContentRoot/Photos/XXX Software Logo - jpg - 75%.JPG" 

Quand je passe à WebView, et il montre la page d'erreur, il montre comme:

"file:///android_asset/ContentRoot/Photos/XXX%20Software%20Logo%20-%20jpg%20-%2075%.JPG" 

Je puis essayé de courir sur URLEncoder.encode() et a la page d'erreur avec l'URL présentée comme:

"file:///android_asset/ContentRoot/Photos/XXX+Software+Logo+-+jpg+-+75%.JPG" 

Aucune de ces URL n'a été capable d'ouvrir le fichier (et elles me paraissent toutes les deux correctes). Quelqu'un a des idées?

MISE À JOUR: Si j'encode la % à la main (en utilisant %25, comme suggéré commonsware.com), il charge l'image, mais il tente de l'analyser sous forme de texte, et non comme une image, si je reçois juste un beaucoup de (fondamentalement) ordures.

Hosted by imgur.com

En outre, se référant à l'image dans un document HTML avec une URL relative ne fonctionne pas (sans doute parce qu'il est pas analysé comme une image?):

<img src="../Photos/XXX%20Software%20Logo%20-%20jpg%20-%2075%.JPG" /> 
<img src="../Photos/XXX%20Software%20Logo%20-%20jpg%20-%2075%25.JPG" /> 

Répondre

9

D'accord, après avoir passé trop de temps sur cela, j'ai compris ce qui se passe. Fondamentalement, si les images stockées dans le répertoire assets/ contiennent un espace (par exemple, "") dans leur nom de fichier, elles ne seront pas rendues en tant qu'images.

myWebView.loadUrl("file:///android_asset/testimage.jpg"); 

fonctionne très bien. Cependant,

myWebView.loadUrl("file:///android_asset/test+image.jpg"); 

lancers francs juste une erreur non trouvée et

myWebView.loadUrl("file:///android_asset/test image.jpg"); 
// and 
myWebView.loadUrl("file:///android_asset/test%20image.jpg"); 

montrent incorrectement affiché (sous forme de texte ... voir capture d'écran en question).

Ce comportement inattendu est présent sur (au moins) 1,5, 1,6 et 2,0 et I filed a bug report.

+0

Merci d'avoir effacé cette – Bostone

3

Essayez de se débarrasser du % dans le nom de fichier. Ou, échapper comme %25.

+0

Bien sûr, mais ne devrait pas 'URLEncoder.encode()' ont géré cela? N'est-ce pas que c'est toute la raison d'exister? Quoi qu'il en soit, je l'ai essayé et il essaye de l'ouvrir maintenant, mais il est juste en train de le jeter en tant que texte au lieu de rendre l'image. –

+0

Votre tag dans votre mise à jour n'a pas d'URL relative correctement codée, car vous n'avez pas échappé à votre signe% comme% 25. Quant à savoir pourquoi URLEncoder.encode() ne le fait pas, je n'en ai aucune idée, mais AFAIK vous ne pouvez pas avoir un% nu dans une URL. En outre, puisque c'est un atout, cuit dans votre APK, pourquoi vous embêter avec des noms de fichiers gênants en premier lieu? Renommez simplement le fichier en quelque chose de simple. Si * cela * échoue, confirmez que vous avez une image JPEG valide. – CommonsWare

+0

Fondamentalement, je construis un port d'une application iPhone qui permettra à mon client de vider les fichiers dans le répertoire des biens, modifier quelques paramètres, puis recompiler pour créer une "toute nouvelle application". Je ne peux pas prédire quels caractères les noms de fichiers contiendront et c'est spécifiquement de l'ensemble de test qu'il m'a fourni. Croyez-moi, si je pouvais simplement renommer les fichiers que je voudrais. –

0

Je suppose que WebView ne comprend que les types de contenu liés au texte, donc il traite fidèlement votre JPG en tant que codage en base64, décode et affiche gobble-goop en texte. Je ne sais pas vraiment s'il est possible de définir le type de contenu pour WebView, mais en guise de solution de contournement, vous pouvez essayer de lancer la balise img dans la balise html et de charger la page resultet. Aussi, vous ne pouvez probablement utiliser WebView # loadDataWithBaseUrl

+0

Il s'avère que cela fonctionne très bien avec les images ... un peu. Voyez ma réponse si vous vous en souciez. –

Questions connexes