1. 相关知识简介

通过LocationManagerService可以获取位置,这个service的aidl文件在frameworks/base/location/java/android/location/里,从LocationManager.java可以看到应该如何调用它。在定位的时候需要指定采用哪种provider,常用有三种:

LocationManager.GPS_PROVIDER                   精确定位,精度在十几米内

LocationManager.NETWORK_PROVIDER         粗略定位,精度在上百米

LocationManager.PASSIVE_PROVIDER           悄悄定位,也就是不启动定位,但是当别的应用使用gps/network定到位了就会把location告诉给它

要使用LocationManagerService,首先需要获取到LocationManager,然后通过这个LocationManager执行启动定位、关闭定位等操作。

import android.location.LocationManager;

private LocationManager mLocationManager;

mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

接下来看下通过LocationManager启动定位的方法:

public void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)

public void requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent)

public void requestLocationUpdates(long minTime, float minDistance, Criteria criteria, PendingIntent intent)

minTime - 最小时间,单位毫秒,

如果本次得到的location离上次的location时间间隔小于minTime,那么LocationManagerService就不会把这个location报告给我们

minDistance - 最小距离,单位米,

如果本次得到的location与上次的location距离小于minDistance,那么LocationManagerService就不会把这个location报告给我们

criteria - 选择provider的规则,例如高精度、低电量等等,最后由LocationManager根据我们提供的规则选择一个合适的provider

listener - 用来接收location的接口,需要重写四个方法:onLocationChanged、onStatusChanged、onProviderEnabled、onProviderDisabled

对应四个事件:location更新、状态更新(启动、停止)、provider打开、provider关闭(例如系统设置里关闭GPS)

intent - 可以通过PendingIntent.getBroadcast(this,0,new Intent(LOCATION_EVENT),0)获取一个PendingIntent,

这个LOCATION_EVENT是自己定义的action

当位置事件发生后,从LocationManagerService里发送我们自定义的LOCATION_EVENT广播,对应的数据在Intent的Extra里

putExtra(LocationManager.KEY_LOCATION_CHANGED, new Location(location))

putExtra(LocationManager.KEY_STATUS_CHANGED, status)

putExtra(LocationManager.KEY_PROVIDER_ENABLED, enabled)

通过LocationManager关闭定位的方法:

public void removeUpdates(LocationListener listener)

public void removeUpdates(PendingIntent intent)

可以使用LocationListener或者PendingIntent来接收位置事件,不过只能选择其中一种方法,一般常用LocationListener。

获取到location之后,我们可以从location里得到经纬度数据,然后通过Geocoder的getFromLocation方法得到地理位置信息,

如: 中国 上海市浦东新区 滨江大道

Geocoder(Context context, Locale locale)              根据指定的Locale构造Geocoder,Locale.getDefault()即本地

List<Address>    getFromLocation(double latitude, double longitude, int maxResults)     获取指定经纬度附近的地理位置信息

Address提供getAddressLine来获取位置字串String   getAddressLine(int index)

一般位置信息字串有好几段,index=0为国家,1为城区,可以通过int  getMaxAddressLineIndex()来查看最后一段的编号

2.  实例代码

打开app后,立即启动gps定位,定到位后将第一个location的经纬度数据放到两个EditText里,并利用这个经纬度来计算地理位置信息,通过Toast显示出来。另外可以修改EditText里的经纬度数据,然后点击查询来得到给定经纬度的地理位置。

