2016-07-27 159 views
0

我在我的应用程序中使用android WebView加载一些网址,并成功。但是,当我试图加载此网址:无法加载网址与Android WebView

http://dev.infibond.com/cloud/instagram?user_profile=https%3A%2F%2Fscontent.cdninstagram.com%2Ft51.2885-19%2Fs150x150%2F13534190_829691380497090_1099495058_a.jpg&user_name=infibondtest

但出于某种原因,我没有 - “view.loadUrl(URL);”在“shouldOverrideUrlLoading”中不显示页面,也不加载其他网址。只是显示一个白页。 从服务器的响应代码是304.

在我到这个URL之前,我正在对Instagram进行身份验证并将访问令牌作为cookie发送。

public class CloudWebViewActivity extends ActivityBase { 

    public static final String TAG = "WebViewActivity"; 

    private static final String WEB_VIEW_TOKEN = "token"; 
    private static final String WEB_VIEW_TITLE = "title"; 
    private static final String WEB_VIEW_URL = "url"; 

    private ProgressBar mPbProgress; 
    private Toolbar mToolbar; 

    private String mTitle, mUrl; 

    public static void setInstance(Context context, String title, String url) { 
     Intent starter = new Intent(context, CloudWebViewActivity.class); 

     starter.putExtra(WEB_VIEW_TITLE, title); 
     starter.putExtra(WEB_VIEW_URL, url); 

     context.startActivity(starter); 
    } 

    // MARK: Lifecycle 
    protected void onCreate(Bundle savedInstanceState) { 
     mTitle = getIntent().getStringExtra(WEB_VIEW_TITLE); 
     mUrl = getIntent().getStringExtra(WEB_VIEW_URL); 

     super.onCreate(savedInstanceState); 

     AppInstance.sharedInstance().getBus().register(this); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     AppInstance.sharedInstance().setSelf(); 
     mToolbar.setTitle(mTitle); 
     mPbProgress.setVisibility(View.VISIBLE); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     AppInstance.sharedInstance().getBus().unregister(this); 
    } 

    @SuppressLint("SetJavaScriptEnabled") 
    public void findViews() { 
     setContentView(R.layout.webview_activity); 

     mPbProgress = (ProgressBar) findViewById(R.id.pBProgress); 

     final WebView mWebView = (WebView) findViewById(R.id.webView); 
     if (mWebView != null) { 
      mWebView.getSettings().setJavaScriptEnabled(true); 
      mWebView.getSettings().setLoadWithOverviewMode(true); 
      mWebView.getSettings().setUseWideViewPort(true); 
      mWebView.setWebViewClient(webViewClient); 

      // Register a new JavaScript interface called HTMLOUT 
      mWebView.addJavascriptInterface(new MyJavaScriptInterface(), "HTMLOUT"); 
     } 

     if (JavaUtils.isNotNullNotEmptyNotWhiteSpaceOnly(mUrl) && mWebView != null) { 
      String cookieString = WEB_VIEW_TOKEN + "=" + NetworkManager.instance().getToken(); 
      CookieManager.getInstance().setCookie(mUrl, cookieString); 
      mWebView.loadUrl(mUrl); 
     } else { 
      InfiLogger.getInstance().logRemoteException(new RuntimeException("Cloud service: " + mTitle + " came with an empty/null url address")); 
      AndroidUtils.showToast(R.string.error_cant_load_url); 
     } 
    } 

    @Override 
    public Toolbar setToolbar() { 
     mToolbar = (Toolbar) findViewById(R.id.mToolbar); 
     if (mToolbar != null) { 
      mToolbar.setVisibility(View.VISIBLE); 
     } 
     return mToolbar; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     return super.onCreateOptionsMenu(menu); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case android.R.id.home: 
       finish(); 
       break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void handleProgressBarVisibility(String url) { 
     if (url.contains("login") || 
       url.contains("https://api.twitter.com/oauth/authorize?oauth_token=") || 
       url.contains("https://vimeo.com/log_in") || 
       url.contains(".jpg")) { 
      mPbProgress.setVisibility(View.GONE); 
     } else { 
      mPbProgress.setVisibility(View.VISIBLE); 
     } 
    } 

    private final WebViewClient webViewClient = new WebViewClient() { 

     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 
     } 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      handleProgressBarVisibility(url); 
      String cookieString = WEB_VIEW_TOKEN + "=" + NetworkManager.instance().getToken(); 
      CookieManager.getInstance().setCookie(mUrl, cookieString); 
      view.loadUrl(url); 
      return true; 
     } 

     @Override 
     public void onPageFinished(WebView view, final String url) { 
      if (url.startsWith("http://dev.infibond.com/api/cloud/")) { 
       mPbProgress.setVisibility(View.GONE); 

       // This call inject JavaScript into the page which just finished loading. 
       view.loadUrl("javascript:window.HTMLOUT.processHTML('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');"); 
      } 
     } 

     @Override 
     public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) { 
      super.onReceivedError(view, request, error); 
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
       AndroidUtils.showToast(error.getDescription()); 
      } else { 
       AndroidUtils.showToast(R.string.gen_Something_went_wrong); 
      } 
      mPbProgress.setVisibility(View.INVISIBLE); 
     } 

    }; 

    // An instance of this class will be registered as a JavaScript interface 
    class MyJavaScriptInterface { 
     @JavascriptInterface 
     @SuppressWarnings("unused") 
     public void processHTML(String html) { 
      // process the html as needed by the app 
      InfiLogger.d("infi", "html: " + html); 

      if (html.contains("code")) { 
       final boolean success; 
       if (html.contains("\"code\":200")) { 
        AndroidUtils.showToast(AndroidUtils.getString(R.string.cloud_sync_start) + mTitle); 
        success = true; 
       } else { 
        AndroidUtils.showToast(AndroidUtils.getString(R.string.gen_Something_went_wrong)); 
        success = false; 
       } 

       AppInstance.sharedInstance().getBus().post(new CloudConnectionStateChangedBusEvent(mTitle, success)); 
       finish(); 
      } 
     } 
    } 

} 
+0

定义“失败”。 – Tigger

+0

转到“view.loadUrl(url);” “shouldOverrideUrlLoading” 但不显示页面,也不加载其他网址。 只显示一个白页。 – OShiffer

+1

这仍然不清楚。在“dev.infibond.com”或其他网站上,“白页”是否完成了来自Web服务器的200响应?是“白页”在错误代码响应中呈现的内容(如500,501?)。你需要更清楚。建议用信息更新问题。 – Tigger

回答

0

我不是100%确定,但它似乎像你有很多小错误。我认为有问题的是这里:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    handleProgressBarVisibility(url); 
    String cookieString = WEB_VIEW_TOKEN + "=" + 
     NetworkManager.instance().getToken(); 
    CookieManager.getInstance().setCookie(mUrl, cookieString); 
    view.loadUrl(url); 
    return true; 
} 

view.loadUrl(url)对我来说似乎是非常错误的。我认为你可能需要改变这样的东西:

@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    if (Uri.parse(url).getHost().equals("dev.infibond.com")) { 
     return false; 
    } 
    // otherwise, they are leaving the site, so open a new 
    // browser instead 
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
    view.getContext().startActivity(intent); 
    return true; 
} 

并删除你在这里做的事情的胆量。它大部分是findViews(),不应该重复。我猜这是你的意思与 handleProgressBarVisibility(url)WebViewClient做的,但我真的不知道:

@Override 
public void onLoadResource(WebView view, String url) { 
    handleProgressBarVisibility(url); 
}