Android Studio : WebView を介してサーバーのデータベースのデータにアクセスする
|
|
日時: 2017/11/18 14:45
名前: lightbox
|
1) Android で入力した値を、javascript: で呼び出した関数に引数を文字列として渡す
2) その値で、Web ページはサーバーから必要な値を JSON オブジェクトでもらう( jQuery なので )
3) そのオブジェクトを JSON で文字列に変換して、Android に送る
4) Android では、その文字列を Gson で Android 内のオブジェクトに変換
5) UI スレッドへその値を送る
Syain クラス
拡張子:
package sample.lightbox.webview1011;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.EditText;
import android.widget.TextView;
import com.google.gson.Gson;
public class MainActivity extends AppCompatActivity {
// WebView のインスタンス
private WebView wv = null;
// 表示されているページの URL
private String startPage = null;
// 初期表示ページ
private String initPage = "http://10.0.2.2/test/001.php";
private Gson gson = null;
private Syain syain = null;
private Handler handler = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler();
gson = new Gson();
// WebView のインスタンスを取得
wv = (WebView) MainActivity.this.findViewById(R.id.webView);
// Webページとのインターフェイスを登録します
// Webページ上からは、androidObject.toAndroid で呼ぶ事ができます
// (toAndroid は、@JavascriptInterface で登録したメソッド)
wv.addJavascriptInterface(new JavaScriptAccess(new JavaScriptAccess.OnGetWebDataListener() {
@Override
public void onWebGetDataListener(String textData) {
try {
syain = gson.fromJson(textData,Syain.class);
// 別スレッドから UI スレッドへのアクセス
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
TextView tv = (TextView) MainActivity.this.findViewById(R.id.textView);
tv.setText(syain.氏名);
}
});
} catch (Exception e) {
e.printStackTrace();
}
Log.i("lightbox", syain.社員コード);
Log.i("lightbox", syain.フリガナ);
Log.i("lightbox", Integer.toString(syain.性別));
Log.i("lightbox", syain.作成日);
Log.i("lightbox", syain.更新日);
Log.i("lightbox", Integer.toString(syain.給与));
Log.i("lightbox", Integer.toString(syain.手当));
if ( syain.管理者 == null ) {
Log.i("lightbox", "NULL");
}
else {
Log.i("lightbox", syain.管理者 );
}
if ( syain.生年月日 == null ) {
Log.i("lightbox", "NULL");
}
else {
Log.i("lightbox", syain.生年月日 );
}
}
}), "androidObject");
// WebView の表示履歴を戻る為のボタン
MainActivity.this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
wv.goBack();
}
});
// Webページの JavaScript の呼び出し
MainActivity.this.findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EditText et = (EditText) MainActivity.this.findViewById(R.id.editText);
String scode =((EditText) MainActivity.this.findViewById(R.id.editText)).getText().toString();
String callString = String.format("javascript:getWebPageData(\"%s\")",scode);
wv.loadUrl(callString);
}
});
// 必ず必要な JavaScript を有効にする設定
wv.getSettings().setJavaScriptEnabled(true);
// 必ず必要な設定
wv.setWebViewClient(new WebViewClient(){
// 必ず必要な設定 : 常に WebView 内でページを表示する為
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
Log.i("lightbox", "shouldOverrideUrlLoading"+url);
return super.shouldOverrideUrlLoading(view, url);
}
// オプション : 表示されたページの URL を変数にセット
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
Log.i("lightbox", "onPageStarted:" + url);
startPage = url;
}
// オプション : ページを表示し終わってから発生するイベント
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
});
// 目的のページを表示する
wv.loadUrl(initPage);
}
@Override
protected void onStop() {
super.onStop();
wv.clearHistory();
wv.clearCache(true);
Log.i("lightbox", "onStop");
}
}
|
|
Webページとの橋渡しをする クラス : JavaScriptAccess ( No.1 ) |
|
日時: 2015/10/12 14:11
名前: lightbox
|
日時: 2015/10/12 14:11 名前: lightbox
|
Webページ( 001.php ) ( No.2 ) |
日時: 2017/11/18 14:37 名前: lightbox
 |
MySQL から JSON データを取得する dbdata_json.php ( No.3 ) |
日時: 2015/10/12 13:36 名前: lightbox
拡張子:
<?php
header( "Content-Type: application/json; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
header( "Access-Control-Allow-Origin: *" );
$server = 'localhost';
$db_name = 'lightbox';
$user = 'root';
$password = 'パスワード';
$json_type = JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT;
$db_data_type = MYSQLI_ASSOC;
// 接続
$connect = @ new mysqli($server, $user, $password, $db_name);
if ($connect->connect_error) {
die('Connect Error (' . $connect->connect_errno . ') '
. $connect->connect_error);
}
$connect->set_charset("utf8");
// クエリ
$_GET["scode"] = str_replace("'","''",$_GET["scode"]);
$result = $connect->query("select * from 社員マスタ where 社員コード = '{$_GET["scode"]}'");
if ( !$result ) {
die('クエリーに誤りがあります : ' . $connect->error );
}
// 内容を書き込むファイルの準備
$log_file = "rowdata_002.json";
file_put_contents( $log_file,"" );
$check = false;
while ($row = $result->fetch_array($db_data_type)) {
$check = true;
print json_encode($row,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
print "\n";
// ファイルに追加出力
file_put_contents( $log_file, print_r(json_encode($row,$json_type)."\n",true), FILE_APPEND );
}
// 開放
$result->close();
// 接続解除
$connect->close();
if (!$check) {
print <<< ERROR
{
"社員コード": "{$_GET["scode"]}",
"氏名": "ERROR",
"フリガナ": null,
"所属": null,
"性別": null,
"作成日": null,
"更新日": null,
"給与": null,
"手当": null,
"管理者": null
}
ERROR;
}
?>
 |
画面定義 ( No.4 ) |
日時: 2015/10/12 16:30 名前: lightbox
 |
dbdata_json.php : 社員マスタに別テーブルを結合した別バージョン ( No.5 ) |
日時: 2015/10/16 12:36 名前: lightbox
拡張子:
<?php
header( "Content-Type: application/json; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
header( "Access-Control-Allow-Origin: *" );
$server = 'localhost';
$db_name = 'lightbox';
$user = 'root';
$password = 'パスワード';
$json_type = JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT;
$db_data_type = MYSQLI_ASSOC;
// 接続
$connect = new mysqli($server, $user, $password, $db_name);
if ($connect->connect_error) {
die('Connect Error (' . $connect->connect_errno . ') '
. $connect->connect_error);
}
$connect->set_charset("utf8");
$_GET["scode"] = str_replace("'","''",$_GET["scode"]);
$query = <<< QUERY
select 社員マスタ.*,コード名称マスタ.名称 as sname from 社員マスタ
left outer join コード名称マスタ
on 社員マスタ.所属 = コード名称マスタ.コード
where コード名称マスタ.区分 = 2
and 社員コード = '{$_GET["scode"]}'
QUERY;
// クエリ
$result = $connect->query($query);
if ( !$result ) {
die('クエリーに誤りがあります : ' . $connect->error );
}
$check = false;
while ($row = $result->fetch_array($db_data_type)) {
$check = true;
print json_encode($row,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
print "\n";
}
// 開放
$result->close();
// 接続解除
$connect->close();
if (!$check) {
print <<< ERROR
{
"社員コード": "{$_GET["scode"]}",
"氏名": "ERROR",
"フリガナ": null,
"所属": null,
"性別": null,
"作成日": null,
"更新日": null,
"給与": null,
"手当": null,
"管理者": null
}
ERROR;
}
?>
 |
|
|
|