萌新刚刚入门 Android ,想用百度地图做一个应用,但是屡屡碰壁,请教大佬。。
我已经认真阅读相关的开发文档,代码与示例相差无几,但是依旧实现不了
总是显示在北京的默认坐标,让人摸不着头脑本人在校学生,请多多包涵
代码附在下面,仅仅实现定位显示功能,请大佬们指教import android.app.Application;
import com.baidu.mapapi.CoordType;
import com.baidu.mapapi.SDKInitializer;public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        SDKInitializer.initialize(getApplicationContext()); // 初始化BaiduSDK库
        SDKInitializer.setCoordType(CoordType.BD09LL); // 设置经纬坐标类型 BD09LL
    }
}import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.baidu.location.BDAbstractLocationListener;
import com.baidu.location.BDLocation;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;public class MainActivity extends AppCompatActivity {    private MapView mMapView = null;
    private BaiduMap mBaiduMap = null;
    private LocationClient mLocationClient = null;    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mMapView = findViewById(R.id.bmapView); // 获取地图控件引用
        mBaiduMap = mMapView.getMap();
        //普通地图 ,mBaiduMap是地图控制器对象
        mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
        mBaiduMap.setMyLocationEnabled(true);
        //定位初始化
        mLocationClient = new LocationClient(getApplicationContext());        //通过LocationClientOption设置LocationClient相关参数
        LocationClientOption option = new LocationClientOption();
        option.setOpenGps(true); // 打开gps
        option.setCoorType("bd09ll"); // 设置坐标类型
        option.setScanSpan(1000);        //设置locationClientOption
        mLocationClient.setLocOption(option);        //注册LocationListener监听器
        MyLocationListener myLocationListener = new MyLocationListener();
        mLocationClient.registerLocationListener(myLocationListener);
        //开启地图定位图层
        mLocationClient.start();
        mLocationClient.requestLocation();
    }
    @Override
    protected void onResume() {
        //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
        mMapView.onResume();
        super.onResume();
    }
    @Override
    protected void onPause() {
        //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
        mMapView.onPause();
        super.onPause();
    }
    @Override
    protected void onDestroy() {
        mLocationClient.stop();
        mBaiduMap.setMyLocationEnabled(false);
        mMapView.onDestroy();
        mMapView = null;
        super.onDestroy();
    }    public class MyLocationListener extends BDAbstractLocationListener {
        @Override
        public void onReceiveLocation(BDLocation location) {
            //  销毁后不在处理新接收的位置
            if (location == null || mMapView == null){
                return;
            }
            MyLocationData locData = new MyLocationData.Builder()
                    .accuracy(location.getRadius())
                    // 此处设置开发者获取到的方向信息,顺时针0-360
                    .direction(location.getDirection()).latitude(location.getLatitude())
                    .longitude(location.getLongitude()).build();
            mBaiduMap.setMyLocationData(locData);
        }
    }
}密钥用 XXXXXX 替代<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.chd.ecod">    <!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <!-- 这个权限用于进行网络定位 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 这个权限用于访问GPS定位 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    <application
        android:name=".MyDApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">        <meta-data
            android:name="com.baidu.lbsapi.API_KEY"
            android:value="XXXXXX" >
        </meta-data>        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.baidu.location.f"
            android:enabled="true"
            android:process=":remote">
        </service>
    </application></manifest><?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="true" />
</android.support.constraint.ConstraintLayout>

