特定のリンクをタップしたときにだけ外部ブラウザアプリを起動する、
そんなことがやりたいと言われたので調べました。
大きく分けて2つの方法があるようです。
ひとつめは、リンクのタップを検知して処理を適宜変更する方法。
ふたつめは、リンク記述にjavascriptを利用し適宜変更する方法。
タップ検知で色々するためには、WebViewClientの
- public boolean shouldOverrideUrlLoading (WebView view, String url)
- public void onPageStarted (WebView view, String url, Bitmap favicon)
などを利用する方法がありますが、onPageStartedだと変な挙動をした(気がするだけ)のでshouldOverrideUrlLoadingを使う事にしました。
javascriptを利用する方に関しては詳しく書いてあるサイトはいくつも存在するのでそちらを確認してください。
今回はWebViewTestActivityというActivityを作成してみました。
■ WebViewTestActivity
package jp.gr.java_conf.smd877.webviewtest;
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Window;
import android.webkit.WebView;
import android.webkit.WebViewClient;
/**
* 特定のURLへのアクセス時のみブラウザアプリを起動するWebViewアプリ
*/
public class WebViewTestActivity extends Activity {
/** Activityが保持する唯一のWebViewインスタンス */
private WebView webView;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// タイトルバー非表示
requestWindowFeature(Window.FEATURE_NO_TITLE);
// インスタンス作成
webView = new WebView(this);
// URL読み込み
webView.loadUrl("http://hoge.srv/index.html");
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// link2という文字列を含むリンクURLの場合ブラウザアプリ起動
if (-1 != url.indexOf("link2")) {
webView.stopLoading();
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(i);
return false;
}
return super.shouldOverrideUrlLoading(view, url);
}
});
// JS利用を許可する
webView.getSettings().setJavaScriptEnabled(true);
// JSからJsInterfaceを呼び出すために登録
webView.addJavascriptInterface(new JsInterface(), "wvt");
setContentView(webView);
}
/**
* WebViewに追加するインターフェースクラス
*/
private class JsInterface {
/**
* 引数のURLを利用してACTION_VIEWを起動するメソッド
*
* @param url
*/
@SuppressWarnings("unused")
public void callBrowser(String url) {
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(i);
}
}
}
ついでにマニフェストも乗っけておきます。
android.permission.INTERNETの権限追加はお忘れなく。
■ AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="jp.gr.java_conf.smd877.webviewtest"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".WebViewTestActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
index.htmlは適当に書いただけなのでAタグの書き方とか汚いと思うけど気にしない。
■ index.html
<html>
<body>
Link list.<br />
<br />
<a href="link1.html">link1.html</a><br />
<br />
<a href="link2.html">link2.html</a><br />
<br />
<a href="javascript:wvt.callBrowser('http://hoge.srv/link3.html')">link3.html</a><br />
</body>
</html>