Android实现GPS定位代码实例
作者:junjie 发布时间:2022-07-14 17:26:21
标签:Android,GPS
通过GPS取得的是一个Location类型的经纬度, 可以转换为两个Double 纬度和经度.
纬度: 23.223871812820435
纬度: 113.58986039161628
首先创建一个TextView和两个Button
<TextView
android:id="@+id/text"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<Button
android:id="@+id/btnStart"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="定位" />
<Button
android:id="@+id/btnStop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="停止" />
然后添加主Activity的代码
Location 是存放经纬度的一个类型
LocationManager是位置管理服务类型
private Button btnStart;
private Button btnStop;
private TextView textView;
private Location mLocation;
private LocationManager mLocationManager;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnStart = (Button)findViewById(R.id.btnStart);
btnStop = (Button)findViewById(R.id.btnStop);
textView = (TextView)findViewById(R.id.text);
btnStart.setOnClickListener(btnClickListener); //开始定位
btnStop.setOnClickListener(btnClickListener); //结束定位按钮
}
gpsIsOpen是自己写的查看当前GPS是否开启
getLocation 是自己写的一个获取定位信息的方法
mLocationManager.removeUpdates()是停止当前的GPS位置监听
public Button.OnClickListener btnClickListener = new Button.OnClickListener()
{
public void onClick(View v)
{
Button btn = (Button)v;
if(btn.getId() == R.id.btnStart)
{
if(!gpsIsOpen())
return;
mLocation = getLocation();
if(mLocation != null)
textView.setText("维度:" + mLocation.getLatitude() + "\n经度:" + mLocation.getLongitude());
else
textView.setText("获取不到数据");
}
else if(btn.getId() == R.id.btnStop)
{
mLocationManager.removeUpdates(locationListener);
}
}
};
private boolean gpsIsOpen()
{
boolean bRet = true;
LocationManager alm = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
if(!alm.isProviderEnabled(LocationManager.GPS_PROVIDER))
{
Toast.makeText(this, "未开启GPS", Toast.LENGTH_SHORT).show();
bRet = false;
}
else
{
Toast.makeText(this, "GPS已开启", Toast.LENGTH_SHORT).show();
}
return bRet;
}
判断当前是否开启GPS
private boolean gpsIsOpen()
{
boolean bRet = true;
LocationManager alm = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
if(!alm.isProviderEnabled(LocationManager.GPS_PROVIDER))
{
Toast.makeText(this, "未开启GPS", Toast.LENGTH_SHORT).show();
bRet = false;
}
else
{
Toast.makeText(this, "GPS已开启", Toast.LENGTH_SHORT).show();
}
return bRet;
}
该方法获取当前的经纬度, 第一次获取总是null
后面从LocationListener获取已改变的位置
mLocationManager.requestLocationUpdates()是开启一个LocationListener等待位置变化
private Location getLocation()
{
//获取位置管理服务
mLocationManager = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);
//查找服务信息
Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE); //定位精度: 最高
criteria.setAltitudeRequired(false); //海拔信息:不需要
criteria.setBearingRequired(false); //方位信息: 不需要
criteria.setCostAllowed(true); //是否允许付费
criteria.setPowerRequirement(Criteria.POWER_LOW); //耗电量: 低功耗
String provider = mLocationManager.getBestProvider(criteria, true); //获取GPS信息
Location location = mLocationManager.getLastKnownLocation(provider);
mLocationManager.requestLocationUpdates(provider, 2000, 5, locationListener);
return location;
}
改方法是等待GPS位置改变后得到新的经纬度
private final LocationListener locationListener = new LocationListener()
{
public void onLocationChanged(Location location)
{
// TODO Auto-generated method stub
if(location != null)
textView.setText("维度:" + location.getLatitude() + "\n经度:"
+ location.getLongitude());
else
textView.setText("获取不到数据" + Integer.toString(nCount));
}
public void onProviderDisabled(String provider)
{
// TODO Auto-generated method stub
}
public void onProviderEnabled(String provider)
{
// TODO Auto-generated method stub
}
public void onStatusChanged(String provider, int status, Bundle extras)
{
// TODO Auto-generated method stub
}
};


猜你喜欢
- 前言今天遇到一个需求,需要对word模板进行替换制定的变量在网上找了很多方案,做了很多的demo,下面就把我觉得比较简单的一种分享给大家本次
- 前言回想一下,在学Java时接触的正则表达式,其实Kotlin中也是类似。只不过使用Kotlin 的语法来表达,更为简洁。正则(Regex)
- springboot @ConfigurationProperties和@PropertySource区别@ConfigurationPro
- Thread类相对于线程池中的线程,使用者有更多的控制权。该类允许创建前台线程,设置线程优先级等。Thread类的构造函数重载为接受Thre
- 本文将用两个方法来写类似汽车荷载的进度用LinearLayout的addview方法加上for循环用自定义控件的方法先上截图1. 用Line
- C#实现IDispose接口.net的GC机制有两个问题:首先GC并不能释放所有资源,它更不能释放非托管资源。其次,GC也不是实时的,所有G
- java中 String和StringBuffer的区别实例详解String: &
- 1. Java安装与环境配置Hadoop是基于Java的,所以首先需要安装配置好java环境。从官网下载JDK,我用的是1.8版本。 在Ma
- 本文实例为大家分享了利用Java实现HDFS文件上传下载的具体代码,供大家参考,具体内容如下1、pom.xml配置<!--配置--&g
- 在上篇文章给大家介绍了Mybatis中#{}和${}传参的区别及#和$的区别小结,如果大家有需要可以参考下。$和#简单说明:#相当于对数据
- 本文实例讲述了java自动生成ID号的方法。分享给大家供大家参考。具体实现方法如下:import java.util.UUID;public
- 其实我觉得最主要还是开发者对于应用的优化不够,太多的Overdraw和Layout方面的问题,Android开发者本身为了适配屏幕分辨率和解
- Android 自定义组件成JAR包的实现方法,这里对自己实现的Android View 组件进行JAR 包的处理。
- 大家好,这是 C# 9.0 新特性短系列的第 5 篇文章。弃元(Discards) 是在 C# 7.0 的时候开始支持的,它是一种人为丢弃不
- 点击按钮返回顶部,直接上代码吧布局文件<LinearLayout xmlns:android="http://schemas
- 对智能手机有所了解的朋友都知道其中一个应用广泛的手机操作系统Android 开源手机操作系统。那么在这一系统中想要实现通话的监听功能的话,我
- 该接口实现了序列化,声明为 public interface Key extends SerializableKey 是所有密钥的顶层接口。
- 目录关于日志级别为什么选用log4j2排除 spring-boot 自带的 logback 依赖添加 log4j2 依赖配置文件节点解析根节
- 一、历史版本delegate void StudentDelegate(string name, int age);public class
- Task执行任务,等待任务完成代码://任务Func<int> Funcs = () =>{? ? Console.Wri