2010-10-04 38 views
10

我試圖從WebView中的HTML頁面內從應用程序的assets文件夾加載/引用圖像。與大多數示例不同,HTML頁面本身不在資產文件夾中,而是通過http從服務器加載。這個問題的背景是一些性能改進,它應該通過直接從設備加載靜態圖像來減少加載時間(以及傳輸的數據量)。我不確定Android是否有一些限制,因爲有可能通過允許從遠程加載的網頁訪問本地文件存儲來利用該應用程序。Android:如何在webview中從遠程加載的html頁面引用資產圖像

我第一次嘗試使用<img src="file:///android_asset/myimage.png">加載圖像,但是失敗(出於顯而易見的原因)。我的下一個嘗試是使用ContentProvider類和參考圖像使用<img src="content://com.myapp.assetcontentprovider/myimage.png">

public class AssetContentProvider extends ContentProvider 
{ 
private static final String URI_PREFIX = "content://com.myapp.assetcontentprovider"; 

public static String constructUri(String url) { 
    Uri uri = Uri.parse(url); 
    return uri.isAbsolute() ? url : URI_PREFIX + url; 
} 

@Override 
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { 
    Log.d("AssetContentProvider", uri.getPath()); 
    try { 
     return getContext().getAssets().openFd(uri.getPath().substring(1)).getParcelFileDescriptor(); 
    } catch (IOException e) { 
     Log.d("AssetContentProvider", "IOException for " + uri.getPath()); 
     throw new FileNotFoundException(); 
    } 
} 

// more methods irrelevant for this post 
} 

當加載HTML網頁,我可以在調試日誌openFile()實際上是從的WebView觸發看到,它返回一個有效ParcelFileDescriptor對象,但還沒有顯示的圖像:這ContentProvider的執行如下。日誌中沒有顯示錯誤消息,告訴我WebView拒絕加載/顯示圖像。任何想法,如果和如何這可以工作?

+0

你是否找到了你最初的問題的答案(爲什麼'file://'scheme ro'content://'一個工作不正確)? – Olegas 2011-02-20 16:27:36

回答

3

這是我對Java的部分怎麼辦:

字符串MYHTML = 「< IMG SRC = \」 文件:///android_asset/myimage.jpg \ 「」; (「file:/// android_asset /」,myHTML,「text/html」,「UTF-8」,「」);

歡呼

+0

感謝您的回答,但這不是我尋找的解決方案。在我的應用程序中,HTML頁面是通過使用myWebView.loadUrl()從HTTP通過HTTP加載的,或者您是否打算使用類似org.apache.http的方式加載HTML代碼,然後手動將其與loadDataWithBaseURL()一起放入webview中? – brotherli 2010-10-21 12:07:12

+0

你可以做到這一點。但取決於您下載的HTML是否使用相對或絕對鏈接。啊,確保你的資產以正確的形式命名。 (沒有空格和奇怪的字符...) – 2011-02-01 01:31:26

6

OK,感謝mufumbo的答案,我現在找到了工作黑客在遠程加載HTML頁面混合本地資產。使用WebView的loadUrl()方法加載的頁面不會加載與file:/// android_asset/...鏈接的圖像作爲解決方法,您可以使用org.apache.http.client.methods.HttpGet.HttpGet()來獲取HTML頁面,然後將其傳遞到WebView loadDataWithBaseURL()。在這種情況下,WebView將通過HTTP加載與file:/// android_asset /以及圖像和腳本鏈接的資源。這裏是我的自定義網頁流量代碼:

public class CustomWebView extends WebView { 
    private String mURL; 

    public void loadUrlWithAssets(final String url) { 
     // copy url to member to allow inner classes accessing it 
     mURL = url; 

     new Thread(new Runnable() { 
      public void run() { 
       String html; 
       try { 
        html = NetUtil.httpGETResponse(mURL); 

        // replace some file paths in html with file:///android_asset/... 

        loadDataWithBaseURL(mURL, html, "text/html", "UTF-8", ""); 
       } 
       catch (IOException e) { 
        Log.e("CustomWebView.loadUrlWithAssets", "IOException", e); 
       } 
      } 
     }).start(); 
    } 
} 

請注意,整個HTTP取包裹在本土的實用工具類NetUtil

有了這個類,就可以從Web服務器呈現HTML頁面,並從應用的資源文件夾中加載一些靜態資源(如圖像或樣式表),以提高加載速度並節省帶寬。

+0

你是如何設法讓這個工作在webview中點擊的鏈接的?我的工作只能在第一頁加載。 – BradLaney 2012-06-15 23:47:46

+0

@BradLaney @brotherli我在哪裏得到'NetUtil'類 – GameDevGuru 2013-06-05 23:53:47

相關問題