在 Android WebView 中获取地理位置信息的解决方法如下:
import android.Manifest;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.webkit.GeolocationPermissions;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
public class MainActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webview);
// 设置 WebView 的属性
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true); // 允许运行 JavaScript
webSettings.setGeolocationEnabled(true); // 允许使用地理位置
// 设置 WebViewClient,用于处理页面加载完成时的回调
webView.setWebViewClient(new WebViewClient() {
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
requestLocationPermission(); // 请求地理位置权限
}
});
// 设置 WebChromeClient,用于处理地理位置请求的回调
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
callback.invoke(origin, true, false); // 允许获取地理位置信息
}
});
// 加载 WebView 的页面
webView.loadUrl("https://example.com");
}
// 请求地理位置权限
@SuppressLint("MissingPermission")
private void requestLocationPermission() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1);
} else {
getLocation(); // 获取地理位置信息
}
}
// 获取地理位置信息
@SuppressLint("MissingPermission")
private void getLocation() {
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
LocationListener locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
// 处理获取到的地理位置信息
double latitude = location.getLatitude();
double longitude = location.getLongitude();
// 将地理位置传递给 WebView 的 JavaScript
webView.loadUrl("javascript:handleLocation(" + latitude + "," + longitude + ")");
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {}
@Override
public void onProviderEnabled(String provider) {}
@Override
public void onProviderDisabled(String provider) {}
};
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}
}
handleLocation
来处理接收到的地理位置信息:
通过以上步骤,你可以在 Android WebView 中获取地理位置信息并将其传递给 WebView 的 JavaScript 函数进行处理。