解决方案 »

  1.   

    那个
    android:name=".MyDApplication"
    D是多打的,源代码里没有D,复制粘贴的时候手误
      

  2.   

    是不是少写了什么,之前写过Demo,供你参考public class Map1Fragment extends BaseFragment {
        private MapView mapView;
        private BaiduMap map;
        private LocationClient locationClient;
        private Point centerPoint;
        private boolean isFirstLoc = true;
        //地理编码
        private GeoCoder geoCoder;
        //当前经纬度
        private double lantitude;
        private double longtitude;
        //Poi列表
        private List<PoiInfo> poiList = new ArrayList<>();
        private PoiAdapter poiAdapter;    public static Map1Fragment newInstance() {
            return new Map1Fragment();
        }
        @Override
        public int getLayoutRes() {
            return R.layout.fragment_map1;
        }    @Override
        public void initView(Bundle savedInstanceState) {        RecyclerView recyclerView = findView(R.id.rlv_fragment_map1);
            recyclerView.setLayoutManager(new LinearLayoutManager(mActivity));        poiAdapter = new PoiAdapter(null);
            recyclerView.setAdapter(poiAdapter);        mapView = findView(R.id.bmapView);
            map = mapView.getMap();        //地理编码
            geoCoder = GeoCoder.newInstance();
        }    @Override
        public void initListener() {        //地图状态改变
            map.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() {
                @Override
                public void onMapStatusChangeStart(MapStatus mapStatus) {            }            @Override
                public void onMapStatusChangeStart(MapStatus mapStatus, int i) {            }            @Override
                public void onMapStatusChange(MapStatus mapStatus) {            }            @Override
                public void onMapStatusChangeFinish(MapStatus mapStatus) {            }
            });        //点击监听
            map.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
                @Override
                public void onMapClick(LatLng latLng) {            }            @Override
                public boolean onMapPoiClick(MapPoi mapPoi) {
                    return false;
                }
            });        //长按
            map.setOnMapLongClickListener(new BaiduMap.OnMapLongClickListener() {
                @Override
                public void onMapLongClick(LatLng latLng) {            }
            });        //点击覆盖物
            map.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
                @Override
                public boolean onMarkerClick(Marker er) {
                    return false;
                }
            });        //触摸地图
            map.setOnMapTouchListener(new BaiduMap.OnMapTouchListener() {
                @Override
                public void onTouch(MotionEvent motionEvent) {
                    if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                        // 获取当前MapView中心屏幕坐标相应的地理坐标
                        LatLng currentLatLng;
                        currentLatLng = map.getProjection().fromScreenLocation(
                                centerPoint);
                        // 发起反地理编码检索
                        geoCoder.reverseGeoCode((new ReverseGeoCodeOption())
                                .location(currentLatLng));
                    }
                }
            });        //地图加载完成
            map.setOnMapLoadedCallback(new BaiduMap.OnMapLoadedCallback() {
                @Override
                public void onMapLoaded() {            }
            });        //地图定位图标点击事件监听接口
            map.setOnMyLocationClickListener(new BaiduMap.OnMyLocationClickListener() {
                @Override
                public boolean onMyLocationClick() {
                    return false;
                }
            });        //地理编码监听
            geoCoder.setOnGetGeoCodeResultListener(new OnGetGeoCoderResultListener() {
                @Override
                public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
                    if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                        //没有检索到结果
                        return;
                    } else {
                        double latitude = geoCodeResult.getLocation().latitude;
                        double longitude = geoCodeResult.getLocation().longitude;
                    }
                }            @Override
                public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
                    if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {
                        //没有找到检索结果
                        return;
                    } else {                    //当前
                        PoiInfo currentPoiInfo = new PoiInfo();
                        currentPoiInfo.address = reverseGeoCodeResult.getAddress();
                        currentPoiInfo.location = reverseGeoCodeResult.getLocation();
                        currentPoiInfo.name = "[位置]";                    //刷新页面
                        poiList.clear();
                        poiList.add(currentPoiInfo);
                        poiList.addAll(reverseGeoCodeResult.getPoiList());
                        poiAdapter.setNewData(poiList);
                    }
                }
            });        poiAdapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
                    click(position);
                }
            });
        }    @Override
        public void initData() {
            //定位
            initLocationClient();
            setLocationConfig();        //map可以设置三种地图类型,以及路况,这里忽略        setMapConfig();
            //开启地图定位图层
            map.setMyLocationEnabled(true);        //中心坐标
            centerPoint = map.getMapStatus().targetScreen;
            locationClient.start();//开始定位
        }    @Override
        public void onResume() {
            mapView.onResume();
            super.onResume();
        }    @Override
        public void onPause() {
            mapView.onPause();
            super.onPause();    }    @Override
        public void onDestroy() {
            locationClient.stop();
            mapView.onDestroy();
            geoCoder.destroy();
            super.onDestroy();
        }    private void setMapConfig() {
            MyLocationConfiguration config = new MyLocationConfiguration(
                    MyLocationConfiguration.LocationMode.FOLLOWING, false,
                    null, 0xAAFFFF88, 0xAA00FF00
            );
            map.setMyLocationConfiguration(config);
            MapStatus.Builder builder = new MapStatus.Builder();
            builder.zoom(18.0f);
            map.setMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
        }
        private void initLocationClient() {
            locationClient = new LocationClient(Global.mContext);
            locationClient.registerLocationListener(new BDAbstractLocationListener() {
                @Override
                public void onReceiveLocation(BDLocation bdLocation) {
                    //mapView 销毁后不在处理新接收的位置
                    if (bdLocation == null || map == null) {
                        return;
                    }                Logger.d("gxh", bdLocation.getAddrStr());
                    MyLocationData locData = new MyLocationData.Builder()
                            .accuracy(bdLocation.getRadius())
                            // 此处设置开发者获取到的方向信息,顺时针0-360
                            .direction(bdLocation.getDirection()).latitude(bdLocation.getLatitude())
                            .longitude(bdLocation.getLongitude()).build();
                    map.setMyLocationData(locData);                lantitude = bdLocation.getLatitude();
                    longtitude = bdLocation.getLongitude();                LatLng currentLatLng = new LatLng(lantitude, longtitude);                // 是否第一次定位
                    if (isFirstLoc) {
                        isFirstLoc = false;
                        // 实现动画跳转
                        MapStatusUpdate u = MapStatusUpdateFactory
                                .newLatLng(currentLatLng);
                        map.animateMapStatus(u);                    geoCoder.reverseGeoCode((new ReverseGeoCodeOption())
                                .location(currentLatLng));
                        return;
                    }
                }
            });
        }    private void setLocationConfig() {
            LocationClientOption option = new LocationClientOption();
            //定位模式:高精度、低功耗、仅用设备
            option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
            //设置返回经纬度坐标
            option.setCoorType("bd09ll");
            //设置发起定位请求的间隔
            option.setScanSpan(0);
            option.setOpenGps(true);        //需要位置信息,返回省市县街道等
            option.setIsNeedAddress(true);
            //位置描述
            option.setIsNeedLocationDescribe(true);
            //获取周边POI信息  需要联网
            option.setIsNeedLocationPoiList(true);        locationClient.setLocOption(option);
        }
        private void click(int position) {
            PoiInfo poiInfo = poiAdapter.getData().get(position);
            map.clear();        //动画跳转
            MapStatusUpdate u=MapStatusUpdateFactory.newLatLng(poiInfo.getLocation());
            map.animateMapStatus(u);        //加入覆盖物
            BitmapDescriptor selectPic= BitmapDescriptorFactory.fromResource(R.drawable.circle);
            OverlayOptions oo=new MarkerOptions().position(poiInfo.getLocation())
                    .icon(selectPic).anchor(0.5f,0.5f);
            map.addOverlay(oo);        //发起地理编码
            geoCoder.reverseGeoCode((new ReverseGeoCodeOption())
                    .location(poiInfo.getLocation()));    }
    }
      

  3.   

    onReceiveLocation  这个方法里面debug 一下,看返回什么错误信息,对照百度常见问题一下就出来了,我感觉你是真机对应的 .so没加全
      

  4.   

    我觉得你有两个问题点需求确认一下: ①:你的代码debug时,是否是正常工作状态的 , 有没有一步一步的查看代码  有无exception出现?②: 你的权限有没有动态进行申请?   现在的真机 很多都是Android 7.0 以上的了   更多的是8.0 甚至9.0的系统   这个是需要动态处理权限申请的问题的   不是原来一样  在AndroidManifest.xml 里申明一下某个权限就可以了   当然   这一步AndroidManifest.xml申明权限也不要落下