2016-07-27 122 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); 
}