出版

Android の Web ビュー内のリンクを傍受するための、デバイスに依存しない簡単なトリックを紹介します。

クライアントの依頼でWebビューの開発に取り組んでいます。ネイティブアプリ開発者にとって、Webビューは特に難しい課題です。最近私が克服した課題の一つは、Webビューにクリック可能な電話番号を表示することでした。
クライアントの要望は十分に納得のいくものでした。ウェブページに電話番号が表示され、ユーザーがその電話番号をクリックすると、ウェブサイトから事前に入力された電話番号が入ったダイヤラーがアプリによって起動されるという仕組みです。
私が読んだ限りでは、これはモバイルブラウザで「問題なく動作する」はずです。リンクのhrefの先頭に「tel:」が付いていれば、モバイルブラウザを実行しているデバイスはプラットフォームに適した動作をするはずです。実際には、様々なメーカーのデバイスでかなりの数が宣伝通りに動作しましたが、そうでないデバイスもかなりありました。幸いなことに、Android SDKにはバージョン1.0以降、アプリが読み込みURLをインターセプトし、必要に応じて動作をオーバーライドできるメカニズムが搭載されています。
このチュートリアルでは、Webビューでユーザーが電話番号リンクをタップし、それに続いて電話アプリを起動する動作をインターセプトする方法を説明します。このテクニックは、デバイスのモバイルブラウザがhrefをどのように解釈するか(あるいは解釈しないか)に関係なく使用できます。チュートリアルに沿って進めていくか、プロジェクト全体をダウンロードしてEclipseに直接インポートしてください。
1. Eclipseで新しいAndroidプロジェクトを作成します。Android 2.3(Gingerbread)以降をターゲットとします。
2. /res/layout フォルダで、activity_main.xml に Web ビューを追加します。
activity_main.xml
3. /src/MainAcitvity.java ファイル内に新しい Web ビュークライアントを作成し、作成時に Web ビューに割り当てます。残りは、ダイヤラーを開いて URL に埋め込まれた電話番号を渡すための標準的な Android インテントです。
MainActivity.java
package com.authorwjf.webview_link_intercept;
import android.net.Uri;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.app.Activity;
import android.content.Intent;
public class MainActivity extends Activity {
private static final String HTML ="Click here to call!";
private static final String TEL_PREFIX = "tel:";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView wv = (WebView) findViewById(R.id.webview);
wv.setWebViewClient(new CustomWebViewClient());
wv.loadData(HTML, "text/html", "utf-8");
}
private class CustomWebViewClient extends WebViewClient {
@Override
public boolean shouldOverrideUrlLoading(WebView wv, String url) {
if(url.startsWith(TEL_PREFIX)) {
Intent intent = new Intent(Intent.ACTION_DIAL);
intent.setData(Uri.parse(url));
startActivity(intent);
return true;
}
return false;
}
}
}
おそらくお気づきかと思いますが、この例ではダイヤラーを起動していますが、should override url 読み込み関数で true を返すことで、アプリのフローを任意の方法でリダイレクトできます。このデバイスに依存しない手法は、ここで説明したシナリオ以外にも、多くのシナリオで役立つと思います。
Web ビューの動作を実際に確認したい場合は、APK をコンパイルしてデバイスまたはエミュレーターにロードするだけです。
図A

図B


ウィリアム・J・フランシス
ウィリアムは自称「メーカー」です。20年以上の業界経験を持ち、世界有数の有名ブランドのデジタルソリューション構築に携わってきました。著書も出版しており、特許取得済みの発明家であり、短期間ながらAmazonで1位を獲得したビデオゲームの開発者でもあります。