忙了2天,终于在今天凌晨弄完了第一版,紧接着早上运动完赶紧把第二版给干了出来,百度地图版本更新后,有些地方做了些改动,官网的教程还是依旧的有点小坑爹,代码若隐若现,好吧,可能是我还看不懂吧。下面直接分享代码和流程了,欢迎指正交流分享:
先需要去官网获取一个ak,每个应用都需要有自己的一个独立的ak(不同应用的包名不同)具体如图
好了,ak获取到了,之后就是开始创建工程了,这里注意,工程的包名就是刚刚定义的,入com.example.ditu这类
打开eclipse(安卓版的,网上可以下)
新建工程,最普通的helloworld就可以了,然后根据下载官方的地图包,导入到工程,这个百度更新后写得很详细,这里不多写了,下面首先配置清单文件
下面是 布局文件 :
activity_main :
最后是主文件
MainActivity :
以上就是关键代码,源代码还存在这样几个细节问题:
1. 导入的百度SDK包为最完整的包,很多API用不到,其实可以不用导入,为了省事我每次都是直接拷进去的,这样做的后果就是每次编译都贼慢,最后导出的apk文件足足5.06MB(不导入所有的包 估计才3MB左右)。
2. 关于继承application还是activity的问题,还有是否第一个玩意儿是否唯一的问题,一直没搞明白,看了好久各类代码,还是晕。。。
3.界面略单调,这个问题一直存在于没有审美的我身上,只能靠图标来美化了。
4.全部写完后才发现这么一个问题,能不能直接通过Android的系统自带的webView控件直接访问手机版的百度定位网页,因为之前试过,UC浏览器上测试成功,不知道哪种用户体验比较好了。(前者的话,可以导入离线地图包,省流量吧,后者,可能对于开发而言更方便)
5.本应用只在 小米2A 三星gti9308 上测试过,运行顺利,在wifi环境下无卡顿,GPRS下,呵呵,流量不够了,不测试了。(如果是用卫星图的话,流量更大,默认的地图流量最省,不过卫星图比较好看,默认的比较。。简洁)。不知道其他环境运行结果如何了,还有待测试。虚拟机下运行不报错,但是可能因为无GPS硬件吧,地图显示不出
最后,附上源码链接链接:
http://pan.baidu.com/s/1qWuL9Be 密码:agwc
有好的想法或者技术希望可以分享交流,藏着掖着没啥意思。
先需要去官网获取一个ak,每个应用都需要有自己的一个独立的ak(不同应用的包名不同)具体如图
好了,ak获取到了,之后就是开始创建工程了,这里注意,工程的包名就是刚刚定义的,入com.example.ditu这类
打开eclipse(安卓版的,网上可以下)
新建工程,最普通的helloworld就可以了,然后根据下载官方的地图包,导入到工程,这个百度更新后写得很详细,这里不多写了,下面首先配置清单文件
AndroidManifest.xml :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.seriousofjj.dwxxcs"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
//权限可能有重复,无所谓的
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 这个权限用于进行网络定位 -->
<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>
<!-- 允许应用读取低级别的系统日志文件 -->
<uses-permission android:name="android.permission.READ_LOGS" >
</uses-permission>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="i01OGmgVF4LfGlmv90FtlVVs" />
<activity
android:name="com.seriousofjj.dwxxcs.MainActivity"
android:label="@string/activity_name" >
<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>
下面是 布局文件 :
activity_main :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<!-- 添加地图控件 -->
<com.baidu.mapapi.map.MapView
android:id="@+id/mapView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:clickable="true" />
</LinearLayout>
</LinearLayout>
最后是主文件
MainActivity :
package com.seriousofjj.dwxxcs;
import android.os.Bundle;
import android.app.Activity;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
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.BitmapDescriptor;
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;
/**
* author H.U.C Snake
*/
public class MainActivity extends Activity {
public MapView mapView = null;
public BaiduMap baiduMap = null;
// 定位相关声明
public LocationClient locationClient = null;
//自定义图标
BitmapDescriptor mCurrentMarker = null;
boolean isFirstLoc = true;// 是否首次定位,这简直了,是定位的关键代码,百度官方教程中竟然木有,竟然隐藏在AIP开发文档中,隐藏你妹啊,最后还是在大神的提醒下弄出来了
//下面是监听器,和之前版本一样,直接顺手复制了
public BDLocationListener myListener = new BDLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
// map view 销毁后不在处理新接收的位置
if (location == null || mapView == null)
return;
//这段是定位的观景代码,木有不行 ,记不住了,拿去直接复制吧
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
baiduMap.setMyLocationData(locData); //设置定位数据
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll, 16); //设置地图中心点以及缩放级别
baiduMap.animateMapStatus(u);
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 在使用SDK各组件之前初始化context信息,传入ApplicationContext
// 注意该方法要再setContentView方法之前实现
SDKInitializer.initialize(getApplicationContext());//注意,这条和老版本的不太一样,是新出来的,需要设置,之前V3.0.0之前版本是在oncreate()中定义ak的,现在是在清单文件定义,方便了哦
setContentView(R.layout.activity_main);
mapView = (MapView) this.findViewById(R.id.mapView); // 获取地图控件引用,常规手段。。
baiduMap = mapView.getMap();
//开启定位图层
baiduMap.setMyLocationEnabled(true);
locationClient = new LocationClient(getApplicationContext()); // 实例化LocationClient类
locationClient.registerLocationListener(myListener); // 注册监听函数
this.setLocationOption(); //设置定位参数
locationClient.start(); // 开始定位
//如果需要地图炫一点,可以用以下代码,不过相对来说比较耗流量
// baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); // 设置为一般地图
// baiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE); //设置为卫星地图
// baiduMap.setTrafficEnabled(true); //开启交通图
}
// 三个状态实现地图生命周期管理,从官网拿来改造过,增加了定位模块的生命周期的销毁方法
@Override
protected void onDestroy() {
//退出时销毁定位
locationClient.stop();
baiduMap.setMyLocationEnabled(false);
// TODO Auto-generated method stub
super.onDestroy();
mapView.onDestroy();
mapView = null;
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
mapView.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
mapView.onPause();
}
/**
* 设置定位参数
*/
private void setLocationOption() {
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开GPS
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);// 设置定位模式
option.setCoorType("bd09ll"); // 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000); // 设置发起定位请求的间隔时间为5000ms
option.setIsNeedAddress(true); // 返回的定位结果包含地址信息
option.setNeedDeviceDirect(true); // 返回的定位结果包含手机机头的方向
locationClient.setLocOption(option);//将option参数传入locationClient
}
}
以上就是关键代码,源代码还存在这样几个细节问题:
1. 导入的百度SDK包为最完整的包,很多API用不到,其实可以不用导入,为了省事我每次都是直接拷进去的,这样做的后果就是每次编译都贼慢,最后导出的apk文件足足5.06MB(不导入所有的包 估计才3MB左右)。
2. 关于继承application还是activity的问题,还有是否第一个玩意儿是否唯一的问题,一直没搞明白,看了好久各类代码,还是晕。。。
3.界面略单调,这个问题一直存在于没有审美的我身上,只能靠图标来美化了。
4.全部写完后才发现这么一个问题,能不能直接通过Android的系统自带的webView控件直接访问手机版的百度定位网页,因为之前试过,UC浏览器上测试成功,不知道哪种用户体验比较好了。(前者的话,可以导入离线地图包,省流量吧,后者,可能对于开发而言更方便)
5.本应用只在 小米2A 三星gti9308 上测试过,运行顺利,在wifi环境下无卡顿,GPRS下,呵呵,流量不够了,不测试了。(如果是用卫星图的话,流量更大,默认的地图流量最省,不过卫星图比较好看,默认的比较。。简洁)。不知道其他环境运行结果如何了,还有待测试。虚拟机下运行不报错,但是可能因为无GPS硬件吧,地图显示不出
最后,附上源码链接链接:
http://pan.baidu.com/s/1qWuL9Be 密码:agwc
有好的想法或者技术希望可以分享交流,藏着掖着没啥意思。