- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Android获取当前位置的经纬度数据由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
现在有这么一个需求:开启一个service服务,获取当前位置的经纬度数据,将获取的数据以广播的方式发送出去,注册广播的activity接收广播信息,并将接收到的数据在当前activity显示,如果当前位置发生变化,经纬度数据改变,获取改变后的经纬度数据,通过handler发送消息,更新ui界面,显示更新后的内容,请问这样子的demo该如何实现?
locationtool获取当前位置信息 。
android手机获取当前位置的方式:gps定位,wifi定位,基站定位,当前demo使用gps卫星定位,在locationtool中返回location、locationmanager两者对象,通过location提供的getlatitude()、getlongitude()读取经纬度数据,同时添加位置改变监听器mylocationlistener,具体代码如下:
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
package
cn.teachcourse.utils;
import
android.app.activity;
import
android.content.context;
import
android.content.intent;
import
android.location.criteria;
import
android.location.location;
import
android.location.locationlistener;
import
android.location.locationmanager;
import
android.os.bundle;
import
android.provider.settings;
import
android.widget.toast;
/*
@author postmaster@teachcourse.cn
@date 创建于:2016-1-22
*/
public
class
locationtool {
public
location getlocation() {
return
mlocation;
}
public
void
setlocation(location location) {
this
.mlocation = location;
}
private
context context;
private
location mlocation;
private
locationmanager mlocationmanager;
public
locationtool(context context) {
super
();
mlocationmanager = (locationmanager) context
.getsystemservice(context.location_service);
mlocation = mlocationmanager.getlastknownlocation(getprovider());
mlocationmanager.requestlocationupdates(locationmanager.gps_provider,
2000
,
10
,
new
mylocationlistener(
this
));
}
// 获取location provider
private
string getprovider() {
// 构建位置查询条件
criteria criteria =
new
criteria();
// 查询精度:高
criteria.setaccuracy(criteria.accuracy_fine);
// 是否查询海拨:否
criteria.setaltituderequired(
false
);
// 是否查询方位角 : 否
criteria.setbearingrequired(
false
);
// 是否允许付费:是
criteria.setcostallowed(
true
);
// 电量要求:低
criteria.setpowerrequirement(criteria.power_low);
// 返回最合适的符合条件的provider,第2个参数为true说明 , 如果只有一个provider是有效的,则返回当前provider
return
mlocationmanager.getbestprovider(criteria,
true
);
}
public
locationmanager getlocationmanager() {
return
mlocationmanager;
}
private
locationlistener mlocationlistener =
new
locationlistener() {
@override
public
void
onstatuschanged(string provider,
int
status, bundle extras) {
// todo auto-generated method stub
}
@override
public
void
onproviderenabled(string provider) {
location l = mlocationmanager.getlastknownlocation(provider);
if
(l !=
null
) {
mlocation = l;
}
}
@override
public
void
onproviderdisabled(string provider) {
mlocation =
null
;
}
@override
public
void
onlocationchanged(location location) {
if
(location !=
null
) {
mlocation = location;
}
}
};
public
void
closelocation() {
if
(mlocationmanager !=
null
) {
if
(mlocationmanager !=
null
) {
mlocationmanager.removeupdates(mlocationlistener);
mlocationlistener =
null
;
}
mlocationmanager =
null
;
}
}
}
|
mylocationlistener位置改变监听器 。
locationmanager对象调用requestlocationupdates(string provider, long mintime, float mindistance,locationlistener listener),在回调的方法中获取改变后的location对象,其中provider表示locationmanager.gps_provider,mintime表示最短时间间隔内更新位置信息(单位毫秒),mindistance表示最短距离内更新位置信息(单位米),mylocationlistener继承locationlistener,需要重写的方法如下:
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
|
package
cn.teachcourse.utils;
import
android.location.location;
import
android.location.locationlistener;
import
android.os.bundle;
/*
@author postmaster@teachcourse.cn
@date 创建于:2016-1-22
*/
public class mylocationlistener implements locationlistener {
private locationtool gpstool;
/**构造方法,传入locationtool
* @param gpstool
*/
public mylocationlistener(locationtool gpstool) {
super();
this.gpstool = gpstool;
}
/**
* 当前位置改变后,回调onlocationchanged方法,获取改变后的location对象
*
*/
@override
public void onlocationchanged(location location) {
if (location != null) {
gpstool.setlocation(location);
}
}
/**
* 当provider状态改变时回调的方法,当前的provider无法读取位置信息或者provider从无法读取位置信息变为能够读取为信息被回调的方法
*
*/
@override
public void onstatuschanged(string provider, int status, bundle extras) {
// todo auto-generated method stub
}
/**
* 当provider被用户允许开启,回调的onproviderenabled方法,比如:开启定位功能,回调该方法
*
*/
@override
public void onproviderenabled(string provider) {
location l = gpstool.getlocationmanager()
.getlastknownlocation(provider);
if (l != null) {
gpstool.setlocation(l);
}
}
/**
* 当provider不被用户允许开启,回调的onproviderdisabled方法,比如:无法开启定位功能,回调该方法
*
*/
@override
public
void
onproviderdisabled(string provider) {
gpstool.setlocation(
null
);
}
}
|
locationservice服务读取位置信息 。
为什么要开启service呢?service和activity、fragment一样也有自己的生命周期,oncreate——>onstartcommand(onstart)——>onunbind——>onrebind——>ondestroy,在locationservice执行的操作是启动一个线程获取更新后的位置信息,并以广播的方式发送出去,具体代码如下:
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
|
package
cn.teachcourse.utils;
import
android.app.activity;
import
android.app.service;
import
android.content.context;
import
android.content.intent;
import
android.location.location;
import
android.location.locationmanager;
import
android.os.ibinder;
import
android.provider.settings;
import
android.widget.toast;
/*
@author postmaster@teachcourse.cn
@date 创建于:2016-1-22
*/
public
class
locationservice
extends
service {
private
locationtool mgpstool =
null
;
private
boolean
threaddisable =
false
;
private
final
static
string tag = locationservice.
class
.getsimplename();
@override
public
void
oncreate() {
// todo auto-generated method stub
super
.oncreate();
mgpstool =
new
locationtool(
this
);
startthread();
}
private
void
startthread() {
new
thread(
new
runnable() {
@override
public
void
run() {
while
(!threaddisable) {
try
{
thread.sleep(
1000
);
}
catch
(interruptedexception e) {
e.printstacktrace();
}
if
(mgpstool !=
null
) {
// 当结束服务时gps为空
// 获取经纬度
location location = mgpstool.getlocation();
// 发送广播
intent intent =
new
intent();
intent.putextra(
"lat"
,
location ==
null
?
""
: location.getlatitude()
+
""
);
intent.putextra(
"lon"
,
location ==
null
?
""
: location.getlongitude()
+
""
);
intent.setaction(
"cn.teachcourse.utils.gpsservice"
);
sendbroadcast(intent);
}
}
}
}).start();
}
@override
public
void
ondestroy() {
super
.ondestroy();
threaddisable =
true
;
if
(mgpstool !=
null
) {
mgpstool.closelocation();
mgpstool =
null
;
}
}
@override
public
ibinder onbind(intent intent) {
return
null
;
}
}
|
mainactivity启动服务、注册广播、显示位置信息 。
在mainactivity需要做的事情有:第一启动locationservice服务,调用startservice()方法;第二注册广播接收器(broadcastreceiver),创建了一个内部类mybroadcastreceiver,继承broadcastreceiver,重写onreceive方法;第三获取经纬度数据,更新ui界面,显示当前位置信息,具体代码如下:
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
|
//启动服务
startservice(
new
intent(
this
, locationservice.
class
));
//注册广播
private
class
myreceiver
extends
broadcastreceiver {
@override
public
void
onreceive(context context, intent intent) {
bundle bundle = intent.getextras();
string lon = bundle.getstring(
"lon"
);
string lat = bundle.getstring(
"lat"
);
if
(!textutils.isempty(lon) && !textutils.isempty(lat)) {
mlatitude = lat;
mlongitude = lon;
isobtainloc =
true
;
new
thread(
new
runnable() {
@override
public
void
run() {
message msg =
new
message();
msg.what = refresh_ui;
// 发送消息,通知刷新界面
mhandler.sendmessage(msg);
}
}).start();
}
}
}
//更新ui界面
private
handler mhandler =
new
handler() {
@override
public
void
handlemessage(message msg) {
// todo auto-generated method stub
super
.handlemessage(msg);
switch
(msg.what) {
case
refresh_ui:
refreshui();
break
;
default
:
break
;
}
}
};
private
void
refreshui() {
if
(isobtainloc) {
mtextview.settext(
"目前经纬度\n经度:"
+ mlongitude +
"\n纬度:"
+ mlatitude);
mdialog.dismiss();
}
}
|
以上就是本文的全部内容,希望对大家学习android软件编程有所帮助.
最后此篇关于Android获取当前位置的经纬度数据的文章就讲到这里了,如果你想了解更多关于Android获取当前位置的经纬度数据的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我试图通过这段代码读取未知数量的整数: while (1) { int c = getchar (); if (c == EOF) break;
我正试图找到一个类似于谷歌分析日期选择器的日期选择器: 知道 jQuery 是否提供了类似的东西吗? 最佳答案 这个 Twitter Bootstrap 风格的日期范围选择器非常接近。 https:/
我正在使用 javascript。如何获取当前 URL 的路径并将其分配给我的代码?这是我的代码: $(document).ready(function() { $(".share").hides
如何获得今天的Julian day number (JDN)相等的?或任何日期? 我看了又看,但只发现了一些产生“year-dayOfYear”的函数,而不是:2457854。 最佳答案 在 bash
我有相当简单的 UDP 服务器写在 c 上。 有时我需要知道在套接字中排队的所有 udp 数据包(字节)的当前长度。 据我了解,getsockopt 没有得到这样的信息。 欢迎使用 Linux 和 F
我一直在寻找几个小时来找到一个可以在图像中添加诸如“填充:5px”之类的东西的插件。每个人都通过纯 html 做到这一点吗?我们的客户需要一种方法来简单地使用按钮或右键单击上下文菜单来添加它。有什么建
是否有可能获得当前正在执行的 TCL 脚本的完整路径? 在 PHP 中,它将是:__FILE__ 最佳答案 根据“当前正在执行的 TCL 脚本”的含义,您实际上可能会寻找 info script ,甚
我最近从直接使用 ISession 转向了包装的 ISession,即工作单元类型模式。 我曾经使用 SQL Lite(内存中)对此进行测试。我有一个简单的帮助器类,它配置我的 SessionFact
我按照步骤操作 here在 WebStorm 中配置代码完成和其他内容,但我仍然收到以下语法错误。 我该如何解决这个问题? 最佳答案 通过相应地将“JavaScript 语言版本”(Settings/
我可以为我团队的 TFS 当前 Sprint 任务板添加书签吗?我们有两周的冲刺,因此 URL 每两周更改一次。 默认 URL 的形式为: http://[Server]/tfs/[Project]/
是否有 Subversion 命令可以显示当前版本号? 在svn checkout之后,我想启动一个脚本并需要变量中的修订号。如果有像 svn info get_revision_number 这样的
我正在编写表单的一个组件 首次安装组件时,sources={{}} ,一本空字典。由于该组件包装了现有的 Javascript 库,因此我正在实现一个自定义比较函数。为了让这个 diffing 函数
无论系统时间设置为多少以及机器所在的时区,我都需要正确的 UTC 时间。 (即使我必须打电话到互联网才能同步......) 是否有一些库或其他方法可以优雅地做到这一点? 最佳答案 如果您想获得准确可靠
我一边编码,一边拿出一些我和 friend 建立的旧网站来重新开始工作。我已经有一段时间没有做过任何 AJAX 了,当我试图找出我的代码失败的地方时,我发现没有显示很多资源。我猜这是因为我使用的是旧方
由于对性能的巨大影响,我从不怀疑我现在的桌面CPU是否有分支预测。当然可以。但各种 ARM 产品又如何呢? iPhone或Android手机有分支预测吗?较旧的任天堂 DS?基于 PowerPC 的
我有一个具有以下有效负载的 JWT: { "id": "394a71988caa6cc30601e43f5b6569d52cd7f6df", "jti": "394a71988caa6cc30
从其他一些帖子中,我能够通过以下方式获取当前 URI: 但是以下方法不起作用: 我很好奇为什么上面的方法不起作用,以及如何将当前 URI 分配给字符串。 最佳答案 每the javadocs ,g
我在表格 View 中有几个单元格。现在在任何给定的时间点,我想计算 View 中单元格的当前高度,即如果它是 View 的 3/4,它应该返回 (cellheight)*3/4 高度。 我通过以下方
这是网站的身份验证脚本。这安全吗?是最近的节目吗?它已经过时了吗?是否有“更好更安全的方法”我很新,但我没有看到太多地方使用 header 授权。 如有任何帮助,我们将不胜感激!这是我制作的第一个登录
我已经在其他 stackoverflow 线程上检查过这个错误,但在我的代码中没有发现任何错误。也许我累了,但我觉得还好。 网站.urls.py: from django.conf.urls impo
我是一名优秀的程序员,十分优秀!