Android WebView 地理位置

Android WebView geolocation

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

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

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

link 我正在尝试访问的是 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>

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

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

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

需要全力协助Please Click Here