精华内容
下载资源
问答
  • 如何用gps定位
    千次阅读
    2021-05-26 13:31:28

    Android GPS定位步骤

    作者:李老师,

    为确定设备所在位置,需要进行以下步骤的操作。

    提供位置服务,需要获得LocationManager对象。使用LOCATION_SERVICE参数调用android.app.Activity.getSystemService()函数获取一个LocationManager实例。

    android.app.Activity.getSystemService()函数代码如代码所示。

    getSystemService()

    //Context.LOCATION_SERVICE指明获取的服务是位置服务

    String serviceString = Context.LOCATION_SERVICE;

    //根据服务名称获取Android提供的系统级服务

    LocationManagerLocationManager =

    (LocationManager)getSystemService(serviceString);

    这里介绍一下Android支持的系统级服务有哪些,如表所示。

    Android支持的系统级服务表

    Context类的静态常量

    返回对象

    说明

    LOCATION_SERVICE

    location

    LocationManager

    控制位置等设备的更新

    WINDOW_SERVICE

    window

    WindowManager

    顶层的窗口管理器

    LAYOUT_INFLATER_SERVICE

    layout_inflater

    LayoutInflater

    将XML资源实例化为View

    POWER_SERVICE

    power

    PowerManager

    电源管理

    ALARM_SERVICE

    alarm

    AlarmManager

    在指定时间接受Intent

    NOTIFICATION_SERVICE

    notification

    NotificationManager

    后台事件通知

    KEYGUARD_SERVICE

    keyguard

    KeyguardManager

    锁定或解锁键盘

    SEARCH_SERVICE

    search

    SearchManager

    访问系统的搜索服务

    VIBRATOR_SERVICE

    vibrator

    Vibrator

    访问支持振动的硬件

    CONNECTIVITY_SERVICE

    connection

    ConnectivityManager

    网络连接管理

    WIFI_SERVICE

    wifi

    WifiManager

    WiFi连接管理

    INPUT_METHOD_SERVICE

    input_method

    InputMethodManager

    输入法管理

    选择LocationManager的定位方法。在获取到LocationManager后,还需要指定LocationManager的定位方法,然后才能够调用LocationManager,LocationManager支持的定位方法有以下两种。

    GPS定位:可以提供更加精确的位置信息,但定位速度和质量受到卫星数量和环境情况的影响。

    网络定位:提供的位置信息精度差,但速度较GPS定位快。

    LocationManager支持的定位方法比较,如表所示。

    LocationManager支持的定位方法比较

    LocationManager类的静态常量

    说明

    GPS_PROVIDER

    gps

    使用GPS定位,利用卫星提供精确的位置信息,需要android.permissions.ACCESS_FINE_LOCATION用户权限

    NETWORK_PROVIDER

    network

    使用网络定位,利用基站或WiFi提供近似的位置信息,需要具有如下权限:

    android.permission.ACCESS_COARSE_LOCATION或android.permission.ACCESS_FINE_LOCATION.

    在指定LocationManager的定位方法后,则可以调用getLastKnowLocation()方法获取当前的位置信息。

    以使用GPS定位为例,获取位置信息的代码如代码清单所示。

    代码清单GPS定位获取位置信息

    String provider = LocationManager.GPS_PROVIDER;

    Location location = locationManager.getLastKnownLocation(provider);

    在上述代码中,第2行返回的Location对象中,包含了可以确定位置的信息,如经度、纬度和速度等。然后通过调用Location中的getLatitude()和getLongitude()方法可以分别获取位置信息中的纬度和经度,示例代码如代码清单所示。

    代码清单获取经纬度信息

    doublelat = location.getLatitude();

    doublelng = location.getLongitude();

    实现LocationListener类。代码如代码清单所示。

    代码清单LocationListener

    LocationListenerlocationListener = new LocationListener(){

    //在设备的位置改变时被调用

    public void onLocationChanged(Location location) {

    }

    //在用户禁用具有定位功能的硬件时被调用

    public void onProviderDisabled(String provider) {

    }

    //在用户启用具有定位功能的硬件时被调用

    public void onProviderEnabled(String provider) {

    }

    //在提供定位功能的硬件的状态改变时被调用,如从不可获取位置信息状态到可以获取位置信息的状态,反之亦然

    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    };

    利用requestLocationUpdates()方法启动位置信息的接收。

    LocationManager提供了一种便捷、高效的位置监视方法requestLocationUpdates(),可以根据位置的距离变化和时间间隔设定产生位置改变事件的条件,这样可以避免因微小的距离变化而产生大量的位置改变事件。

    LocationManager中设定监听位置变化的代码如代码清单所示。

    代码清单监听位置变化

    locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);

    其中,第1个参数是定位的方法,GPS定位或网络定位;第2个参数是产生位置改变事件的时间间隔,单位为微秒;第3个参数是距离条件,单位是米;第4个参数是回调函数,在满足条件后的位置改变事件的处理函数。代码将产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒。

    为了使GPS定位功能生效,还需要在AndroidManifest.xml文件中加入用户许可。没有这些权限,应用程序在运行时是无法获取到位置更新的。实现代码如下所示:

    代码清单 AndroidManifest.xml

    此处需注意,若使用GPS_PROVIDER,则使用ACCESS_FINE_LOCATION权限;若使用NETWORK_PROVIDER,则使用ACCESS_FINE_LOCATION和ACCESS_COARSE_

    LOCATION权限。

    位置服务一般都需要使用设备上的硬件,理想的调试方式是将程序上传到物理设备上运行,但在没有物理设备的情况下,也可以使用Android模拟器提供的虚拟方式模拟设备的位置变化,调试具有位置服务的应用程序。

    首先打开DDMS中的模拟器控制,在Location Controls中的Longitude和Latitude部分输入设备当前的经度和纬度,然后单击“Send”按钮,就将虚拟的位置信息发送到Android模拟器中,如图所示。

    在程序运行过程中,可以在模拟器控制器中改变经度和纬度坐标值,程序在检测到位置的变化后,会将新的位置信息显示在界面上。

    CurrentLocationDemo是一个提供位置服务的基本示例,提供了显示当前位置新的功能,并能够监视设备的位置变化。

    CurrentLocationDemo示例中LocationBasedServiceDemo.java文件的完整代码如代码清单所示。

    代码清单 LocationBasedServiceDemo.java

    packagecn.com.farsight.LocationBasedServiceDemo;

    importandroid.app.Activity;

    importandroid.content.Context;

    importandroid.os.Bundle;

    importandroid.widget.TextView;

    importandroid.location.Location;

    importandroid.location.LocationListener;

    importandroid.location.LocationManager;

    public class LocationBasedServiceDemo extends Activity {

    @Override

    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.main);

    String serviceString = Context.LOCATION_SERVICE;

    LocationManagerlocationManager =

    (LocationManager)getSystemService(serviceString);

    String provider = LocationManager.GPS_PROVIDER;

    Location location = locationManager.getLastKnownLocation(provider);

    getLocationInfo(location);

    locationManager.requestLocationUpdates(provider, 2000, 0, locationListener);

    }

    private void getLocationInfo(Location location){

    String latLongInfo;

    TextViewlocationText = (TextView)findViewById(R.id.txtshow);

    if (location != null){

    doublelat = location.getLatitude();

    doublelng = location.getLongitude();

    latLongInfo = "Lat: " + lat + "\nLong: " + lng;

    }

    else{

    latLongInfo = "No location found";

    }

    locationText.setText(“Your Current Position is:\n" + latLongInfo);

    }

    private final LocationListenerlocationListener = new LocationListener(){

    @Override

    public void onLocationChanged(Location location) {

    getLocationInfo(location);

    }

    @Override

    public void onProviderDisabled(String provider) {

    getLocationInfo(null);

    }

    @Override

    public void onProviderEnabled(String provider) {

    getLocationInfo(null);

    }

    @Override

    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    };

    }

    更多相关内容
  • 关于gps实现定位的一套matlab算法,可以用于初步定位学习
  • python实现GPS定位.py

    2021-03-24 12:40:19
    此程序为在jetson nano中实现GPS定位
  • 定位系统—GPS全球定位系统(Global Positioning System),GPS定位的基本原理是根据高速运动卫星的瞬间位置作为已知的起算数据,采用空间距离-后方交会的方法,确定待测点的位置。以GPS系统为例介绍卫星定位的计算...
  • GPS定位是目前很多手机都有的功能,且非常实用。本文以实例形式讲述了Android中GPS定位的用法。分享给大家供大家参考之。具体方法如下: 一般在Android中通过GPS获得当前位置,首先要获得一个LocationManager实例...
  • 美国代驾新模式:用GPS定位附近司机.pdf
  • 51单片机C语言编写的GPS定位 GPS模块 附接线图
  • 新疆生产建设兵团大力推广使用GPS定位棉花播种技术.pdf
  • C++实现GPS信号定位

    2022-05-16 01:29:02
    C++实现GPS信号定位
  • 用GPS定位器追踪抓获犯罪嫌疑人后交代罪行能否认定自首.pdf
  • 实现GPS定位的完整源码,欢迎下载!
  • Android GPS定位简单 DEMO

    2016-01-18 13:46:12
    -- GPS定位必须的权限 --> **1.获取位置管理器对象LocationManager** ``` import android.location.LocationManager; LocationManager lm; // lm =(LocationManager) this.getSystemService(Context`....
  • 主要介绍了javaweb实现百度GPS定位接口(经纬度),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • ESP8266带谷歌地图的GPS定位网络服务器 - 快捷方便! 硬件组件: NodeMCU ESP8266分线板× 1 GPS接收器(通用)× 1 软件应用程序和在线服务: Visuino - Arduino的图形开发环境 Arduino IDE 在本教程中,我将向您展示...
  • 新建一个项目,项目名为LBSTest。 安卓百度地图配置定位模式为GPS定位功能(图文+代码)

    系列文章

    提示:转到安卓学习专栏,观看更多内容!
    点我直达–>安卓学习专栏


    前言

        新建一个项目,项目名为LBSTest。
        安卓百度地图配置定位模式为GPS定位功能。Android中主要有两种定位方式.一种是通过GPS定位,一种是通过网络定位。而从前面的文章基础上修改安卓学习专栏——安卓百度地图定位sdk环境配置安卓实现定位功能(图文代码+保姆级解说+测试案例)中看出应该可以看出,我们一直是使用的网络定位。现在我们要切换到精确度更高的GPS定位。


    实现效果

    GPS模式定位
    在这里插入图片描述


    打开GPS权限

    首先,GPS定位功能必须要由用户主动去启用才行,不然任何应用程序都无法使用GPS获取到手机当前的位置信息。进入手机的设置→位置信息,我们要先手动打开权限。

    1. 搜索位置信息
    2. 打开位置开关
    3. 设置高精度模式
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    activity_main.xml

    布局文件中的内容非常简单,只有一个TextView控件,用于稍后显示当
    前位置的经纬度信息。

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <TextView
            android:id="@+id/position_text_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>
    

    AndroidManifest.xml

    1. AndroidManifest.xml文件改动比较多,我们来仔细阅读一下。可以看到,这里首先添加了很多行权限声明,每一个权限都是百度LBS SDK内部要用到的。然后在 标签的内部添加了一个<metadata> 标签,这个标签的android:name 部分是固定的,必须com.baidu.lbsapi.API_KEY ,android:value 部分则应该填入我们在前面的文章
      安卓学习专栏——安卓获取SHA1指纹申请百度地图API Key使用百度LBS定位功能(图文保姆级)
      申请到的API Key。
    2. 如果你的“android:name=“com.baidu.location.f””飘红说明前面的jar配置有问题
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.lbstest">
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
        <uses-permission android:name="android.permission.WAKE_LOCK" />
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/Theme.AppCompat">
            <meta-data
                android:name="com.baidu.lbsapi.API_KEY"
                android:value="填写你前面申请到的api key" />
            <activity
                android:name=".MainActivity"
                android:exported="true">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <service
                android:name="com.baidu.location.f"
                android:enabled="true"
                android:process=":remote">
            </service>
        </application>
    </manifest>
    

    MainActivity.java

    高精确度模式表示允许使用GPS、无线网络、蓝牙或移动网络来进行定位,节电模式表示仅允许使用无线网络、蓝牙或移动网络来进行 定位,而仅限设备模式表示仅允许使用GPS来进行定位。也就是说,如果我们想要使用GPS定位功能,这里必须要选择高精确度模式,或者仅限设备模式。 当然,你并不需要担心一旦启用GPS定位功能后,手机的电量就会直线 下滑,这只是表明你已经同意让应用程序来对你的手机进行GPS定位 了,但只有当定位操作真正开始的时候,才会影响到手机的电量。 开启了GPS定位功能之后,再回来看一下代码。
    我们可以 在initLocation() 方法中对百度LBS SDK的定位模式进行指定,一共 有3种模式可选:Hight_Accuracy、Battery_Saving和Device_Sensors。 Hight_Accuracy表示高精确度模式,会在GPS信号正常的情况下优先使 用GPS定位,在无法接收GPS信号的时候使用网络定位。Battery_Saving 表示节电模式,只会使用网络进行定位。Device_Sensors表示传感器模 式,只会使用GPS进行定位。其中,Hight_Accuracy是默认的模式,也 就是说,我们即使不修改任何代码,只要拿着手机走到室外去,让手机可以接收到GPS信号,就会自动切换到GPS定位模式了。 当然我们也可以强制指定只使用GPS进行定位,修改MainActivity中的代码:

    package com.example.lbstest;
    
    import androidx.appcompat.app.AppCompatActivity;
    import androidx.core.app.ActivityCompat;
    import androidx.core.content.ContextCompat;
    
    import android.Manifest;
    import android.content.pm.PackageManager;
    import android.os.Bundle;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.baidu.location.BDLocation;
    import com.baidu.location.BDLocationListener;
    import com.baidu.location.LocationClient;
    import com.baidu.location.LocationClientOption;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
        public LocationClient mLocationClient;
        private TextView positionText;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            mLocationClient = new LocationClient(getApplicationContext());
            mLocationClient.registerLocationListener(new MyLocationListener());
            setContentView(R.layout.activity_main);
            positionText = (TextView) findViewById(R.id.position_text_view);
            List<String> permissionList = new ArrayList<>();
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
                    permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
            }
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
                    permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
                permissionList.add(Manifest.permission.READ_PHONE_STATE);
            }
            if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.
                    permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            }
            if (!permissionList.isEmpty()) {
                String[] permissions = permissionList.toArray(new String[permissionList.
                        size()]);
                ActivityCompat.requestPermissions(MainActivity.this, permissions, 1);
            } else {
                requestLocation();
            }
        }
    
    
    
    
        //新修改的内容实时更新位置开始
        private void requestLocation() {
            initLocation();
            mLocationClient.start();
        }
    
        //以强制指定只使用GPS进行定位修改位置开始
        private void initLocation(){
            LocationClientOption option = new LocationClientOption();
            option.setScanSpan(5000);
            option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);
            mLocationClient.setLocOption(option);
        }
        //以强制指定只使用GPS进行定位修改位置结束
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            mLocationClient.stop();
        }
        //新修改的内容实时更新位置结束
    
    
    
        @Override
        public void onRequestPermissionsResult(int requestCode, String[] permissions,
                                               int[] grantResults) {
            switch (requestCode) {
                case 1:
                    if (grantResults.length > 0) {
                        for (int result : grantResults) {
                            if (result != PackageManager.PERMISSION_GRANTED) {
                                Toast.makeText(this, "必须同意所有权限才能使用本程序",
                                        Toast.LENGTH_SHORT).show();
                                finish();
                                return;
                            }
                        }
                        requestLocation();
                    } else {
                        Toast.makeText(this, "发生未知错误", Toast.LENGTH_SHORT).show();
                        finish();
                    }
                    break;
                default:
            }
        }
    
        public class MyLocationListener implements BDLocationListener {
            @Override
            public void onReceiveLocation(BDLocation location) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        StringBuilder currentPosition = new StringBuilder();
                        currentPosition.append("纬度:").append(location.getLatitude()).
                                append("\n");
                        currentPosition.append("经线:").append(location.getLongitude()).
                                append("\n");
                        currentPosition.append("定位方式:");
                        if (location.getLocType() == BDLocation.TypeGpsLocation) {
                            currentPosition.append("GPS");
                        } else if (location.getLocType() ==
                                BDLocation.TypeNetWorkLocation) {
                            currentPosition.append("网络");
                        }
                        positionText.setText(currentPosition);
                    }
                });
            }
    //     @Override
            public void onConnectHotSpotMessage(String s, int i) {
            }
        }
    }
    

    附录.参考资料

    《第一行代码》11.3.3 选择定位模式


    下载资源

    安卓学习者百度地图调用GPS定位模式项目示例.zip


    总结

    大家喜欢的话,给个👍,点个关注!继续跟大家分享敲代码过程中遇到的问题!


    展开全文
  • 这里提出一种基于EM411GPS接收模块和PIC18F2550单片机的手持式GPS定位系统设计方案。该系统采用点阵字符液晶屏显示接收GPS卫星数据,并用SD卡记录所接收到的GPS信息,从而实现GPS数据导入电子地图。
  • HTML开发教程之使用H5 GPS定位API.zip
  • 针对传统的在VC++平台上实现的GPS定位数据的提取与存储系统已经不能满足系统的实时性和可靠性等需求,以及软件方面存在扩展性、兼容性、移植性差等问题,运用GPS定位技术、多线程串口通信处理技术和数据库存储访问...
  • 主要介绍了Android GPS定位详解及实例代码的相关资料,需要的朋友可以参考下
  • GPS定位基本原理浅析

    2021-01-19 21:24:00
    网络上介绍GPS原理的资料很多,而本文试图从编程人员的角度出发,以一种程序员易于理解的方式来简单介绍一下GPS定位的基本原理,希望对做GPS开发的朋友有所启发。当然,本文并没有涉及具体的开发方面的技术。  一...
  • Android使用GPS代码示例的位置Android-使用GPS定位您可以在此处找到有关如何使用代码库的完整教程: 本教程由The App Guruz提出-最好的
  • ----------------------非战斗人员勿扰---------------------------- 获取GPS定位信息 火星坐标转换代码.zip
  • Java语言编写的GPS定位系统,已通过编译,可以直接运行。(其中了图中求源点到目的顶点最短距离的算法)
  • GPS绝对定位,利用C++语言对GPS进行位置解算
  • 系统硬件电路主要有GPS、液晶显示器、STC12C5A60S2、LED状态指示单片机上电复位和电源等部分组成。GPS发送的串行数据送至单片机串行口经处理后通过键盘选择要显示的信息,送至LCD液晶显示器。...电路图AD画的:
  • 利用最小二乘法和六颗GPS卫星数据进行定位解算
  • GPS定位基本原理

    2019-05-05 11:38:46
    本文阐述了GPS定位数学模型,单点定位与差分定位,然后介绍了Gps的发展历程,策略,以及其他的卫星的导航系统,Gps构成等内容进行了详细的介绍说明。
  • 基于PHP的GPS定位

    2018-01-30 10:00:26
    一个简单的PHP+MySQL+JS+GoogleMapAPI
  • 针对于 卫星接受数据的 卡尔曼滤波定位, 主要是 UKF sage自适应滤波的MATLAB程序 里面有定位的误差图 数据包 定位仿真结果 等
  • 船舶GPS定位

    2018-04-30 15:29:00
    船舶GPS定位

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 77,276
精华内容 30,910
关键字:

如何用gps定位