2017-03-15 182 views
1

誰能幫我在外部瀏覽器或其他Android應用程序打開特定的鏈接?Webview - 在外部瀏覽器中打開鏈接?

例如,如果URL匹配WhatsApp的://那麼它應該在WhatsApp的應用中打開鏈接,如果沒有則安裝了WhatsApp它應該在的Android瀏覽器中打開https://play.google.com/store/apps/details?id=com.whatsapp

FYI:我使用https://github.com/SurfEdge/flarum-mobile-android創建Web應用程序查看我的論壇網站。

我的Android代碼如下所示:

package com.example.example; 

import android.content.Intent; 
import android.graphics.Bitmap; 
import android.os.Build; 
import android.os.Bundle; 
import android.os.Message; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.KeyEvent; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.webkit.CookieManager; 
import android.webkit.WebChromeClient; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 
import android.widget.ProgressBar; 

import im.delight.android.webview.AdvancedWebView; 

public class MainActivity extends AppCompatActivity implements AdvancedWebView.Listener{ 

public AdvancedWebView webView; 
private ProgressBar mPbar = null; 

private static final String url = "https://example.com/"; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    mPbar = (ProgressBar) findViewById(R.id.loader); 

    webView = (AdvancedWebView) findViewById(R.id.newWeb); 
    webView.loadUrl(url); 
    webView.setListener(this, this); 

    WebSettings webSettings = webView.getSettings(); 
    webSettings.setJavaScriptEnabled(true); 
    webSettings.setAppCacheEnabled(true); 
    webSettings.setDomStorageEnabled(true); 
    webSettings.setCacheMode(WebSettings.LOAD_DEFAULT); 
    webSettings.setAllowFileAccess(true); 

    CookieManager cookieManager = CookieManager.getInstance(); 
    cookieManager.setAcceptCookie(true); 

    webView.setWebChromeClient(new WebChromeClient() { 
     @Override 
     public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) { 
      AdvancedWebView newWebView = new AdvancedWebView(MainActivity.this); 
      WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj; 
      transport.setWebView(newWebView); 
      resultMsg.sendToTarget(); 
      return true; 
     } 
    }); 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     webView.setLayerType(View.LAYER_TYPE_HARDWARE, null); 
     webSettings.setAllowUniversalAccessFromFileURLs(true); 
    } else { 
     webView.setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
    } 

    webView.setWebViewClient(new WebViewClient(){ 
    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
    mPbar.setVisibility(View.VISIBLE); 
    } 

    public void onPageFinished(WebView view, String url) { 
    mPbar.setVisibility(View.GONE); 
    } 

    @SuppressWarnings("deprecation") 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.startsWith("whatsapp://")) { 
      final Uri uri = Uri.parse("market://details?id=com.whatsapp"); 
      final Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri); 
      @SuppressWarnings({"NewApi", "deprecation"}) 
      final int newDocumentFlag = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) ? Intent.FLAG_ACTIVITY_NEW_DOCUMENT : Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET; 
      goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | newDocumentFlag | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 

     try { 
      startActivity(goToMarket); 
     } catch (ActivityNotFoundException ex) { 
      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.whatsapp"))); 
     } 
     return true; 
    } 

    return super.shouldOverrideUrlLoading(view, url); 
    } 

    }); 


    webView.setOnKeyListener(new View.OnKeyListener() { 
     @Override 
     public boolean onKey(View v, int keyCode, KeyEvent event) { 
      if ((keyCode == KeyEvent.KEYCODE_BACK) && webView.canGoBack()) { 
       webView.goBack(); 
       return true; 
      } 
      return false; 
     } 
    }); 

    webView.setThirdPartyCookiesEnabled(true); 
    webView.setCookiesEnabled(true); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 


@Override 
protected void onResume() { 
    super.onResume(); 
    webView.onResume(); 
} 

@Override 
protected void onPause() { 
    webView.onPause(); 
    super.onPause(); 
} 

@Override 
protected void onDestroy() { 
    webView.onDestroy(); 
    super.onDestroy(); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
    webView.onActivityResult(requestCode, resultCode, intent); 
} 

@Override 
public void onBackPressed() { 
    if (!webView.onBackPressed()) { return; } 
    super.onBackPressed(); 
} 


@Override 
public void onPageStarted(String url, Bitmap favicon) { 

} 

@Override 
public void onPageFinished(String url) { 

} 

@Override 
public void onPageError(int errorCode, String description, String failingUrl) { 

} 

@Override 
public void onDownloadRequested(String url, String suggestedFilename, String mimeType, long contentLength, String contentDisposition, String userAgent) { 

} 

@Override 
public void onExternalPageRequest(String url) { 

} 
} 

錯誤:

Error:(86, 11) error: cannot find symbol class Uri 
Error:(86, 21) error: cannot find symbol variable Uri 
Error:(94, 22) error: cannot find symbol class ActivityNotFoundException 
Error:(95, 62) error: cannot find symbol variable Uri 

PS:我不是一個Android開發者

+0

這將幫助你:http://stackoverflow.com/問題/ 13760310 /如何對攔截的URL-負載功能於網頁瀏覽式的Android –

回答

0

您應該重寫shouldOverrideUrlLoading,確定URL有指定的前綴,然後在Play Store上打開Whatsapp列表,或者如果未安裝Play商店,請在裏面打開它瀏覽器:

webView.setWebViewClient(new WebViewClient(){ 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     mPbar.setVisibility(View.VISIBLE); 
    } 

    public void onPageFinished(WebView view, String url) { 
     mPbar.setVisibility(View.GONE); 
    } 

    @SuppressWarnings("deprecation") 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.startsWith("whatsapp://")) { 
      // create an intent for Play Store 
      final Uri uri = Uri.parse("market://details?id=com.whatsapp"); 
      final Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri); 
      @SuppressWarnings({"NewApi", "deprecation"}) 
      final int newDocumentFlag = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) ? Intent.FLAG_ACTIVITY_NEW_DOCUMENT : Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET; 
      goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | newDocumentFlag | Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 

      try { 
       // open Whatsapp listing in Play Store app 
       startActivity(goToMarket); 
      } catch (ActivityNotFoundException ex) { 
       // open Whatsapp listing in browser 
       startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=com.whatsapp"))); 
      } 

      return true; 
     } 

     return super.shouldOverrideUrlLoading(view, url); 
    } 

}); 

編輯

此行添加到文件的頂部導入必要的類:

import android.content.ActivityNotFoundException; 
import android.net.Uri;  
+0

錯誤:找不到類URI和ActivityNotFoundException –

+0

請編輯您的問題,包括完成堆棧跟蹤 –

+0

。請檢查。 –

相關問題