SQLの窓

2017年11月17日


Android で WebView を使ってWEBにあるデータベースのデータを取得する為のクラス

WebView は非表示で良く、HTTP の機能のみ必要です。その為、最低限必要な機能を WebView を継承して実装しています

※ compile 'com.google.code.gson:gson:2.8.2' を使用

DataWebView.java
import android.content.Context;
import android.util.AttributeSet;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class DataWebView extends WebView {

	public DataWebView(Context context) {
		super(context);
		init();
	}
	public DataWebView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init();
	}
	public DataWebView(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);
		init();
	}

	private void init(){
		// 編集モードの場合は処理を行わない
		if (isInEditMode()) {
			return ;
		}

		this.getSettings().setDomStorageEnabled(true);
		this.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
		this.getSettings().setJavaScriptEnabled(true);

		this.setWebViewClient(new WebViewClient() {

			@Override
			public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
				return false;
			}
		});

	}

}


Android と WebView 内の JavaScript とのインターフェイスです

JavaScriptAccess.java
import android.util.Log;
import android.webkit.JavascriptInterface;

public class JavaScriptAccess {

	// Webページからデータを取得するイベント用
	public interface OnGetWebDataListener {
		abstract public void onWebGetDataListener( String textData );
	}

	private OnGetWebDataListener ogwdl = null;

	public JavaScriptAccess( OnGetWebDataListener ogwdl ) {
		this.ogwdl = ogwdl;
	}

	@JavascriptInterface
	public void logcat(String message) {
		Log.i("lightbox", message);
	}

	@JavascriptInterface
	public void toAndroid(String message) {
		this.ogwdl.onWebGetDataListener(message);
	}

}


JavaScriptAccess によって(インターフェイス経由の onWebGetDataListener の呼び出し)、JavaScript から呼び出された時のイベントとして、こちら側で処理が可能になっています。

但し、非同期の処理の為、UI スレッドへは直接アクセスできないので、runOnUiThread を使用しています。

MainActivity での実装部分
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.google.gson.Gson;

public class MainActivity extends AppCompatActivity {

	private DataWebView dataWebView;
	private Gson gson;
	private Syain syain;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		gson = new Gson();
		dataWebView = (DataWebView) MainActivity.this.findViewById(R.id.webView);

		MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View view) {

				// 呼び出し( 後は、JavaScriptAccess のイベントで待つ )
				String callString = String.format("getWebPageData(\"%s\")", "0001");
				dataWebView.evaluateJavascript(callString,null);

			}
		});

		// JavaScript からの戻り
		dataWebView.addJavascriptInterface(new JavaScriptAccess(new JavaScriptAccess.OnGetWebDataListener() {
			@Override
			public void onWebGetDataListener(String textData) {

				syain = gson.fromJson(textData, Syain.class);
				MainActivity.this.runOnUiThread(new Runnable() {
					@Override
					public void run() {

						TextView textView1 = (TextView) MainActivity.this.findViewById(R.id.textView1);
						textView1.setText(syain.scode);

						TextView textView2 = (TextView) MainActivity.this.findViewById(R.id.textView2);
						textView2.setText(syain.kj);

					}
				});

			}
		}), "androidObject");

		dataWebView.loadUrl("http://winofsql.jp/002.php");
	}
}


画面定義
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button"/>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:textSize="30sp"/>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:textSize="30sp"/>

    <com.example.lightbox.webviewtest.DataWebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:visibility="visible"/>


</LinearLayout>


Syain クラス
public class Syain {

	public String scode;
	public String kj;
	public String furi;
	public String syozoku;
	public String seibetu;
	public String kyuyo;
	public String teate;
	public String kanri;
	public String birth;
	public String sname;

}


Web 側の定義( JavaScript / HTML )

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script>
// **************************************
// Android から呼ばれる場合
// console.log は Android 側で表示
// **************************************
if ( typeof androidObject !== 'undefined' ) {
	window.console.log = function(message){
		androidObject.logcat(message);
	}
}

function getWebPageData(scode) {

	$("#param").val(scode);
	// ***************************************
	// Android WebView の中のこのページ
	// より、サーバへアクセスします
	// ***************************************
	$.get("dbdata2_json.php?scode="+scode,function( data ){
		$("#result").val(JSON.stringify(data));
		if ( typeof androidObject !== 'undefined' ) {
			// サーバから受け取った application/json データ
			// を文字列に変換して Android に渡します
			androidObject.toAndroid(JSON.stringify(data));
		}
		else {
			// 通常のブラウザではこちらが実行されます
			console.log(JSON.stringify(data,null,"   "));
		}
	})
}
function setWebPageData(sdata) {

	$("#param").val(sdata);
	// ***************************************
	// Android WebView の中のこのページ
	// より、サーバへアクセスします
	// ***************************************
	$.get("dbdata_update_json.php?sdata="+encodeURIComponent(sdata),function( data ){
		$("#result").val(JSON.stringify(data));
		if ( typeof androidObject !== 'undefined' ) {
			// サーバから受け取った application/json データ
			// を文字列に変換して Android に渡します
			androidObject.toAndroid(JSON.stringify(data));
		}
		else {
			// 通常のブラウザではこちらが実行されます
			console.log(JSON.stringify(data,null,"   "));
		}
	})
}
</script>
</head>
<body>
<pre>
<input type="button" value="logcat test" onclick="androidObject.logcat('OK')">

<input type="button" value="toAndroid test" onclick="getWebPageData('0001')">

<input type="button" value="toAndroid update" onclick='setWebPageData(&#39;{"birth":"2000/10/1","furi":"ウラオカ トモヤ","kj":"浦岡 友也","kyuyo":"270000","scode":"0001","seibetu":"0","sname":"営業部第三","syozoku":"0003","teate":"9000"}&#39;)'>

<a href="dbdata2_json.php?scode=0001">リンク</a>

<textarea id="param" style="width:100%;height:100px;"></textarea>
<textarea id="result" style="width:100%;height:100px;"></textarea>

</pre>
</body>
</html>


関連する記事

WebView で JavaScript にデータを渡したい時に注意する事




【Android Studio 2の最新記事】
posted by lightbox at 2017-11-17 21:48 | Android Studio 2 | このブログの読者になる | 更新情報をチェックする
container 終わり



フリーフォントで簡単ロゴ作成
フリーフォントでボタン素材作成
フリーフォントで吹き出し画像作成
フリーフォントではんこ画像作成
ほぼ自由に利用できるフリーフォント
フリーフォントの書体見本とサンプル
画像を大きく見る為のウインドウを開くボタンの作成

CSS ドロップシャドウの参考デモ
イラストAC
ぱくたそ
写真素材 足成
フリーフォント一覧
utf8 文字ツール
右サイド 終わり
base 終わり