Android:位置服务

2023-10-27

前言

在开发 Android 位置相关应用时,可以从 GPS(全球定位系统)、passive、network 获取用户位置。通过 GPS 能获得最精确的信息。

LocationProvider 是位置源的意思,用来提供定位信息。
常用的 LocationProvider

方法名 描述
passive 被动定位方式,即利用其他应用程序使用定位更新了定位信息,系统会保存下来,该应用接收到消息后直接读取即可
gps 通过手机里面的 GPS 芯片利用卫星获取定位信息
network 通过网络获取定位信息。通常利用手机基站和 WIFI节点的地址来大致定位

LocationManager:该类提供系统定位服务访问功能。
LocationManager 提供的常用的方法

方法名 描述
list getAllProviders() 获取所有的 LocationProvider 列表
Location getLastKnowLocation(String provider) 根据 LocationProvider 获取最近一次已知的 Location
LocationProvider getProvider(String name) 根据名称来获取 LocationProvider
void requestLocationUpdates (String provider, long minTime, float minDistance, PendingIntent intent) 通过指定的 LocationProvider 周期性地获取定位信息,并通过 intent 启动相应的组件
void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener) 通过指定的 LocationProvider 周期性地获取定位信息,并触发 listener 所对应的触发器

LocationProvider:定位组件的抽象表示,通过该类可以获取该定位组件的相关信息。
LocationProvider 提供的常用方法

方法名 描述
int getAccuracy() 返回 LocationProvider 的精度
String getName() 返回 LocationProvider 的名称
int getPowerRequirement() 获取 LocationProvider 的电源需求

Location:该类表示特定时间地理位置信息,位置由经度、纬度、UTC时间戳以及可选的高度、速度、方向等组成。
Location 提供的常用方法

方法名 描述
float getAccuracy() 获取定位信息的精度
double getAltitude() 获取定位信息的高度
float getBearing() 获取定位信息的方向
double getLatitude() 获取定位信息的纬度
double getLongitude() 获取定位信息的经度
String getProvider() 获取提供该定位信息的 LocationProvider
float getSpeed() 获取定位信息的速度

举例说明:获取所有可用的 Location Provider

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        //获取显示 LocationProvider 名称的 TextView 组件
        TextView textView = findViewById(R.id.text2);
        //获取 location 服务
        LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        //获取系统所有的 LocationProvider 名称
        List<String> providerNames = locationManager.getAllProviders();
        //使用 StringBuilder 保存数据
        StringBuilder stringBuilder = new StringBuilder();
        //遍历获取到的全部 Locationprovider 名称
        for(Iterator<String> iterator = providerNames.iterator(); iterator.hasNext(); ) {
            stringBuilder.append(iterator.next() + "\n");
        }
        //显示 LocationProvider 名称
        textView.setText(stringBuilder.toString());
    }
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="可用LocationProvider:"
        android:layout_marginTop="100dp"
        android:textSize="40dp"
        android:id="@+id/text1"
        />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/text2"
        android:textSize="35dp"
        android:layout_marginLeft="20dp"
        android:layout_below="@+id/text1"
        />

</RelativeLayout>

结果
结果


举例说明:获取动态定位信息

public class MainActivity extends Activity {
    //获取系统的 LocationManager 对象
    private LocationManager locationManager;
    //定义显示 LocationProvider 的 TextView 组件
    private TextView provider;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        provider = findViewById(R.id.provider);

        //检测用户是否打开GPS
        if (!isGpsAble(locationManager)) {
            Toast.makeText(MainActivity.this, "请打开GPS", Toast.LENGTH_SHORT).show();
            openGPS2();
        }

