Android WebView 地理位置

Posted

技术标签:

【中文标题】Android WebView 地理位置【英文标题】:Android WebView geolocation 【发布时间】:2017-08-04 15:23:29 【问题描述】:

我知道这个问题已经被问了很多时间,但我找不到任何帮助。

我正在尝试构建一个加载使用地理位置的网站的应用。

当应用程序加载时,它应该打开一个谷歌地图,上面有我的位置。在网络浏览器上它工作正常。

我尝试访问的链接是https://pas.irsglobal.net/test/

我的代码如下。

//MainActivity.java

package za.co.opexsolutions.www.panicapp;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
public class MainActivity extends AppCompatActivity 
/**
 * WebViewClient subclass loads all hyperlinks in the existing WebView
 */
public class GeoWebViewClient extends WebViewClient 
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
        // When user clicks a hyperlink, load in the existing WebView
        view.loadUrl(url);
        return true;
    


/**
 * WebChromeClient subclass handles UI-related calls
 * Note: think chrome as in decoration, not the Chrome browser
 */
public class GeoWebChromeClient extends WebChromeClient 
    @Override
    public void onGeolocationPermissionsShowPrompt(String origin,
                                                   GeolocationPermissions.Callback callback) 
        // Always grant permission since the app itself requires location
        // permission and the user has therefore already granted it
        callback.invoke(origin, true, false);
    




WebView wv;
String mypage = "https://pas.irsglobal.net/test/";
String mypage_error = "file:///android_asset/mypage_error/index.html";

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


    wv  = (WebView) findViewById(R.id.wv);
    wv.getSettings().setjavascriptCanOpenWindowsAutomatically(true);
    wv.setWebViewClient(new GeoWebViewClient());
    wv.getSettings().setJavaScriptEnabled(true);
    wv.getSettings().setGeolocationEnabled(true);
    wv.setWebChromeClient(new GeoWebChromeClient());
    wv.setFocusable(true);
    wv.setFocusableInTouchMode(true);
    wv.getSettings().setRenderPriority(WebSettings.RenderPriority.HIGH);
    wv.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
    wv.getSettings().setDomStorageEnabled(true);
    wv.getSettings().setDatabaseEnabled(true);
    wv.getSettings().setAppCacheEnabled(true);



    wv.setWebChromeClient(new WebChromeClient() 
        public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) 
            // callback.invoke(String origin, boolean allow, boolean remember);
            callback.invoke(origin, true, false);
        
    );

    wv.loadUrl(mypage);

    wv.setWebViewClient(new WebViewClient()
        public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) 
            wv.loadUrl(mypage_error);
        
    );




//Manifest.xml

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
<uses-permission android:name="android.permission.LOCATION_HARDWARE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>

<application
    android:allowBackup="true"
    android:icon="@mipmap/shipping"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/shipping"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".HomeActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".MainActivity"></activity>
</application>

【问题讨论】:

请看:How do I avoid misusing tags? 【参考方案1】:

好的,经过一段时间的搜索可能是什么问题,我希望这对其他人也有帮助。 在这种情况下,问题不是我的代码,而是我在模拟器上运行的 Android 版本。 (我使用的是 Android 7 Nougat)。

从 Android 6.0(API 级别 23)开始,用户在应用运行时授予应用权限,而不是在安装应用时。

如果设备运行 Android 6.0 或更高版本,并且您的应用的目标 SDK 为 23 或更高版本:应用必须在清单中列出权限,并且必须在应用运行时请求其所需的每个权限。用户可以授予或拒绝每个权限,即使用户拒绝权限请求,应用程序也可以继续以有限的功能运行。

寻求全面帮助Please Click Here

【讨论】:

以上是关于Android WebView 地理位置的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio:地理定位不起作用。无法在 Webview 中获取地理位置

android webview地理定位不起作用

Android WebView 地理位置

Android webview html5地理定位

Android webview html5地理定位

如何将android webview保持在后台(使用位置)