Android 使用 WebView 加載網(wǎng)頁地圖定位的大坑

Update: 2017/12/4 16:20
突然想到了很多坑,先來占個位置。
1行疏、當手機沒有打開定位服務的時候,必須先要打開定位服務套像。參考:LocationService酿联。
2、定位服務還可能分多種夺巩,根據(jù)具體需求做相關(guān)處理贞让。

  • only GPS
  • WLAN && cellular networks
  • GPS && WLAN && cellular networks

最近遇到了一個問題,有一個需求是使用 WebView 來加載一個網(wǎng)頁地圖定位柳譬。以前都是使用 Android 原生的來開發(fā)(當然這種最好)喳张,不過各個方面都能行那更好嘛。想想應該很簡單美澳,然而一不小心就掉進了一個大坑销部,地圖無法定位(這里一般我都會想肯定是這個網(wǎng)頁的鍋)。然而 IOS 端可以制跟,這個坑就只能自己填了舅桩。

第一步,百度(谷歌要翻墻雨膨,而且公司網(wǎng)速巨慢)擂涛,一看一大堆。照著敲一敲聊记。這里我說一些必要的吧撒妈。如果你搜過了,你可以直接看文章末尾甥雕。

權(quán)限

<!-- 網(wǎng)絡權(quán)限踩身,加載網(wǎng)絡網(wǎng)頁需要聯(lián)網(wǎng) -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 粗略定位權(quán)限,允許一個程序訪問CellID或WiFi熱點來獲取粗略的位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 精確定位權(quán)限社露,允許一個程序訪問精良位置(如GPS) -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

注意:定位權(quán)限屬于危險權(quán)限挟阻,在 Android 6.0 之后需要在代碼中動態(tài)申請。

具體代碼

mWebView = findViewById(R.id.web_view);
WebSettings settings = mWebView.getSettings();
// 允許調(diào)用 JS,因為網(wǎng)頁地圖使用的是 JS 定位
settings.setJavaScriptEnabled(true);
// 允許使用數(shù)據(jù)庫
settings.setDatabaseEnabled(true);
settings.setGeolocationEnabled(true);
String dir = getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath(); settings.setGeolocationDatabasePath(dir);
settings.setDomStorageEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
                // 這里是處理是否同意定位權(quán)限附鸽,可以在這里寫一個 AlertDialog 來模仿瀏覽器彈出來的定位權(quán)限申請脱拼。
                //public void invoke(String origin, boolean allow, boolean retain);
                callback.invoke(origin, true, false);
            }

        });

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return super.shouldOverrideUrlLoading(view, url);
            }
        });

好了寫到這里也就大功告成了,然而一運行坷备,卻失敗了熄浓。最開始我以為是這個網(wǎng)頁的鍋。然而我用手機自帶瀏覽器打開居然可以省撑,它會彈出一個窗口如下:


Location Authorization

還以為是這個的原因了赌蔑,可是我不是 callback.invoke(origin, true, false); 同意了么。其實和這個沒關(guān)系...

這里是文章末尾

今天早上我突然在錘子(API level 19)設置里面看到了一個定位服務竟秫,打開之后就在上面運行成功了娃惯,十分興奮。然而還有一個大坑等著我肥败,我又在我的紅米(API level 24) 上面運行了一下趾浅,失敗了。萬分苦惱馒稍,搜索出來的結(jié)果都是千篇一律的皿哨,可是為什么我失敗了了?漫無目的的在網(wǎng)上瀏覽纽谒,沒想到還真找到了证膨。

文章地址:http://www.reibang.com/p/798cbc2b27a9
在文章末尾說到了將 targetSdkVersion 改為 23 就可以了。我的是 26鼓黔。一改椎例,果然成功。

這一系列的現(xiàn)象讓我離真理又進了一步请祖。想起還看到了一個過時方法:setGeolocationDatabasePath。然后去查了查這個方法脖祈,果然是它的鍋肆捕。

