Android 无法将我的位置覆盖添加到osmdroid映射

Android 无法将我的位置覆盖添加到osmdroid映射,android,openstreetmap,osmdroid,Android,Openstreetmap,Osmdroid,我正在尝试使用以下代码将我的GPS位置添加到地图中: MyLocationNewOverlay locationOverlay; locationOverlay = new MyLocationNewOverlay(new GpsMyLocationProvider(mContext), mapView); locationOverlay.enableMyLocation(); mapView.getOverlays().add(locationO

我正在尝试使用以下代码将我的GPS位置添加到地图中:

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);