【问题标题】:Can not acess url that are present in the html files from Webview in Android无法从 Android 中的 Webview 访问 html 文件中存在的 url
【发布时间】:2012-07-24 17:47:22
【问题描述】:

我正在尝试使用 shouldOverrideUrlLoading 方法访问 url。出于某种原因,当我尝试访问 html 文件中存在的 url 时,出现 Web page not available 错误。以前我可以访问 url,因为我将 html 文件存储在 raw 文件夹中,但我需要将其移动到 assets文件夹,因为这样代码看起来更干净。这是我的代码,谁能告诉我如何解决这个问题。

webview.setWebChromeClient(new WebChromeClient());
webview.setWebViewClient(new WebViewClient());
webview.loadUrl("file:///android_asset/myfile/file.html");
webview.setVerticalScrollBarEnabled(false);
webview.setWebViewClient(new WebViewClient()
{
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        if (url.equalsIgnoreCase("some text")){
            setDialog("some fancy text");
        }

【问题讨论】:

  • 你为什么要调用 setWebViewClient() 两次?您的 html 文件也是在子文件夹中还是直接在 assets 文件夹中?
  • 谢谢蒂姆,我真的错过了,但是是的,该文件位于资产文件夹的子文件夹中..
  • 它显示什么而不是网页?当 loadUrl 调用发生时,logcat 中是否有任何消息?
  • 对不起,蒂姆,但 logcat 中没有消息,当我尝试访问 url 时,显示一个网页不可用页面,并在 file:///android_asset/ 处显示错误..web 页由于找不到请求的文件,因此无法加载文件/某些文本..
  • file:/// 在 Android 4.0 中被认为是“不安全的”。很有可能您的代码实际上可以在运行 Android 2.3 或更低版本的设备上运行......但是,它显然不再适用于 Ice Cream Sandwich。我一直无法找到可行的替代方案:/

标签: android webview android-webview


【解决方案1】:

先尝试获取文件的Real Path,然后按照自己的方式尝试:


String YourURI="/android_asset/myfile/file.html";
YourURI = new File(getRealPathFromURI(YourURI));

//Got the Real Path Of the File

private String getRealPathFromURI(Uri contentURI) {
  Cursor cursor = getContentResolver().query(contentURI, null, null, null, null); 
  cursor.moveToFirst(); 
  int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
  return cursor.getString(idx); 
}

webview.setWebChromeClient(new WebChromeClient());
webview.setWebViewClient(new WebViewClient());
webview.loadUrl(YourURI);                      //**Used the Real Path**
webview.setVerticalScrollBarEnabled(false);
webview.setWebViewClient(new WebViewClient()
{
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        if (url.equalsIgnoreCase("some text")){
            setDialog("some fancy text");
        }
}    

如果文件在 SDCARD 中:-


webview.setWebChromeClient(new WebChromeClient());
webview.setWebViewClient(new WebViewClient());
if (!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
  Log.d(TAG, "No SDCARD");
} 
else 
{
  webview.loadUrl("file://"+Environment.getExternalStorageDirectory()
                                   +"/android_asset/myfile/file.html");
}
webview.setVerticalScrollBarEnabled(false);
webview.setWebViewClient(new WebViewClient()
{
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        if (url.equalsIgnoreCase("some text")){
            setDialog("some fancy text");
        }
}    

最终编辑:- 此代码非常适用于资产文件夹


public class MyActivity extends Activity {  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview);  
        WebView webview;  
        webview = (WebView) findViewById(R.id.webView1);  
        webview.loadUrl("file:///android_asset/myfile/file.html");
    }  
}

【讨论】:

  • Haresh,你能为我提供一个可靠的例子吗?
  • Haresh 我得到 File can't be resolve to a type error,我无法进行,请指教
  • 文件是否位于 SDCARD 中?如果是这样,请尝试我的答案的最新编辑
  • 没有 Haresh,它存储在 assets 文件夹中,正如我在代码中显示的那样,我只需要找到一种方法来解析 android assets 文件夹中的内容,然后使用 loadUrl 方法..any想法?感谢大家的帮助
  • 请检查我的最终编辑。您可以尝试创建一个新项目以进行跟踪。
【解决方案2】:

还有另一种方法也适合你---

webView.loadData(customHtml, "text/html", "UTF-8");

其中 custromHtml 是用于显示的 HTML 行。

在“custromHtml”的地方,你只需传递“file://android_asset/myfile/file.html”。

我认为这应该可行。

【讨论】:

    【解决方案3】:

    你也可以试试 -

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            String myURL = "file:///android_asset/index.html";
            myBrowser=(WebView)findViewById(R.id.mybrowser);
    
            /*By default Javascript is turned off,
             * it can be enabled by this line.
             */
            myBrowser.getSettings().setJavaScriptEnabled(true);
            myBrowser.setWebViewClient(new WebViewClient());
    
            myBrowser.loadUrl(myURL);
    
        }
    

    并检查您是否已将文件放置在主项目的正确文件夹中。如果一切正常,请创建一个干净的项目并修复项目。然后尝试运行它。

    【讨论】:

    • 感谢 Kumar,我已经听从了您的建议,但我无法让 shouldOverrideUrlLoading 指向我要显示的对话框。这太令人沮丧了,它无法访问 assets 文件夹中的 html 文件
    【解决方案4】:
    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            String myURL = "file:///android_asset/index.html";
            myBrowser=(WebView)findViewById(R.id.mybrowser);
            myBrowser.getSettings().setJavaScriptEnabled(true);
            myBrowser.setWebViewClient(new WebViewClient());
    
            myBrowser.loadUrl(myURL);
    
        }
    

    【讨论】:

      【解决方案5】:

      这个效果不错,试试吧-----

      "android.resource://[package]/[res type]/[res name]"
      
      Uri path = Uri.parse("android.resource://com.androidbook.samplevideo/raw/myvideo");
      

      这个链接也很有用-

      http://developer.android.com/reference/android/webkit/WebView.html

      Loading an Android Resource into a WebView

      【讨论】:

        【解决方案6】:

        shouldOverrideUrlLoading 不适用于 ICS for file://,但适用于外部 url。 loadURL 从资产文件夹加载正常。

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        
            WebView web=(WebView)findViewById(R.id.webView1);
        
            web.setWebViewClient(new MyWebClient());
            //web.loadUrl("file:///android_asset/index.html");
            web.loadUrl("http://google.com");
        

        .....

        class MyWebClient extends WebViewClient
        {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Log.d("MyWebClient", "url is: " + url);
        
                if (url.equalsIgnoreCase("google.com")){
                    Log.d("MyWebClient","url is: " + url);
                }
                return false;
            }
        
        }
        

        【讨论】:

          【解决方案7】:
          【解决方案8】:

          我觉得你应该试试这个....

          webview.setWebChromeClient(new WebChromeClient());
          webview.setWebViewClient(new WebViewClient());
          webview.loadUrl("file://android_asset/myfile/file.html");
          webview.setVerticalScrollBarEnabled(false);
          webview.setWebViewClient(new WebViewClient()
          {
              public boolean shouldOverrideUrlLoading(WebView view, String url) {
          
                  if (url.equalsIgnoreCase("some text")){
                      setDialog("some fancy text");
                  }
          

          【讨论】:

          • 应该是file:///,而不是file://
          猜你喜欢
          • 2016-04-19
          • 1970-01-01
          • 2018-03-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-08-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多