一、问题描述
LBS位置服务是android应用中重要的功能,应用越来越广泛,下面我们逐步学习和实现lbs相关的应用如定位、地图、导航等,首先我们看如何基于百度地图实现定位功能
二、配置环境
1、注册密钥:地址http://developer.baidu.com/map/
2、下载定位SDK,并导入SDK如图所示:
三、编写MyApplication类
编写MyApplication类,为了使用方便我们可以将实现定位的方法封装的Application组件中
封装下列方法
1、 获取定位信息——requestLocationInfo()
2、 通过广播发送位置信息——sendBroadCast()
3、 停止定位——stopLocationClient()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
public class MyApplication extends Application{ public LocationClient mLocationClient = null ; public GeofenceClient mGeofenceClient; public MyLocationListenner myListener = new MyLocationListenner(); public static String TAG = "MyApplication" ; private static MyApplication mInstance = null ; @Override public void onCreate(){ mInstance = this ; mLocationClient = new LocationClient( this ); /** * 项目的key,自己到官网申请 http://lbsyun.baidu.com/apiconsole/key */ mLocationClient.setAK( "你的应用Key" ); mLocationClient.registerLocationListener(myListener); mGeofenceClient = new GeofenceClient( this ); super .onCreate(); Log.d(TAG, "... Application onCreate... pid=" + Process.myPid()); } public static MyApplication getInstance(){ return mInstance; } /** * 停止定位 */ public void stopLocationClient(){ if (mLocationClient != null && mLocationClient.isStarted()){ mLocationClient.stop(); } } /** * 发起定位 */ public void requestLocationInfo(){ setLocationOption(); if (mLocationClient != null && !mLocationClient.isStarted()){ mLocationClient.start(); } if (mLocationClient != null && mLocationClient.isStarted()){ mLocationClient.requestLocation(); } } /** * 设置百度地图的相关参数 */ private void setLocationOption(){ LocationClientOption option = new LocationClientOption(); option.setOpenGps( true ); // 打开gps option.setCoorType( "bd09ll" ); // 设置坐标类型 option.setServiceName( "com.baidu.location.service_v2.9" ); option.setPoiExtraInfo( true ); option.setAddrType( "all" ); option.setPoiNumber( 10 ); option.disableCache( true ); mLocationClient.setLocOption(option); } /** * 监听函数,有更新位置的时候,格式化成字符串,输出到屏幕中 */ public class MyLocationListenner implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location){ if (location == null ){ sendBroadCast( "定位失败!" ); return ; } sendBroadCast(location.getAddrStr()); } public void onReceivePoi(BDLocation poiLocation){ if (poiLocation == null ){ sendBroadCast( "定位失败!" ); return ; } sendBroadCast(poiLocation.getAddrStr()); } } /** * 得到发送广播 * @param address */ public void sendBroadCast(String address){ stopLocationClient(); Intent intent = new Intent(MainActivity.LOCATION_BCR); intent.putExtra( "address" , address); sendBroadcast(intent); } } |
三、 主程序MainActivity
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
public class MainActivity extends Activity{ public static String TAG = "LocTestDemo" ; private BroadcastReceiver broadcastReceiver; public static String LOCATION_BCR = "location_bcr" ; private Button locBtn; private TextView locInfo; private MyApplication application; @Override protected void onCreate(Bundle savedInstanceState){ super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); application=(MyApplication) super .getApplication(); initialize(); initializeViews(); initializeListeners(); } private void initialize(){ registerBroadCastReceiver(); //注册广播 } private void initializeViews() { locBtn = (Button) findViewById(R.id.location); locInfo = (TextView) findViewById(R.id.location_info); } private void initializeListeners() { locBtn.setOnClickListener( new OnClickListener(){ @Override public void onClick(View v){ locInfo.setText( "定位中..." ); //调用请求定位信息 application.requestLocationInfo(); } }); } /** * 注册一个广播,监听定位结果,接受广播获得地址信息 */ private void registerBroadCastReceiver() { broadcastReceiver = new BroadcastReceiver(){ public void onReceive(Context context, Intent intent){ String address = intent.getStringExtra( "address" ); locInfo.setText(address); } }; IntentFilter intentToReceiveFilter = new IntentFilter(); intentToReceiveFilter.addAction(LOCATION_BCR); registerReceiver(broadcastReceiver, intentToReceiveFilter); } @Override protected void onDestroy(){ super .onDestroy(); unregisterReceiver(broadcastReceiver); } } |
四、 AndroidManifest.xml配置信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
<?xml version= "1.0" encoding= "utf-8" ?> <manifest xmlns:android= "http://schemas.android.com/apk/res/android" package = "com.jereh.baidulocation" android:versionCode= "1" android:versionName= "1.0" > <uses-sdk android:minSdkVersion= "8" android:targetSdkVersion= "17" /> <application android:name= "com.jereh.baidulocation.MyApplication" android:allowBackup= "true" android:icon= "@drawable/ic_launcher" android:label= "@string/app_name" android:theme= "@style/AppTheme" > <activity android:name= "com.jereh.baidulocation.MainActivity" android:label= "@string/app_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" > <intent-filter> <action android:name= "com.baidu.location.service_v2.2" > </action> </intent-filter> </service> </application> <uses-permission android:name= "android.permission.ACCESS_COARSE_LOCATION" > </uses-permission> <uses-permission android:name= "android.permission.ACCESS_FINE_LOCATION" > </uses-permission> <uses-permission android:name= "android.permission.ACCESS_WIFI_STATE" > </uses-permission> <uses-permission android:name= "android.permission.ACCESS_NETWORK_STATE" > </uses-permission> <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" /> <uses-permission android:name= "android.permission.MOUNT_UNMOUNT_FILESYSTEMS" > </uses-permission> <uses-permission android:name= "android.permission.READ_LOGS" > </uses-permission> <uses-permission android:name= "android.permission.VIBRATE" /> <uses-permission android:name= "android.permission.WAKE_LOCK" /> <uses-permission android:name= "android.permission.WRITE_SETTINGS" /> </manifest> |