关于百度地图的开发,百度地图API有很详细的开发资料,所以本篇文章不在于写开发技术,而在于开发步骤
我们想要开发百度地图,那么首先需要导入库文件(这些库文件可以从这里下载)
将liblocSDK4d.so文件拷贝到libs/armeabi目录下。
将locSDK4.2.jar文件拷贝到工程的libs目录下。
在工程属性->Java Build Path->Libraries中选择“AddJARs”,
选定locSDK4.2.jar,确定后返回。这样您就可以在程序中使用百度定位SDK了。
在application标签中声明service组件,每个app拥有自己单独的定位service
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
<permission android:name="android.permission.BAIDU_LOCATION_SERVICE" > </permission> <uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" > </uses-permission> <uses-permission android:name="android.permission.INTERNET" > </uses-permission> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" > </uses-permission> <!-- <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission> --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" > </uses-permission> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.WAKE_LOCK" > </uses-permission> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.ACCESS_GPS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.CALL_PHONE" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? --> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.CAMERA" > </uses-permission> <uses-permission android:name="android.permission.RECORD_AUDIO" > </uses-permission> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" > </uses-permission> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <!-- 来电消音 --> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" > </uses-permission> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <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.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
使用SDK4.2需要在Mainfest.xml设置Accesskey,设置有误会引起定位和地理围栏服务不能正常使用,必须进行Accesskey的正确设置。
设置AccessKey,在application标签中加入备注:value = "key"的key是开发者申请的key,关于Key的申请参考开发者key
<meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="key" />
import com.baidu.mapapi.SDKInitializer; import android.app.Application; public class DemoApplication extends Application { @Override public void onCreate() { super.onCreate(); // 在使用 SDK 各组间之前初始化 context 信息,传入 ApplicationContext SDKInitializer.initialize(this); } }同时在Mainfest.xml的Application加入如下一行
android:name="com.phonemap.DemoApplication"
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </LinearLayout>
import java.util.Timer; import java.util.TimerTask; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.CircleOptions; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.map.Stroke; import com.baidu.mapapi.map.TextOptions; import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener; import com.baidu.mapapi.model.LatLng; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.widget.Toast; public class MainActivity extends Activity { private MapView mMapView; // 定位相关 LocationClient mLocClient; public MyLocationListenner myListener = new MyLocationListenner(); BaiduMap mBaiduMap; boolean isFirstLoc = true;// 是否首次定位 private Marker mMarker; BitmapDescriptor bd = BitmapDescriptorFactory .fromResource(R.drawable.icon_gcoding); BitmapDescriptor bdGround = BitmapDescriptorFactory .fromResource(R.drawable.ground_overlay); public final double tbox_latitude = 30.57; public final double tbox_longitude = 114.02; static final int REFRESH = 0; //定时器设置 Timer timer = new Timer(); TimerTask task = new TimerTask() { @Override public void run() { Message message = new Message(); message.what = REFRESH; handler.sendMessage(message); } }; Handler handler = new Handler() { public void handleMessage(Message msg) { switch (msg.what) { case REFRESH: RefreshData(); break; default: break; } } }; public Thread myThread = new Thread(new Runnable() { @Override public void run() {} }); public void RefreshData() {} @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 //SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.tbox_location); // 初始化地图 mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); // 开启定位图层 mBaiduMap.setMyLocationEnabled(true); // 定位初始化 mLocClient = new LocationClient(this); mLocClient.registerLocationListener(myListener); LocationClientOption option = new LocationClientOption(); option.setOpenGps(true);// 打开gps option.setCoorType("bd09ll"); // 设置坐标类型 //国测局经纬度坐标系gcj02、百度墨卡托坐标系bd09、 百度经纬度坐标系bd09ll option.setScanSpan(1000); mLocClient.setLocOption(option); mLocClient.start(); mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() { public boolean onMarkerClick(final Marker marker) { if (marker == mMarker) { Toast.makeText(TboxActivity.this, "TBOX位置信息", Toast.LENGTH_LONG).show(); } return true; } }); //开启定时器 timer.schedule(task,1000,1000); //开启线程 myThread.start(); } /** * 定位SDK监听函数 */ public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { // map view 销毁后不在处理新接收的位置 if (location == null || mMapView == null) return; MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(100).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); if (isFirstLoc) { isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); } } public void onReceivePoi(BDLocation poiLocation) { } } @Override protected void onPause() { super.onPause(); // activity 暂停时同时暂停地图控件 mMapView.onPause(); } @Override protected void onResume() { super.onResume(); // activity 恢复时同时恢复地图控件 mMapView.onResume(); } @Override protected void onDestroy() { super.onDestroy(); // 退出时销毁定位 mLocClient.stop(); // 关闭定位图层 mBaiduMap.setMyLocationEnabled(false); mMapView.onDestroy(); mMapView = null; } }
ok,这样一个简单的定位功能就做好了。