Android开发之android_gps定位服务简单实现
前言
gps定位服务的学习是这段时间gps课程的学习内容,之前老师一直在将概念,今天终于是实践课(其实就是给了一个案例,让自己照着敲).不过在照着案列敲了两遍之后,发现老师的案例是在是太老了,并且直接照着案例敲,也无法理解其中很多类,方法的作用.
于是自己在网上查看了其他实现的方法,并尝试敲案列,期间的挫折一言难尽.
(网上找的案例也并不信息,使得我在给予权限,和权限检查方面一直报错,因为我使用的是最新的as和java11,在经过数遍从基础理解到实例编写的过程和不知多少遍google之后,终于完成了这次练习)
•总结起来:
◦还是发现自己有不少的问题,在代码的理解能力上经过了这段时间的学习确实有些长进,但在较复杂的语句上面,理解还是有不小的困难.
◦其次,在没有事先了解学习某些类之前,是真的不适合直接照案例敲和学习(没有十分详细注释的案例,通常情况下都是如此),其效率实在低下,且很多时候会不知所云.
(个人并不提倡照着敲,敲的多了自然就懂了的学习说法,或许它只是针对于懒的人,亦或许这种说法其实只是一个劝诫我们勤奋努力,多实践的比喻.).
--------------------------------------------------------------------------------
•源代码 ◦activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <linearlayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".mainactivity" android:orientation="vertical" > <textview android:id="@+id/tv_show" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dp" android:textsize="22dp" android:textstyle="bold" /> </linearlayout>
•mainactivity.java
package cn.gemuxiaoshe.gpsapplication20; import android.manifest; import android.content.context; import android.content.intent; import android.content.pm.packagemanager; import android.location.location; import android.location.locationlistener; import android.location.locationmanager; import android.provider.settings; import android.support.v4.app.activitycompat; import android.support.v7.app.appcompatactivity; import android.os.bundle; import android.widget.textview; import android.widget.toast; import java.util.date; public class mainactivity extends appcompatactivity { private locationmanager lm; private textview tv_show; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); tv_show = (textview) findviewbyid(r.id.tv_show); lm = (locationmanager) getsystemservice(context.location_service); if (!isgpsable(lm)) { toast.maketext(mainactivity.this, "请打开gps!", toast.length_short).show(); opengps(); } // 从gps获取最近的定位信息 if (activitycompat.checkselfpermission(this, manifest.permission.access_fine_location) != packagemanager.permission_granted && activitycompat.checkselfpermission(this, manifest.permission.access_coarse_location) != packagemanager.permission_granted) { return; } location lc = lm.getlastknownlocation(locationmanager.gps_provider); updateshow(lc); //设置间隔两秒获得一次gps定位信息 lm.requestlocationupdates(locationmanager.gps_provider, 2000, 8, new locationlistener() { @override public void onlocationchanged(location location) { // 当gps定位信息发生改变时,更新定位 updateshow(location); } @override public void onstatuschanged(string s, int i, bundle bundle) { } @override public void onproviderenabled(string provider) { // 当gpslocationprovider可用时,更新定位 if (activitycompat.checkselfpermission(mainactivity.this, manifest.permission.access_fine_location) != packagemanager.permission_granted && activitycompat.checkselfpermission(mainactivity.this, manifest.permission.access_coarse_location) != packagemanager.permission_granted) { return; } updateshow(lm.getlastknownlocation(provider)); } @override public void onproviderdisabled(string s) { updateshow(null); } }); } // 定义更新显示的方法 private void updateshow(location location){ if (location!=null){ stringbuilder sb =new stringbuilder(); sb.append("当前gps位置定位信息:\n"); sb.append("经度:"+location.getlongitude()+"\n"); sb.append("维度:"+location.getlatitude()+"\n"); sb.append("海拔:"+location.getaltitude()+"\n"); sb.append("速度:"+location.getspeed()+"\n"); sb.append("方位:"+location.getbearing()+"\n"); sb.append("时间:"+location.gettime()+"\n"); sb.append("定位精度:"+location.getlongitude()+"\n"); tv_show.settext(sb.tostring()); }else tv_show.settext(""); } private boolean isgpsable(locationmanager lm) { return lm.isproviderenabled(locationmanager.gps_provider)?true:false; } // 打开设置界面让用户自己设置 private void opengps(){ intent intent = new intent(settings.action_locale_settings); startactivityforresult(intent,0); } }
需要注意到的是:
•我屡次报错的原因:
“从android 6.0(api级别23)开始,用户在应用程序运行时向应用程序授予权限,而不是在安装应用程序时授予权限。” 在这种情况下,“access_fine_location”是一个“危险权限,因此,你会得到这个'java.lang.securityexception:”gps“位置提供者需要access_fine_location权限。” 错误.
•解决方法:
if (activitycompat.checkselfpermission(this, manifest.permission.access_fine_location) != packagemanager.permission_granted && activitycompat.checkselfpermission(this, manifest.permission.access_coarse_location) != packagemanager.permission_granted) { return; }
•关于该问题的详细说明请参看:
在运行时请求权限
•演示
•这里需要注意的是:
如果你是在模拟器上测试程序时,请手动打开应用的权限设置,并给予程序获取定位信息的权限.否则模拟器是不会有提示的,你只会获得下面这样的一段崩溃记录...
就记录到这里了,关于gps定位服务的详细学习在之后会单独出笔记记录,今天是就照案列敲的一次练习,并简记一下从中学到的的一些东西.并深刻体会下这种坑爹的学习方式.
总结
以上所述是小编给大家介绍的android开发之android_gps定位服务简单实现,希望对大家有所帮助