いつもお世話になってます。
Google Mapsを使用した地図アプリを作成しているのですが、
WebViewで原因がわからないところがあり、質問させていただきます。
期待動作は、以下の通りです。
① HTMLのaタグより 「http://XXXXX/latlng/緯度/経度/タイトル」 のリンクをタップ
② MapsActivityへ遷移してマーカーを表示
上記、一度目は成功しますが、以下の手順を踏むとアプリが最終的に落ちてしまいます。
① Markerをタップし、タイトルを表示させる
② 端末の戻るボタンを押下
③ 再度WebView内のリンクを押下
④ Markerがどこかの海に置かれ、タイトルが表示されない
⑤ 端末の戻るボタンを押下
⑥ 再度WebView内のリンクを押下
⑦ アプリが落ちる
各々のタイミングでのログは以下です。
log1
1//① Markerをタップし、タイトルを表示させる 2$adb logcat | grep URLCHECKER 3-------------------------------- 407-03 09:48:26.316 31516 31516 D URLCHECKER: 41.40360905003219/2.174338884964473/サクラダファミリア 507-03 09:48:26.316 31516 31516 D URLCHECKER: 41.40360905003219 607-03 09:48:26.316 31516 31516 D URLCHECKER: 2.174338884964473 707-03 09:48:26.316 31516 31516 D URLCHECKER: サクラダファミリア 8--------------------------------
log2
1//④ Markerがどこかの海に置かれ、タイトルが表示されない 2$adb logcat | grep URLCHECKER 3-------------------------------- 407-03 09:48:32.317 31516 31516 D URLCHECKER: 452/2.174338884964473/サクラダファミリア 507-03 09:48:32.317 31516 31516 D URLCHECKER: 452 607-03 09:48:32.317 31516 31516 D URLCHECKER: 2.174338884964473 707-03 09:48:32.317 31516 31516 D URLCHECKER: サクラダファミリア 8--------------------------------
log3
1//⑦ アプリが落ちる 2$adb logcat | grep URLCHECKER 3-------------------------------- 407-03 09:48:38.149 31516 31516 D URLCHECKER: .174338884964473/サクラダファミリア 507-03 09:48:38.150 31516 31516 D URLCHECKER: .174338884964473 607-03 09:48:38.150 31516 31516 D URLCHECKER: サクラダファミリア 7--------------------------------
このように
log1 では正常に値の取得ができています。
log2 では緯度が「452」になってしまいます。
log3 では経度の小数点以降のみ取得されます。
予測としては、タイトル(サクラダファミリア)は変動していないので、
URLに小数点が入っているからこの現象がおこるのかなとも思いますが、
仕様としてURLのは変更することが許されません。
どうすれば良いでしょうか。。。
ちなみに、以下がコードになります。
html
1//test.html 2<a href="http://XXXXX/latlng/41.40360905003219/2.174338884964473/サクラダファミリア">地図上で確認</a>
Java
1//TestActivity 2public class Test1Activity extends AppCompatActivity { 3 4 private WebView webView; 5 private int urlIndex; 6 String[] map_info; 7 8 9 10 @Override 11 protected void onCreate(Bundle savedInstanceState) { 12 super.onCreate(savedInstanceState); 13 setContentView(R.layout.activity_column1); 14 15 showWebView(); 16 17 intent_maps(); 18 19 } 20 21 22 23 24 /** 25 * 端末の戻るボタンでブラウザバック 26 */ 27 public boolean onKeyDown(int keyCode, KeyEvent event) { 28 29 if (keyCode == KeyEvent.KEYCODE_BACK && webView.canGoBack()) { 30 webView.goBack(); 31 return true; 32 } 33 34 return super.onKeyDown(keyCode, event); 35 36 } 37 38 39 40 41 42 /** 43 * webviewを表示 44 */ 45 void showWebView() { 46 47 webView = findViewById(R.id.webView); 48 webView.setWebViewClient(new WebViewClient()); 49 50 /*---------- 51 WEB_URL => どこに向けるか 52 ------------*/ 53 String WEB_URL = "http://XXXX/YYYYY/ZZZZ"; 54 55 //URLをlat,lng,titleにseparateするのに必要 56 urlIndex = WEB_URL.length(); 57 58 webView.loadUrl(WEB_URL); 59 webView.getSettings().setJavaScriptEnabled(true); 60 61 } 62 63 64 65 66 67 /** 68 * 1. WebViewから、aタグのURL(文字列)を取得 69 * 2. 遷移させるか否かはboolで判定 70 * => trueで遷移させない 71 * => falseで遷移させる 72 * 3. separate_url() でURLをlat,lng,titleに分割 73 * separate_url() でmap_infoに情報を格納 74 * 4. map_infoをMapsActivityに渡してMarkerを表示 75 * ----------------------- 76 * map_info[0] => lat 77 * map_info[1] => lng 78 * map_info[2] => title 79 * ----------------------- 80 */ 81 private void intent_maps() { 82 83 webView.setWebViewClient(new WebViewClient() { 84 @Override 85 public boolean shouldOverrideUrlLoading(WebView view, String url) { 86 if(separate_url(url)){ 87 88 89 Log.d("CHECKURL",map_info[0]); 90 Log.d("CHECKURL",map_info[1]); 91 Log.d("CHECKURL",map_info[2]); 92 93 Intent intent = new Intent(TestActivity.this, MapsActivity.class); 94 95 /*---------- 96 flag 「2」を渡すことでTestActivityから遷移していることを識別する 97 ------------*/ 98 intent.putExtra("flag",2); 99 intent.putExtra("fromColumn",map_info); 100 startActivity(intent); 101 102 return true; 103 }else{ 104 return false; 105 } 106 } 107 }); 108 109 } 110 111 112 113 114 /** 115 * 1. urlに/latlng/ が含まれているか確認。 116 * 2. latlang/ より前の文字列を削除 117 * 118 * @param url 119 * @return bool 120 */ 121 private boolean separate_url(String url) { 122 123 /*----------- 124 URLに/latlng/があれば「map_info」にlat,lng,titleを配列で保持 125 返り値はtrue 126 -------------*/ 127 if(url.contains("/latlng/")) { 128 129 String decodedUrl = decodeUrl(url); 130 131 String url_ltlg = "latlng/"; 132 urlIndex += url_ltlg.length(); 133 134 String substrUrl = decodedUrl.substring(urlIndex); 135 map_info = substrUrl.split("/"); 136 137 return true; 138 } 139 140 return false; 141 142 } 143 144 145 146 147 /** 148 * URLをデコード 149 * @param url 150 * @return 151 */ 152 private String decodeUrl(String url) { 153 154 try { 155 String decodedUrl = URLDecoder.decode(url, "UTF-8"); 156 157 return decodedUrl; 158 }catch (UnsupportedEncodingException e) { 159 160 return "Cannot decode"; 161 } 162 163 } 164 165}
お力をお貸ししていただけますと幸いです。
何卒、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。