Por que é WebView incapaz de abrir alguns URLs locais (Android)?
Pergunta
Eu tenho um WebView
que eu estou usando para abrir alguns arquivos armazenados no diretório assets/
do meu projeto. Ele funciona muito bem para a maioria dos arquivos, mas há um em particular (e eu tenho certeza que outros Eu não encontrados) que apenas não aberto.
O arquivo que eu estou tendo problemas com é chamado:
"assets/ContentRoot/Photos/XXX Software Logo - jpg - 75%.JPG"
Quando eu passá-lo para WebView
, e mostra a página de erro, ele mostra-o como:
"file:///android_asset/ContentRoot/Photos/XXX%20Software%20Logo%20-%20jpg%20-%2075%.JPG"
Então eu tentei correr URLEncoder.encode()
nele e tem a página de erro com o URL apresentado como:
"file:///android_asset/ContentRoot/Photos/XXX+Software+Logo+-+jpg+-+75%.JPG"
Nenhum destes URLs foram capazes de abrir o arquivo (e ambos olhar bem para mim). Alguém tem alguma idéia?
UPDATE: Se eu codificar o %
à mão (usando %25
, como commonsware.com sugerido), em seguida, ele carrega a imagem, mas ele tenta analisá-lo como texto, não como uma imagem, de forma Eu só recebo um monte de (basicamente) lixo.
Além disso, referindo-se a imagem em um documento HTML com um URL relativo não está funcionando (provavelmente porque ele não está sendo analisado como uma imagem?):
<img src="../Photos/XXX%20Software%20Logo%20-%20jpg%20-%2075%.JPG" />
<img src="../Photos/XXX%20Software%20Logo%20-%20jpg%20-%2075%25.JPG" />
Solução
Ok, depois de passar muito tempo sobre isso, eu descobri o que está acontecendo. Basicamente, se as imagens armazenadas no diretório assets/
conter um espaço (por exemplo, " ") em seu nome de arquivo, eles não vão processar como imagens.
myWebView.loadUrl("file:///android_asset/testimage.jpg");
funciona bem. No entanto,
myWebView.loadUrl("file:///android_asset/test+image.jpg");
apenas lança um erro não encontrado e
myWebView.loadUrl("file:///android_asset/test image.jpg");
// and
myWebView.loadUrl("file:///android_asset/test%20image.jpg");
mostrá-lo indevidamente exibida (como texto ... veja a imagem em questão).
Esse comportamento inesperado está presente em (pelo menos) 1.5, 1.6, e 2.0 e eu arquivado um relatório de bug .
Outras dicas
Tente se livrar do %
no nome do arquivo. Ou, escapar-lo como %25
.
Eu diria que WebView só entende de texto relacionado tipos de conteúdo para que ele fielmente tratar o seu JPG como codificação Base64, decodifica e exibe resultou Devorar-goop como texto. Eu realmente não sei se é possível definir o tipo de conteúdo para WebView mas como solução alternativa, você pode tentar jogar tag img dentro tag html e de carregamento da página resultet. Além disso, você provavelmente só pode usar WebView # loadDataWithBaseUrl