Android 无法将我的位置覆盖添加到osmdroid映射
我正在尝试使用以下代码将我的GPS位置添加到地图中:Android 无法将我的位置覆盖添加到osmdroid映射,android,openstreetmap,osmdroid,Android,Openstreetmap,Osmdroid,我正在尝试使用以下代码将我的GPS位置添加到地图中: MyLocationNewOverlay locationOverlay; locationOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(mContext), mapView); locationOverlay.enableMyLocation(); mapView.getOverlays().add(locationO
MyLocationNewOverlay locationOverlay;
locationOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(mContext), mapView);
locationOverlay.enableMyLocation();
mapView.getOverlays().add(locationOverlay);
但是,该代码无效,不会向地图中添加任何内容(例如,没有图标、没有文本等)。请注意,缩放覆盖和手势覆盖效果很好,但是当我将它们添加到地图视图时,MyLocationNewOverlay覆盖没有效果。有什么想法吗
更新:
这是我的活动代码:
public class MainActivity extends AppCompatActivity implements View.OnClickListener, LocationListener {
private static final int STORAGE_REQUEST = 100;
private static final int LOCATION_REQUEST = 101;
private static final String TAG = "MainActivity";
private Context mContext;
private MapView mMap;
private EditText latitude;
private EditText longitude;
private Button searchLocation;
IMapController mapController;
private MyLocationNewOverlay locationOverlay;
ArrayList<OverlayItem> items = new ArrayList<>();
/**
* Compass overlay
*/
private CompassOverlay mCompassOverlay;
private RotationGestureOverlay mRotationOverlay;
private ScaleBarOverlay mScaleBarOverlay;
private MyLocationNewOverlay mMyLocationOverlay;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = getApplicationContext();
Configuration.getInstance().load(mContext, PreferenceManager.getDefaultSharedPreferences(mContext));
Configuration.getInstance().setUserAgentValue("Dalvik");
setContentView(R.layout.activity_main);
//Check Permissions
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, STORAGE_REQUEST);
}
if (ActivityCompat.checkSelfPermission(mContext, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_REQUEST);
}
mMap = findViewById(R.id.mapView);
mMap.setTileSource(TileSourceFactory.MAPNIK);
mMap.setBuiltInZoomControls(true);
mMap.setMultiTouchControls(true);
latitude = findViewById(R.id.latitude);
longitude = findViewById(R.id.longitude);
searchLocation = findViewById(R.id.searchLocation);
searchLocation.setOnClickListener(this);
mapController = mMap.getController();
mapController.setZoom(9.0f);
//Add my location
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
final LocationManager locMgr = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
final String provider = locMgr.getBestProvider(criteria, true);
locMgr.requestLocationUpdates(provider, 1000, 100, this);
Location loc = locMgr.getLastKnownLocation(provider);
Log.d(TAG, "onCreate: " + loc.getLatitude() + ", " + loc.getLongitude());
//Start on Iran
GeoPoint iran = new GeoPoint(32.4279, 53.6880);
mapController.setCenter(iran);
//Add my location overlay
mMyLocationOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(mContext), mMap);
mMyLocationOverlay.enableMyLocation();
mMap.getOverlays().add(mMyLocationOverlay);
//Add compass overlay
mCompassOverlay = new CompassOverlay(mContext, mMap);
mCompassOverlay.enableCompass();
mCompassOverlay.setEnabled(true);
mMap.getOverlays().add(mCompassOverlay);
//Add rotation gesture overlay
mRotationOverlay = new RotationGestureOverlay(mMap);
mRotationOverlay.setEnabled(true);
mMap.setMultiTouchControls(true);
mMap.getOverlays().add(mRotationOverlay);
//Add map scale bar overlay
mScaleBarOverlay = new ScaleBarOverlay(mMap);
mScaleBarOverlay.setCentred(true);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
mScaleBarOverlay.setScaleBarOffset(dm.widthPixels / 2, 30);
mMap.getOverlays().add(mScaleBarOverlay);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
//Check and decide
if (grantResults[0] != PackageManager.PERMISSION_GRANTED) {
Toast.makeText(mContext, R.string.permission_not_granted_please_allow, Toast.LENGTH_LONG).show();
}
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.searchLocation) {
double lat = Double.valueOf(latitude.getText().toString());
double lng = Double.valueOf(longitude.getText().toString());
GeoPoint geoPoint = new GeoPoint(lat, lng);
mapController.setCenter(geoPoint);
}
}
@Override
protected void onPause() {
super.onPause();
mMyLocationOverlay.setEnabled(false);
mMap.onPause();
}
@Override
protected void onResume() {
super.onResume();
mMyLocationOverlay.setEnabled(true);
mMap.onResume();
}
@Override
public void onLocationChanged(Location location) {
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {
}
@Override
public void onProviderDisabled(String provider) {
}
}
public类MainActivity扩展AppCompatActivity实现View.OnClickListener、LocationListener{
专用静态最终整数存储请求=100;
私有静态最终int位置_请求=101;
私有静态最终字符串TAG=“MainActivity”;
私有上下文;
私有地图视图mMap;
私人编辑文本纬度;
私有文本经度;
私人按钮搜索位置;
IMapController映射控制器;
私有MyLocationNewOverlay位置覆盖;
ArrayList items=新建ArrayList();
/**
*罗盘覆盖
*/
私人CompassOverlay McCompassOverlay;
私有旋转管理覆盖mRotationOverlay;
私人ScaleBarOverlay mScaleBarOverlay;
私人MyLocationNewOverlay mMyLocationOverlay;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
mContext=getApplicationContext();
load(mContext,PreferenceManager.getDefaultSharedReferences(mContext));
Configuration.getInstance().setUserAgentValue(“Dalvik”);
setContentView(R.layout.activity_main);
//检查权限
if(ActivityCompat.checkSelfPermission(mContext、Manifest.permission.WRITE\u EXTERNAL\u STORAGE)!=PackageManager.permission\u已授予){
ActivityCompat.requestPermissions(这个新字符串[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},STORAGE_REQUEST);
}
if(ActivityCompat.checkSelfPermission(mContext、Manifest.permission.ACCESS\u FINE\u LOCATION)!=PackageManager.permission\u已授予){
ActivityCompat.requestPermissions(这是新字符串[]{Manifest.permission.ACCESS\u FINE\u LOCATION},LOCATION\u REQUEST);
}
mMap=findviewbyd(R.id.mapView);
mMap.setTileSource(TileSourceFactory.MAPNIK);
mMap.SetBuilTinZoomControl(真);
mMap.设置多点触控(真);
纬度=findViewById(R.id.纬度);
经度=findViewById(R.id.经度);
searchLocation=findViewById(R.id.searchLocation);
searchLocation.setOnClickListener(此);
mapController=mMap.getController();
mapController.setZoom(9.0f);
//添加我的位置
标准=新标准();
标准.设定准确度(标准.准确度/精细度);
final LocationManager locMgr=(LocationManager)mContext.getSystemService(Context.LOCATION\u服务);
最终字符串提供程序=locMgr.getBestProvider(条件为true);
Locamgr.RequestLocationUpdate(提供程序,1000,100,此);
Location loc=locMgr.getlastnownlocation(提供者);
d(标记“onCreate:+loc.getLatitude()+”,“+loc.getLatitude()”);
//从伊朗开始
伊朗地质点=新地质点(32.4279,53.6880);
赛特中心地图管理员(伊朗);
//添加我的位置覆盖
mMyLocationOverlay=新的MyLocationNewOverlay(新的GpsMyLocationProvider(mContext),mMap);
mMyLocationOverlay.enableMyloLocation();
mMap.getOverlays().add(mMyLocationOverlay);
//添加罗盘覆盖图
mCompassOverlay=新CompassOverlay(mContext,mMap);
mCompassOverlay.enableCompass();
mCompassOverlay.setEnabled(true);
mMap.getOverlays().add(mCompassOverlay);
//添加旋转手势覆盖
mRotationOverlay=新的RotationGestureOverlay(mMap);
mRotationOverlay.setEnabled(true);
mMap.设置多点触控(真);
mMap.getOverlays().add(mRotationOverlay);
//添加地图比例尺覆盖
mScaleBarOverlay=新的ScaleBarOverlay(mMap);
mScaleBarOverlay.setcentered(真);
DisplayMetrics dm=新的DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
mScaleBarOverlay.setScaleBarOffset(dm.widthPixels/2,30);
mMap.getOverlays().add(mScaleBarOverlay);
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
//审定
如果(grantResults[0]!=PackageManager.PERMISSION\u已授予){
Toast.makeText(mContext,R.string.permission\u not\u promised\u please\u allow,Toast.LENGTH\u LONG).show();
}
}
@凌驾
公共void onClick(视图v){
if(v.getId()==R.id.searchLocation){
double lat=double.valueOf(latitude.getText().toString());
double lng=double.valueOf(longitude.getText().toString());
地质点=新的地质点(纬度、液化天然气);
地图控制器。设置中心(地质点);
}
}
@凌驾
受保护的void onPause(){
super.onPause();
mMyLocationOverlay.setEnabled(false);
mMap.onPause();
}
@凌驾
受保护的void onResume(){
super.onResume();
mMyLocationOverlay.setEnabled(true);
mMap.onResume();
}
@凌驾
已更改位置上的公共无效(位置){
}
@凌驾
public void onStatusChanged(字符串提供程序、int状态、Bundle extra){
}
@凌驾
公共无效onProviderEnabled(字符串提供程序){
}
@凌驾
公共无效onProviderDisabled(字符串提供程序){
}
}
这个问题被问了很多。以下是它不起作用的最常见原因
- 你的设备有GPS吗
- 您的设备是否启用了GPS服务
- osmdroid仅添加GPS
GpsMyLocationProvider prov= new GpsMyLocationProvider(); prov.addLocationSource(LocationManager.NETWORK_PROVIDER); MyLocationNewOverlay locationOverlay = new MyLocationNewOverlay(prov, mapView); locationOverlay.enableMyLocation(); mMap.getOverlayManager().add(locationOverlay);
final LocationManager locMgr = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); final String provider = locMgr.getBestProvider(criteria, true); locMgr.requestLocationUpdates(provider, 1000, 100, this); Location loc = locMgr.getLastKnownLocation(provider); //Add my location overlay OverlayItem newItem = new OverlayItem("Here", "You are here", new GeoPoint(loc)); items.add(newItem); ItemizedIconOverlay<OverlayItem> myLocOverlay = new ItemizedIconOverlay<OverlayItem>(items, getResources().getDrawable(R.drawable.my_location, null), new ItemizedIconOverlay.OnItemGestureListener<OverlayItem>() { @Override public boolean onItemSingleTapUp(int index, OverlayItem item) { return false; } @Override public boolean onItemLongPress(int index, OverlayItem item) { return false; } }, mContext); mMap.getOverlays().add(myLocOverlay);