標題: 基于Android的定位無非就兩種:network、gps。兩者各有優劣。 [打印本頁]
作者: 748213 時間: 2017-12-1 21:02
標題: 基于Android的定位無非就兩種:network、gps。兩者各有優劣。
基于Android的定位無非就兩種:network、gps。兩者各有優劣。
Network:定位快,準確度低,受環境影響小。
GPS:定位慢,準確度高,受環境影響大。
步驟
1.啟動應用的時候同時啟動一個定位服務
2.定位服務獲取到定位信息后通過廣播告知UI層(activity)
3.UI層處理顯示
在下面的的例子中,在獲取了當前的位置信息后,便停掉了的定位服務,并沒有進行實時定位,當然也可以進行實時定位。
實現代碼
定位服務(LocationSvc)代碼:
[java] view plain copy
1. package com.sc.demo.locate;
2.
3. import com.sc.demo.common.Common;
4.
5. import android.app.Service;
6. import android.content.Intent;
7. import android.location.Location;
8. import android.location.LocationListener;
9. import android.location.LocationManager;
10. import android.os.Bundle;
11. import android.os.IBinder;
12. import android.util.Log;
13. import android.widget.Toast;
14.
15. /**
16. * @author SunnyCoffee
17. * @date 2014-1-19
18. * @version 1.0
19. * @desc 定位服務
20. *
21. */
22. public class LocationSvc extends Service implements LocationListener {
23.
24. private static final String TAG = "LocationSvc";
25. private LocationManager locationManager;
26.
27. @Override
28. public IBinder onBind(Intent intent) {
29. return null;
30. }
31.
32. @Override
33. public void onCreate() {
34. locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
35. }
36.
37. @Override
38. public void onStart(Intent intent, int startId) {
39. if (locationManager.getProvider(LocationManager.NETWORK_PROVIDER) != null) locationManager
40. .requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0,
41. this);
42. else if (locationManager.getProvider(LocationManager.GPS_PROVIDER) != null) locationManager
43. .requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,
44. this);
45. else Toast.makeText(this, "無法定位", Toast.LENGTH_SHORT).show();
46. }
47.
48. @Override
49. public boolean stopService(Intent name) {
50. return super.stopService(name);
51. }
52.
53. @Override
54. public void onLocationChanged(Location location) {
55. Log.d(TAG, "Get the current position \n" + location);
56.
57. //通知Activity
58. Intent intent = new Intent();
59. intent.setAction(Common.LOCATION_ACTION);
60. intent.putExtra(Common.LOCATION, location.toString());
61. sendBroadcast(intent);
62.
63. // 如果只是需要定位一次,這里就移除監聽,停掉服務。如果要進行實時定位,可以在退出應用或者其他時刻停掉定位服務。
64. locationManager.removeUpdates(this);
65. stopSelf();
66. }
67.
68. @Override
69. public void onProviderDisabled(String provider) {
70. }
71.
72. @Override
73. public void onProviderEnabled(String provider) {
74. }
75.
76. @Override
77. public void onStatusChanged(String provider, int status, Bundle extras) {
78. }
79.
80. }
UI處理層代碼
[java] view plain copy
1. package com.sc.demo;
2.
3. import com.sc.demo.common.Common;
4. import com.sc.demo.locate.LocationSvc;
5.
6. import android.os.Bundle;
7. import android.widget.TextView;
8. import android.app.Activity;
9. import android.app.ProgressDialog;
10. import android.content.BroadcastReceiver;
11. import android.content.Context;
12. import android.content.Intent;
13. import android.content.IntentFilter;
14.
15. public class MainActivity extends Activity {
16.
17. private TextView text;
18. private ProgressDialog dialog;
19.
20. @Override
21. protected void onCreate(Bundle savedInstanceState) {
22. super.onCreate(savedInstanceState);
23. setContentView(R.layout.activity_main);
24. text = (TextView) findViewById(R.id.text);
25.
26. // 注冊廣播
27. IntentFilter filter = new IntentFilter();
28. filter.addAction(Common.LOCATION_ACTION);
29. this.registerReceiver(new LocationBroadcastReceiver(), filter);
30.
31. // 啟動服務
32. Intent intent = new Intent();
33. intent.setClass(this, LocationSvc.class);
34. startService(intent);
35.
36. // 等待提示
37. dialog = new ProgressDialog(this);
38. dialog.setMessage("正在定位...");
39. dialog.setCancelable(true);
40. dialog.show();
41. }
42.
43. private class LocationBroadcastReceiver extends BroadcastReceiver {
44.
45. @Override
46. public void onReceive(Context context, Intent intent) {
47. if (!intent.getAction().equals(Common.LOCATION_ACTION)) return;
48. String locationInfo = intent.getStringExtra(Common.LOCATION);
49. text.setText(locationInfo);
50. dialog.dismiss();
51. MainActivity.this.unregisterReceiver(this);// 不需要時注銷
52. }
53. }
54.
55. }
公共類
[java] view plain copy
1. package com.sc.demo.common;
2.
3. /**
4. * @author SunnyCoffee
5. * @date 2014-1-27
6. * @version 1.0
7. * @desc desc 公共常量
8. *
9. */
10. public class Common {
11.
12. public static final String LOCATION = "location";
13. public static final String LOCATION_ACTION = "locationAction";
14. }
代碼涉及了Android的四大組件之三--Activity、Service、BroadcastReceiver 。
Activity啟動后啟動了Service,Service是用來定位的,在Service定位結束后發送廣播到BroadcastReceiver,這里的BroadcastReceiver是作為Activity的內部類,所以并不能過AndroidManifest.xml進行注冊,所以采用了方法registerReceiver。而定位就是通過注冊監聽執行回調獲得。
項目源碼下載地址http://download.csdn.net/detail/limb99/6888499。項目編碼utf-8
注:demo只寫了簡單的功能,沒有做容錯。比如,功能實現需要有網絡和GPS支持,需要開啟“位置服務”(也有的是位置與安全,不同手機不同系統略有區別)。在資源評論里有人說定位不到,我想很可能就是沒有開啟位置相關的服務。自己做過測試通過,機型為 Sony st27i,Coolpad 5891Q,Galaxy S4 GT-i9500,虛擬機未測試。
更新2014-12-03
自己在測試的時候發現有的機型不能定位,自己手中機型較少所以無法確定具體問題。
其中一個機型Coolpad 5217,Android4.3。現在還沒有解決方案,方法慎用。
一些定位思想可以參見http://blog.csdn.net/limb99/article/details/8765584
作者: GPS模塊-HTGNSS 時間: 2018-1-1 23:09
HTGNSS不僅銷售GPS模塊,最重要是強大的技術支持。HTGNSS承諾GPS模塊終身保修
歡迎光臨 (http://www.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
五月婷婷视频
|
超碰在线人人
|
免费在线播放黄色
|
一级电影免费看
|
www.日本在线
|
欧美精品成人影院
|
久久看精品
|
男女视频在线免费观看
|
国产日韩一区二区三区
|
成人免费视频网站在线观看
|
99久久电影
|
农村黄性色生活片
|
国产黄色在线观看
|
欧美日韩在线免费观看
|
欧美日韩a|
免费视频一区
|
午夜久久久久久久久久一区二区
|
91成人免费观看
|
天天躁天天操
|
999精品视频在线观看
|
中文字幕 国产精品
|
色婷婷精品
|
超碰8|
黄网在线观看
|
丁香婷婷在线视频
|
亚洲精品乱码久久久久久9色
|
欧美精品综合
|
亚洲精品白浆高清久久久久久
|
97超碰人人草
|
九色av
|
在线免费观看毛片
|
国产日韩精品视频
|
亚洲国产精品久久久久久
|
国产农村妇女毛片精品久久麻豆
|
亚洲视频免费在线观看
|
9191av|
精品免费国产
|
日本欧美黄色片
|
亚洲国产成人在线视频
|
56pao在线|
久久婷婷香蕉热狠狠综合
|