location.getAddrStr()为空的问题

本文介绍了一个简单的配置步骤:通过在初始化时设置option.setAddrType('all')来完成特定的功能实现。

初始化时加上option.setAddrType("all");就可以了。

public class MyLocationListener extends BDAbstractLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location == null || location.getLocType() == BDLocation.TypeServerError) { // 这里可以添加Toast提示 return; } String addr = location.getAddrStr(); //获取详细地址信息 String country = location.getCountry(); //获取国家 String province = location.getProvince(); //获取省份 String city = location.getCity(); //获取城市 String district = location.getDistrict(); //获取区县 String street = location.getStreet(); //获取街道信息 String adcode = location.getAdCode(); //获取adcode String town = location.getTown(); //获取乡镇信息 double latitude = location.getLatitude(); //获取纬度信息 double longitude = location.getLongitude(); //获取经度信息 float radius = location.getRadius(); //获取定位精度,默认值为0.0f String coorType = location.getCoorType(); //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准 int errorCode = location.getLocType(); //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明 MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) .direction(location.getDirection()) .latitude(location.getLatitude()) .longitude(location.getLongitude()) .build(); mBaiduMap.setMyLocationData(locData); // 如果是第一次定位,移动地图到当前位置 if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLngZoom(ll, 18f)); } } } 请帮我添加一个功能,将获取到的定位坐标输出到我定义的textview上
03-14
package com.example.test1; import android.Manifest; import android.content.pm.PackageManager; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; import com.baidu.location.BDAbstractLocationListener; import com.baidu.location.BDLocation; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.model.LatLng; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private MapView mMapView; private BaiduMap mBaiduMap; // 定位相关变量 private LocationClient mLocationClient; private TextView tvLocationInfo; private Button btnLocation; private boolean isFirstLoc = true; // 权限请求码 private static final int PERMISSION_REQUEST_CODE = 100; // 必需的权限(添加必要的网络权限) private String[] neededPermissions = { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.INTERNET }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate started"); try { // 设置隐私协议 setAgreePrivacy(); // 初始化百度地图SDK SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); // 初始化视图 initViews(); // 初始化地图 initMap(); // 检查并请求权限 checkAndRequestPermissions(); } catch (Exception e) { Log.e(TAG, "Error in onCreate: " + e.getMessage(), e); Toast.makeText(this, "初始化失败: " + e.getMessage(), Toast.LENGTH_LONG).show(); } } private void setAgreePrivacy() { try { SDKInitializer.setAgreePrivacy(getApplicationContext(), true); com.baidu.location.LocationClient.setAgreePrivacy(true); Log.d(TAG, "Privacy policy agreed"); } catch (Exception e) { Log.e(TAG, "Error setting privacy policy: " + e.getMessage(), e); } } private void initViews() { try { mMapView = findViewById(R.id.bmapView); tvLocationInfo = findViewById(R.id.tv_location_info); btnLocation = findViewById(R.id.btn_location); if (mMapView == null) { Log.e(TAG, "MapView is null!"); return; } mBaiduMap = mMapView.getMap(); // 设置定位按钮点击事件 btnLocation.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { startLocation(); } }); Log.d(TAG, "Views initialized"); } catch (Exception e) { Log.e(TAG, "Error in initViews: " + e.getMessage(), e); } } private void initMap() { try { if (mBaiduMap == null) { Log.e(TAG, "BaiduMap is null in initMap"); return; } // 设置地图类型 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); // 开启地图的定位图层 mBaiduMap.setMyLocationEnabled(true); // 设置初始中心点(北京) LatLng center = new LatLng(39.915, 116.404); MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(center); mBaiduMap.setMapStatus(status); // 设置缩放级别 MapStatusUpdate zoom = MapStatusUpdateFactory.zoomTo(15.0f); mBaiduMap.setMapStatus(zoom); Log.d(TAG, "Map initialized successfully"); } catch (Exception e) { Log.e(TAG, "Error in initMap: " + e.getMessage(), e); } } private void initLocation() { try { if (mLocationClient != null) { return; } // 定位初始化 mLocationClient = new LocationClient(getApplicationContext()); // 设置定位参数 - 修复配置 LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy); option.setCoorType("bd09ll"); option.setIsNeedAddress(true); option.setOpenGps(true); option.setScanSpan(2000); // 改为2秒间隔 option.setLocationNotify(true); // 添加超时设置 option.setTimeOut(30000); // 禁用POI列表获取,减少崩溃风险 option.setIsNeedLocationPoiList(false); mLocationClient.setLocOption(option); // 注册定位监听器 mLocationClient.registerLocationListener(new MyLocationListener()); Log.d(TAG, "Location initialized successfully"); } catch (Exception e) { Log.e(TAG, "Error in initLocation: " + e.getMessage(), e); Toast.makeText(this, "定位初始化失败", Toast.LENGTH_SHORT).show(); } } private void startLocation() { try { if (!checkLocationPermission()) { Toast.makeText(this, "请先授予定位权限", Toast.LENGTH_SHORT).show(); checkAndRequestPermissions(); return; } if (mLocationClient == null) { initLocation(); } if (mLocationClient != null) { if (mLocationClient.isStarted()) { mLocationClient.stop(); } mLocationClient.start(); // 等待一下再请求定位 mLocationClient.requestLocation(); tvLocationInfo.setVisibility(View.VISIBLE); tvLocationInfo.setText("正在定位中..."); Toast.makeText(this, "开始定位", Toast.LENGTH_SHORT).show(); Log.d(TAG, "Location started"); } } catch (Exception e) { Log.e(TAG, "Error in startLocation: " + e.getMessage(), e); Toast.makeText(this, "定位启动失败", Toast.LENGTH_SHORT).show(); } } /** * 检查并请求所有需要的权限 */ private void checkAndRequestPermissions() { List<String> permissionsNeeded = new ArrayList<>(); for (String permission : neededPermissions) { if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) { permissionsNeeded.add(permission); } } if (permissionsNeeded.isEmpty()) { // 所有权限都已授予,初始化定位并自动开始 initLocation(); // 延迟一下再开始定位,确保初始化完成 new android.os.Handler().postDelayed(new Runnable() { @Override public void run() { startLocation(); } }, 1000); } else { // 请求缺少的权限 ActivityCompat.requestPermissions(this, permissionsNeeded.toArray(new String[0]), PERMISSION_REQUEST_CODE); } } /** * 专门检查定位权限 */ private boolean checkLocationPermission() { boolean fineLocation = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED; boolean coarseLocation = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED; return fineLocation || coarseLocation; } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_REQUEST_CODE) { boolean locationPermissionGranted = false; for (int i = 0; i < permissions.length; i++) { String permission = permissions[i]; int result = grantResults[i]; if ((permission.equals(Manifest.permission.ACCESS_FINE_LOCATION) || permission.equals(Manifest.permission.ACCESS_COARSE_LOCATION)) && result == PackageManager.PERMISSION_GRANTED) { locationPermissionGranted = true; } } if (locationPermissionGranted) { // 定位权限已授予,初始化定位并自动开始 initLocation(); // 延迟开始定位 new android.os.Handler().postDelayed(new Runnable() { @Override public void run() { startLocation(); } }, 1000); Toast.makeText(this, "权限获取成功,开始自动定位", Toast.LENGTH_SHORT).show(); } else { // 定位权限被拒绝 if (tvLocationInfo != null) { tvLocationInfo.setText("权限被拒绝,无法定位"); tvLocationInfo.setVisibility(View.VISIBLE); } Toast.makeText(this, "定位权限被拒绝", Toast.LENGTH_LONG).show(); } } } /** * 定位监听器 - 添加值检查 */ public class MyLocationListener extends BDAbstractLocationListener { @Override public void onReceiveLocation(BDLocation location) { if (location == null || mMapView == null || mBaiduMap == null) { Log.e(TAG, "Location, MapView or BaiduMap is null"); return; } try { Log.d(TAG, "Location received - Lat: " + location.getLatitude() + ", Lng: " + location.getLongitude() + ", Type: " + location.getLocType()); // 检查定位是否有效 if (location.getLocType() == BDLocation.TypeServerError || location.getLocType() == BDLocation.TypeNetWorkException || location.getLocType() == BDLocation.TypeCriteriaException) { runOnUiThread(() -> { if (tvLocationInfo != null) { tvLocationInfo.setText("定位失败: " + location.getLocTypeDescription()); } }); return; } // 检查坐标是否有效 if (!isValidLocation(location.getLatitude(), location.getLongitude())) { Log.e(TAG, "Invalid location coordinates"); runOnUiThread(() -> { if (tvLocationInfo != null) { tvLocationInfo.setText("获取到无效的定位坐标"); } }); return; } // 更新UI显示定位信息 updateLocationInfo(location); // 在地图上显示位置 MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) .direction(location.getDirection()) .latitude(location.getLatitude()) .longitude(location.getLongitude()) .build(); mBaiduMap.setMyLocationData(locData); // 如果是第一次定位,移动到当前位置 if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); MapStatusUpdate zoom = MapStatusUpdateFactory.zoomTo(18.0f); mBaiduMap.animateMapStatus(zoom); } } catch (Exception e) { Log.e(TAG, "Error in onReceiveLocation: " + e.getMessage(), e); } } } /** * 检查坐标是否有效 */ private boolean isValidLocation(double lat, double lng) { return !Double.isNaN(lat) && !Double.isNaN(lng) && !Double.isInfinite(lat) && !Double.isInfinite(lng) && Math.abs(lat) > 0.001 && Math.abs(lng) > 0.001 && Math.abs(lat) < 90 && Math.abs(lng) < 180; } private void updateLocationInfo(BDLocation location) { if (tvLocationInfo == null) return; StringBuilder sb = new StringBuilder(); sb.append("定位成功:\n"); sb.append("经度: ").append(String.format("%.6f", location.getLongitude())).append("\n"); sb.append("纬度: ").append(String.format("%.6f", location.getLatitude())).append("\n"); sb.append("精度: ").append(String.format("%.1f", location.getRadius())).append("米\n"); if (location.getAddrStr() != null) { sb.append("地址: ").append(location.getAddrStr()); } final String locationText = sb.toString(); runOnUiThread(new Runnable() { @Override public void run() { if (tvLocationInfo != null) { tvLocationInfo.setText(locationText); } } }); } @Override protected void onResume() { super.onResume(); Log.d(TAG, "onResume"); try { if (mMapView != null) { mMapView.onResume(); } } catch (Exception e) { Log.e(TAG, "Error in onResume: " + e.getMessage(), e); } } @Override protected void onPause() { super.onPause(); Log.d(TAG, "onPause"); try { if (mMapView != null) { mMapView.onPause(); } // 停止定位以节省电量 if (mLocationClient != null && mLocationClient.isStarted()) { mLocationClient.stop(); } } catch (Exception e) { Log.e(TAG, "Error in onPause: " + e.getMessage(), e); } } @Override protected void onDestroy() { super.onDestroy(); Log.d(TAG, "onDestroy"); try { // 停止定位 if (mLocationClient != null) { if (mLocationClient.isStarted()) { mLocationClient.stop(); } mLocationClient = null; } // 关闭定位图层 if (mBaiduMap != null) { mBaiduMap.setMyLocationEnabled(false); } // 释放地图资源 if (mMapView != null) { mMapView.onDestroy(); } } catch (Exception e) { Log.e(TAG, "Error in onDestroy: " + e.getMessage(), e); } } }怎么修改上述问题
最新发布
11-07
当 `window.location.search` 为时,通常是因为 URL 中使用了 hash(即 URL 中带有 `#` 符号),导致 URL 后面的参数被 `location.hash` 截取走,使得 `window.location.search` 获取不到任何值。以下是几种解决方法: #### 从 `location.hash` 中提取参数 可以通过 `window.location.hash` 来获取参数。示例代码如下: ```javascript function GetQueryString (name) { var after = window.location.hash.split("?")[1]; if(after) { var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)"); var r = after.match(reg); if(r != null) { return decodeURIComponent(r[2]); } else { return null; } } } // 调用示例 var paramValue = GetQueryString('id'); console.log(paramValue); ``` 此方法是先通过 `window.location.hash.split("?")[1]` 获取 hash 后面的查询字符串,再用正则表达式匹配所需参数的值[^3]。 #### 自定义函数解析 URL 可以编写一个函数对整个 URL 进行解析,以获取参数。示例代码如下: ```javascript function getQueryStr (urls = "") { let url = urls || (window.location.href.split("#")[1] || window.location.href); url = decodeURIComponent(url); let result = {}; let arr = url.split("?"); let params = arr[1] && arr[1].split("&"); if (!params) return result; for (let i = 0; i < params.length; i++) { let item = params[i].split("="); item[0] = decodeURIComponent(item[0]); item[1] = decodeURIComponent(item[1]); result[item[0]] = item[1]; } return result; } // 调用示例 var allParams = getQueryStr(); console.log(allParams); ``` 该函数可以处理包含 hash 的 URL,将参数解析为一个对象返回,适用于 Vue hash 模式等场景,还能解决兼容微信分享链接中取参错误的问题[^4]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值