        //检测用户是否允许定位
        if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            //提供开启定位的指导界面
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 200);
        } else {
            //获取GPS信息
            startLocation();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                   @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        //用户同意权限
        if (requestCode == 200) {
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED)
                startLocation();
            else //用户拒绝之后,当然我们也可以弹出一个窗口,直接跳转到系统设置页面
                Toast.makeText(MainActivity.this,
            "请手动开启权限", Toast.LENGTH_LONG).show();
        }
    }

    //禁止权限检查
    @SuppressLint("MissingPermission")
    private  void startLocation(){
        //从GPS获取最近的定位信息
        Location lc = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        //更新信息
        updateShow(lc);
        //2秒获取一次、位置间隔1米
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 1, new LocationListener() {
            //GPS信息变化则更新
            @Override
            public void onLocationChanged(Location location) {
                updateShow(location);
            }
            //位置状态发生改变时更新
            @Override
            public void onStatusChanged(String provider, int status, Bundle extras) {
            }
            //定位提供者启动时触发
            @Override
            public void onProviderEnabled(String provider) {
            }
            //定位提供者关闭时触发
            @Override
            public void onProviderDisabled(String provider) {
            }
        });
    }

    //更新GPS数据
    @SuppressLint("SetTextI18n")
    private void updateShow(Location location) {
        if (location != null) {
            String string = "当前的位置信息:"
                    + "\n经度:" + location.getLongitude()
                    + "\n纬度:" + location.getLatitude()
                    + "\n高度:" + location.getAltitude()
                    + "\n速度:" + location.getSpeed()
                    + "\n方向:" + location.getBearing()
                    + "\n定位精度:" + location.getAccuracy();
            provider.setText(string);
        } else provider.setText("没有获取GPS信息");
    }

    //返回 GPS 状态
    private boolean isGpsAble(LocationManager lm) {
        return lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
    }

    //打开设置页面
    private void openGPS2() {
        Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
        startActivityForResult(intent, 0);
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout android:orientation="vertical"
    android:layout_height="match_parent"
    android:layout_width="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:textStyle="bold"
        android:layout_marginTop="100dp"
        android:layout_marginLeft="20dp"
        android:textSize="20sp"
        android:padding="5dp"
        android:id="@+id/provider"
        />

</RelativeLayout>

结果
结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android:位置服务 的相关文章

随机推荐

  • YOLOv3-药草识别实现

    一 标注工具 labelimg 使用工具lableimg 1 操作步骤 使用cmd进入下载目录之后 使用python lableimg进入标注工具 open选择文件之后 选择Create nRectBox进行选择区域 并且标注药草名 如下
  • 爬虫逆向学习进阶路线

    大数据时代下 爬虫技术逐渐成为一套完整的系统性工程技术 涉及的知识面广 平台多 技术越来越多样化 对抗性也日益显著 大家可以参考一下学习路线 看看自己需要对哪些知识进行补充 爬虫逆向学习路线 学习路线总结 系统提高 加密算法特征和实现 传输
  • [创业之路-51] :动态股权机制 -6- 创始团队股权比例如何分配比较合理

    创始团队股权比例如何分配 可以参考以下几个标准 提出创意并获得执行可以先分10 不能只是空点子 要执行并落地 最初召集大家一起创业的创始人可以多分5 创始人是公司主要运营负责人的额外多分5 让公司发展从0到1 增加5 20 例如建立良好的市
  • 八目云播服务器维护,LiveQing 云平台直播点播使用说明

    LiveQing 云平台直播点播使用说明 下载安装包 zip 是windows环境中使用的安装包 tar gz 是linux环境中使用的安装包 Windows下安装 说明 Windows 64位 系统 下载的安装包放置在任意一个目录下 解压
  • CSS笔记

    2 3 4 5
  • 在Spark上运行apache beam

    目录 apache beam 个人使用经验总结目录和入门指导 Java 为了方便 以下面这个名字替换的程序做简单例子 The ReplaceMyName 把Create数组里的myName替换成xxx since 2019 12 17 pu
  • [C语言]define 定义常量/宏

    1 运用define定义常量 2 运用define定义宏 1 运用define定义常量 格式 define 符号 数值 define A 100 定义后的常量 作用域在整个项目 可以跨源文件调用 2 运用define定义宏 宏与函数其实十分
  • 学习PWM——控制的关键

    目录 一 PWM的简介 1 PWM是什么 2 PWM的参数 1 PWM的频率 2 PWM的周期 3 占空比 3 PWM的原理 1 高级输出比较通道 2 通用输出比较通道 3 输出比较模式 二 PWM的结构 1 PWM的基本结构 2 参数计算
  • Blip2 文章阅读

    论文地址https arxiv org pdf 2301 12597 pdf BLIP 2 Bootstrapping Language Image Pre training with Frozen Image Encoders and L
  • 【PyTorch教程】05-如何使用PyTorch训练神经网络模型 (2022年最新)

    本期目录 使用PyTorch训练神经网络 torch autograd 1 神经网络背景 2 加载预训练模型 有重大更新 2 1 新老版本写法对比 2 2 新写法的好处 2 3 图像数据的预处理 2 4 训练模式和验证模式之间的转换 3 正
  • 机器学习技术(六)——有监督学习算法之线性回归算法实操

    机器学习技术 五 有监督学习之线性回归算法实操 引言 机器学习监督算法是一种基于已有标记数据的学习方法 通过对已知输入和输出数据的学习 建立一个模型来预测新的输入数据的输出 这种算法模仿人类的学习过程 从已有的经验中总结规律 并将其应用于新
  • python在excel表里如何新增一列或者一行?新增之后,公式和合并单元格会怎样变化?

    首先导入openpyxl库 即 import openpyxl as op 然后打开你已有的excel 即 wb op open 新增一列 xlsx 打开新增一列 xlsx这个工作簿 ws wb Sheet1 打开Sheet1这个工作表 我
  • 2020-09-06

    Nexus仓库管理服务 1 Nexus端口为8081 Nexus是Maven仓库管理器 如果你使用Maven 你可以从Maven中央仓库下载所需要的构件 artifac 但这通常不是一个好的做法 你应该在本地假设一个Maven仓库服务器 在
  • 静态代码分析工具列表分析---代码分析工具列表(30款工具)

    本文是一个静态代码分析工具的清单 共有30个工具 包括4个 NET工具 2个Ada工具 7个C 工具 4个Java工具 2个JavaScript工具 1个Opa工具 2个Packaging工具 3个Perl工具 1个Python工具 1个嵌
  • qt采用opengl显示yuv视频数据

    作者 使徒保罗 邮箱 297329588szh 163 com 声明 欢迎交流学习 如有任何疑问 请通过邮箱联系本人 应用场景 qt opengl渲染yuv420p数据 开发环境 win7 64位 qt opensource windows
  • WEB-CTF通关教程二

    信息泄露的第二关 进去页面如下 查看源代码发现后缀为 sql的文件 看见这个文件思路就是把这个文件下载下来查看敏感数据 尝试在链接后直接加文件名 发现直接下载了我们的文件 使用记事本打开文件 得到flag值 暴力破解第二关 打开页面提示如下
  • 将手机号中间四位进行隐藏操作(Java)

    import java util Scanner public class StringExample2 public static void main String args 将手机号中间四位数字用 来替代 用截取字符串的方法 将前三位和
  • 有点问题的代码

    一个有问题的程序 import javax swing import java awt event import java awt class EditBook public static void main String args Edi
  • 详解 http-server的安装和使用

    简介 http server 命令行http服务器 http server是一个简单的零配置命令行http服务器 它足够强大 足以用于生产用途 但它既简单又易于破解 可用于测试 本地开发和学习 使用前提 http server 基于node
  • Android:位置服务

    前言 在开发 Android 位置相关应用时 可以从 GPS 全球定位系统 passive network 获取用户位置 通过 GPS 能获得最精确的信息 LocationProvider 是位置源的意思 用来提供定位信息 常用的 Loca