setGeolocationDatabasePath

added in API level 5
deprecated in API level 24

API level 5 ~ 23
This will update WebCore when the Sync runs in the C++ side.

API level 24 ~ Now
Geolocation database are managed by the implementation and calling this method will have no effect.

Sets the path where the Geolocation databases should be saved. In order for Geolocation permissions and cached positions to be persisted, this method must be called with a path to which the application can write.

Parameters
databasePath String: a path to the directory where databases should be saved.

void setGeolocationDatabasePath (String databasePath)

Parameters
databasePath String: a path to the directory where databases should be saved.

這里英文很簡單,就不翻譯了(其實是懶(o)/~)盖高,大致意思是說慎陵,這個方法在 API level 24 的時候被廢棄了,需要自己去實現(xiàn)管理這個數(shù)據(jù)庫喻奥。然而我不會┓( ? )┏席纽。于是就只有改成了 targetSdkVersion:23
targetSdkVersion 的作用自己去百度吧撞蚕。
好像也可以代碼中動態(tài)來處理润梯,有興趣的可以去試試。
堅持寫了這么多,扛不住了纺铭,先溜了~寇钉!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市舶赔,隨后出現(xiàn)的幾起案子扫倡,更是在濱河造成了極大的恐慌,老刑警劉巖竟纳,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撵溃,死亡現(xiàn)場離奇詭異,居然都是意外死亡锥累,警方通過查閱死者的電腦和手機缘挑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揩悄,“玉大人卖哎,你說我怎么就攤上這事∩拘裕” “怎么了亏娜?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蹬挺。 經(jīng)常有香客問我维贺,道長,這世上最難降的妖魔是什么巴帮? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任溯泣,我火速辦了婚禮,結(jié)果婚禮上榕茧,老公的妹妹穿的比我還像新娘垃沦。我一直安慰自己,他們只是感情好用押,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布肢簿。 她就那樣靜靜地躺著,像睡著了一般蜻拨。 火紅的嫁衣襯著肌膚如雪池充。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天缎讼,我揣著相機與錄音收夸,去河邊找鬼。 笑死血崭,一個胖子當著我的面吹牛卧惜,可吹牛的內(nèi)容都是我干的厘灼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼序苏,長吁一口氣:“原來是場噩夢啊……” “哼手幢!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忱详,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤围来,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后匈睁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體监透,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年航唆,在試婚紗的時候發(fā)現(xiàn)自己被綠了胀蛮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡糯钙,死狀恐怖粪狼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情任岸,我是刑警寧澤再榄,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站享潜,受9級特大地震影響困鸥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剑按,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一疾就、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧艺蝴,春花似錦猬腰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锣枝,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兰英,已是汗流浹背撇叁。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留畦贸,地道東北人陨闹。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓楞捂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親趋厉。 傳聞我的和親對象是個殘疾皇子寨闹,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,743評論 0 33
  • 姓名:周立 zhou li 公司:寧波大發(fā)化纖有限公司 【日精進打卡第34天】 【知~學習】 (六項精進)大綱背...
    周立zhouli閱讀 208評論 0 0
  • 寫在前面 關(guān)于性君账,這樣的主題繁堡。一直是諱莫如深,還是開玩笑般于生活中乡数,還是表現(xiàn)出怎樣的藝術(shù)性椭蹄。本詩是隨著所思作完,然...
    她和一個故事閱讀 299評論 1 3
  • (一)我的心想你在每個瞬間 我都快不清楚對你的感覺 (二)想關(guān)注你的一切 想知道你喜歡的音樂 (三)當天邊劃過彩虹...
    徐秀美閱讀 272評論 0 0
  • 幾乎每個人 都畏縮在路上 以為世界有多大 忘了自己 忘記了自己才是世界 廣大無邊的人間 蒸發(fā)的是 我們的勇氣 若 ...
    蔡振源閱讀 220評論 0 1