将Web(Html/CSS/JS)转Android应用后,如何添加位置权限?
问题描述
我开发了一款浏览器应用,用户可在其中使用Leaflet路由工具导航至API提供的地点,也能查看自身位置,该功能在网页端运行正常。如今我将其转为Android平台的APK文件,在手机上打开后,天气API、表单提交、Leaflet地图均正常工作,但无法获取位置——应用未请求位置权限,且无法在Android应用设置中添加该权限。
var map2 = L.map('map2').setView([39,32], 13); var osm2 = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', { attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' }).addTo(map2); var personicon = L.icon({ iconUrl: 'icons/person-walking.png', iconSize: [40, 40], }); fetch("https://www.nosyapi.com/apiv2/pharmacyLink?city=zonguldak&county=caycuma&apikey=zgD1WkxDpzSFpdSD5vNk8qjYxls8nhFwT4xeVqmn4EMrYcOKXCw1xyR0gU4r" ).then(response => { return response.json() } ).then(responseJson => { console.log(responseJson) var latitude0 = responseJson.data[0].latitude var longitude0 = responseJson.data[0].longitude var latitude1 = responseJson.data[1].latitude var longitude1 = responseJson.data[1].longitude var latitude2 = responseJson.data[2].latitude var longitude2 = responseJson.data[2].longitude var latitude3 = responseJson.data[3].latitude var longitude3 = responseJson.data[3].longitude var latitude4 = responseJson.data[4].latitude var longitude4 = responseJson.data[4].longitude navigator.geolocation.getCurrentPosition(getPosition); function getPosition(position){ console.log(position) var lat2 = position.coords.latitude var long2 = position.coords.longitude console.log('İşte Konumunuz, Enlem:' + lat2, 'Boylam:' + long2) var konummarker2 = L.marker([lat2, long2], {icon: personicon} ).addTo(map2) map2.flyTo([lat2, long2], 12); L.Routing.control({ waypoints: [ L.latLng(lat2, long2), L.latLng(latitude0, longitude0) ] }).addTo(map2); }});
解决方案
1. 在AndroidManifest.xml中添加位置权限
Android应用必须在清单文件中声明权限,系统才会识别并展示权限选项。把以下代码添加到AndroidManifest.xml的根标签内:
<!-- 粗略定位权限 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 精确定位权限 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <!-- Android 10+ 后台定位需要的权限(按需添加) --> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
2. 动态请求运行时权限
Android 6.0(API 23)及以上版本,危险权限需要在运行时主动请求用户授权,仅靠清单声明没用。根据你打包的方式分两种情况处理:
用Cordova/Capacitor等框架打包
- Cordova:安装
cordova-plugin-geolocation插件,它会自动处理权限请求和地理定位API的适配。 - Capacitor:使用
@capacitor/geolocation插件,调用Geolocation.getCurrentPosition()时会自动触发权限弹窗。
自定义WebView开发
在Android原生代码中先请求权限,再开启WebView的地理定位支持:
// 检查并请求位置权限 private void requestLocationPermissions() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 100); } else { enableWebViewGeolocation(); } } // 启用WebView地理定位功能 private void enableWebViewGeolocation() { WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setGeolocationEnabled(true); webSettings.setGeolocationDatabasePath(getFilesDir().getPath()); // 处理WebView的定位请求回调 webView.setWebChromeClient(new WebChromeClient() { @Override public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) { callback.invoke(origin, true, false); } }); } // 处理权限请求结果 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 100) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { enableWebViewGeolocation(); } else { // 用户拒绝权限,可添加提示逻辑 } } }
3. 完善前端错误处理
在你的JS代码中添加定位失败的回调,给用户明确提示:
navigator.geolocation.getCurrentPosition(getPosition, function(error) { switch(error.code) { case error.PERMISSION_DENIED: alert("定位权限被拒绝,请前往应用设置开启位置权限"); break; case error.POSITION_UNAVAILABLE: alert("无法获取当前位置,请检查定位是否开启"); break; case error.TIMEOUT: alert("定位请求超时,请重试"); break; case error.UNKNOWN_ERROR: alert("定位发生未知错误"); break; } });
内容的提问来源于stack exchange,提问作者Enes Gultepe
相关产品推荐
相关产品推荐