package com.example.locationview;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import android.app.Activity;
import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class MainActivity extends Activity {
private final String TAG = "LocationView";
private MyHandler mHandler;
private final int MSG_SHOW = 1;
private EditText mEditLat,mEditLong;
private Button mButtonFind;
private LocationManager mLocationManager;
private Geocoder mGeocoder;
private int fixCount;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditLat = (EditText)findViewById(R.id.latitudeEdit);
mEditLong = (EditText)findViewById(R.id.longitudeEdit);
mButtonFind = (Button)findViewById(R.id.findButton);
mHandler = new MyHandler(getMainLooper());
mGeocoder = new Geocoder(getApplicationContext(),Locale.getDefault());
mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
fixCount = 0;
mButtonFind.setOnClickListener(new OnClickListener(){
public void onClick(View view){
String latitude,longitude;
latitude = mEditLat.getText().toString();
longitude = mEditLong.getText().toString();
if(!latitude.equals("") && !longitude.equals("")){
showAddress(latitude,longitude);
}
}
});
}
private void showAddress(String latitude,String longitude){
try{
List
addrList = mGeocoder.getFromLocation(Double.parseDouble(latitude), Double.parseDouble(longitude), 1); if(addrList.size() > 0){ StringBuilder sb = new StringBuilder(); Address addr = addrList.get(0); for(int i=0;i<=addr.getMaxAddressLineIndex();i++){ sb.append(addr.getAddressLine(i)).append(" "); } showMessage(sb.toString()); }else{ showMessage("address not found!"); } }catch(IOException e){ e.printStackTrace(); } } @Override protected void onStart(){ super.onStart(); mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 0, mListener); Log.d(TAG,"start gps"); } @Override protected void onStop(){ mLocationManager.removeUpdates(mListener); Log.d(TAG,"stop gps"); super.onStop(); } private LocationListener mListener = new LocationListener(){ @Override public void onLocationChanged(Location location){ String latitude,longitude; latitude = Double.toString(location.getLatitude()); longitude = Double.toString(location.getLongitude()); Log.d(TAG, "lat: " + latitude + " long: " + longitude); if(++fixCount == 1){ mEditLat.setText(latitude); mEditLong.setText(longitude); showAddress(latitude,longitude); } } @Override public void onProviderDisabled(String provider) { // TODO Auto-generated method stub } @Override public void onProviderEnabled(String provider) { // TODO Auto-generated method stub } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // TODO Auto-generated method stub } }; private void showMessage(String addr){ mHandler.removeMessages(MSG_SHOW); Bundle bundle = new Bundle(); bundle.putString("ADDR", addr); mHandler.sendMessage(Message.obtain(mHandler, MSG_SHOW, bundle)); } public class MyHandler extends Handler{ public MyHandler(Looper looper){ super(looper); } public void handleMessage(Message msg){ switch(msg.what){ case MSG_SHOW: Bundle bundle = (Bundle)msg.obj; Toast.makeText(getApplicationContext(), bundle.getString("ADDR"), Toast.LENGTH_SHORT).show(); break; } } } }

Android APP - GPS定位并获取地理位置相关推荐

  1. android app gps 定位权限,uniapp 打开[ios/安卓]GPS定位权限

    如何检测GPS有没有开启我是写在高德地图API接口中fail函数里的 openGps(){ let system = uni.getSystemInfoSync();// 获取系统信息 if (sys ...

  2. android动态获取地理位置权限,Android6.0获取GPS定位和获取位置权限和位置信息的方法...

    1.添加权限--6.0之后要动态获取,下面会说 2.直接上代码,不多说,代码中注释很详细. private static final int BAIDU_READ_PHONE_STATE = 100; ...

  3. Android系统GPS定位实现

    一.定位方式简介 定位基本分为三种方式,特点如下: 1.wifi定位:IP地址定位,根据ip地址查询实际的地理位置,因为动态获取ip的操作,定位不准确 2.基站定位:根据基站(信号塔)的个数以及手机与 ...

  4. android获得图片的坐标,Android百度地图定位后获取周边位置的实现代码

    本文实例讲解Android百度地图定位后获取周边位置的实现代码,分享给大家供大家参考,具体内容如下 效果图: 具体代码: 1.布局文件 android:orientation="vertic ...

  5. Android 打开 GPS 导航并获取位置信息

    原文地址为: Android 打开 GPS 导航并获取位置信息 最近在做一个 Android 项目,需要用到GPS获取位置信息,从 API 查了一下,发现获取位置信息仅需极其简单的一句即可: getL ...

  6. 【Android App】定位导航GPS中开启手机定位功能讲解及实战(附源码和演示 超详细)

    需要源码请点赞关注收藏后评论区留言私信~~~ 一.开启定位功能 手机定位分为卫星定位和网络定位两大类. (1)卫星定位 卫星定位服务由几个全球卫星导航系统提供. 卫星定位的原理是根据多颗卫星与导航芯片 ...

  7. java编程手机gps定位_GPS 获取Gps定位信息的Android源码实例,通过这个JAVA 目,你可能学会GPS在 手机 238万源代码下载- www.pudn.com...

    文件名称: GPS下载 收藏√  [ 5  4  3  2  1 ] 开发工具: Java 文件大小: 59 KB 上传时间: 2013-04-08 下载次数: 22 详细说明:获取Gps定位信息的A ...

  8. Android之GPS定位详解

    2019独角兽企业重金招聘Python工程师标准>>> 一.LocationManager LocationMangager,位置管理器.要想操作定位相关设备,必须先定义个Locat ...

  9. Android原生GPS定位以及位置解析

    最近在写一个纯本地的APP项目,项目中要求获取当前坐标的经纬度以及城市名,以前只做过网络定位(百度API和高德API),但是这两个都需要联网实现.so,选择GPS无疑是最好的选择了.我大概的整理了一下 ...

最新文章

  1. 转-Redis学习手册(目录)
  2. Linux服务器编程之:chown()函数,chown命令
  3. Redis中查找大key
  4. Android Bootloader LittleKernel的两篇文章 【转】
  5. LeetCode65——Valid Number(使用DFA)来判断字符串是否为数字
  6. Android mock单例对象,如何对Java单例模式进行mock
  7. #pragma pack(1) 的意义是什么
  8. 通达信缠论三买三卖指标公式_【新增选股指标:中枢突破】通达信版缠论自动画线选股指标今天更新1个重要新版...
  9. Aspose.Cell 导出和导入Excel
  10. ssm员工考勤签到请假管理系统 idea maven
  11. SSM和SSH2区别
  12. 固态硬盘分为哪几种_固态硬盘接口类型有哪些? 固态硬盘接口类型图解
  13. 读《费曼学习法》有感
  14. 数字证书是什么,里面都包含那些内容
  15. 制作AppStore预览:在 iPhone 上截屏或录制屏幕15秒以上的视频;iPhone日常使用技巧(一直弹出登录iCloud的解决方法、不自动弹出询问是否允许使用蜂窝数据的解决方法)
  16. Java实现 LeetCode 808 分汤 (暴力模拟)
  17. ff14 人最多的服务器,记录FF14全服人数最少的服务器红茶川
  18. 大牛讲解信号与系统(通俗易懂)
  19. VPS服务-Docker搭建个人博客网站
  20. GitModel|Task04|随机模拟

热门文章

  1. 戴蒙德对新冠疫情等的分析与看法笔记
  2. ios使用地图定位记录运动轨迹
  3. (费用流)洛谷P2469 [SDOI2010]星际竞速
  4. MFC 隐藏/显示鼠标图标
  5. Vue Antdv 上传组件(a-upload、a-upload-dragger)二次封装(DZMAntdvUpload)
  6. 从‘心’出发,乐跑向前——德州站健心跑公益活动盛大开跑
  7. java计算机毕业设计南通大学福利发放管理系统源代码+数据库+系统+lw文档
  8. iOS-发布按钮动画(类似于闲鱼发布),弹出动画github开源
  9. (39.1)【XML漏洞专题】必备的基础知识、利用原理、构建规则
  10. 抓到Netty一个隐藏很深的内存泄露Bug | 详解Recycler对象池的精妙设计与实现