一,百度地图:
首先,建立项目,得到自己的密钥。
密钥得到方法:在c盘.android目录下启动命令窗口输入keytool -list -v-keystore debug.keystore,会得到三种指纹证书,选取SHA1类型的证书(密钥口令是android)
第一步:在百度api上按要求填入包名和密钥创建应用申请自己需要的功能
导入BaiduLBS_AndroidSDK_Lib\libs下的所有文件,关键两个必须导入:jar和armeabi。按平台把jar文件添加为library。
在suidio下需要在src/main/目录下新建jniLibs目录,拷贝armeabi文件夹,注意jar和armeabi里的so的前3位版本号必须一致,并且保证使用一次下载的文件夹中的两个文件,不能不同功能组件的jar或so交叉使用。
第二步:在AndroidManifest中添加开发密钥、所需权限等信息;
(1)在application中添加开发密钥
<application>
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="开发者 key"/>
</application>
2)添加所需权限
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permissionandroid:name="android.permission.INTERNET"/>
<uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permissionandroid:name="android.permission.GET_TASKS" />
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.WRITE_SETTINGS" />
第三步,在布局xml文件中添加地图控件;
<com.baidu.mapapi.map.MapView
android:id="@+id/bmapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
第四步,在应用程序创建时初始化 SDK引用的Context 全局变量:
public class MainActivity extends Activity {
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//在使用SDK各组件之前初始化context信息,传入ApplicationContext
//注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
}
}
注意:在SDK各功能组件使用之前都需要调用
SDKInitializer.initialize(getApplicationContext());,因此我们建议该方法放在Application的初始化方法中
第五步:在生命周期里设置地图的周期,只有pause,resume,destory三个。
简单添加标记:
LatLng cent = new LatLng(00,00); BitmapDescriptor makrbit = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka); OverlayOptions oo = new MarkerOptions().title("Location").position(cent).icon(makrbit); map.addOverlay(oo);
点击获得地图上某点的位置:
1,分为mark 和空白
2,通过Activity触摸事件:
点击屏幕显示具体的地理位置并将其标志,和移动到此处。
定位并标记位置
第一步:配置权限和设置服务:
<!-- 这个权限用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<!-- 这个权限用于访问GPS定位-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<!-- 用于访问wifi网络信息,wifi信息会用于进行网络定位-->
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<!-- 这个权限用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<!-- 用于读取手机当前的状态-->
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<!-- 写入扩展存储,向扩展卡写入数据,用于写入离线定位数据-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<!-- 访问网络,网络定位需要上网-->
<uses-permission android:name="android.permission.INTERNET"/>
<!-- SD卡读取权限,用户写入离线定位数据-->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"></uses-permission>
<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote">
<intent-filter>
<action android:name="com.baidu.location.service_v2.2">
</action>
</intent-filter>
</service>
接下来实例化有关的类:
mLocationClient =new LocationClient(getApplicationContext()); //声明LocationClient类
mLocationClient.registerLocationListener(myListener); //注册监听函数
设置定位选项和监听方法:
LocationClientOptionoption = newLocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy
);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
int span=1000;
option.setScanSpan(2000);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
option.setOpenGps(true);//可选,默认false,设置是否使用gps
option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死
option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
mLocationClient.setLocOption(option);
监听实现:
public class MyLocationListenerimplements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
//Receive Location
if(location ==null) {
return;
}
bdLocation = location;
int errcode = location.getLocType();
}
}
其中errcode返回的数字可判断地位类型和错误情况
定位周围相关位置并标记:
MyLocationData mydata = new MyLocationData.Builder() .accuracy().direction().latitude().longitude(); map.setMyLocationData(mydata); BitmapDescriptor marklocat = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka); MyLocationConfiguration configuration = new MyLocationConfiguration(MyLocationConfiguration. LocationMode.NORMAL, true,marklocat); map.setMyLocationConfigeration(configuration);
其中mydata里写入自己的要地位的位置信息。
常见错误:
1,找不到option资源,报需要读取手机权限
这是因为没有进行正确的定位权限配置
2,连接不上一直baidu be connected…
这个比较坑,试了很多方法,有的说ClientLocation的上下文
必须是Applicationtext,但试了无效,最后发现原来是配置问题,下的locsdk.so版本的问题一直不对,在官网下的也不知道什么原因。最后单独选择定位功能的sdk导入成功实现,后来下载实现全部功能的sdk也可以。
3,没有注册服务此时只能实现一次定位,requestLocation无法回调。需要根据需要进行定位是设置setScanSpan(0)。
最后虽然实现了定位,但精度很差,大家是怎么解决的。