Android GPS 可用位置提供者

地理定位有好几种,比如使用 GPS 或者根据网络位置定位,LocationManager 提供了 getAllProviders() 方法可以列出所有的位置提供者

范例

下面我们写一个 demo 列出当前设备的所有位置提供者,并且演示如何选择最优的位置提供者


从视频中可以看到,当前可用的 LocationProvider 有三个,分别是

位置提供者 说明
passive 被动提供,由其他程序提供
gps 通过GPS获取定位信息
network 通过网络获取定位信息
  1. 创建一个 空的 Android 项目 cn.twle.android.LocationProvider

  2. 修改 activity_main.xml 添加布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="16dp" 
        android:orientation="vertical">
    
        <Button
            android:id="@+id/btn_all"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="获得系统所有的 LocationProvider" />
    
        <Button
            android:id="@+id/btn_cd"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="根据条件获取 LocationProvider" />
    
        <Button
            android:id="@+id/btn_fixed"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="获取指定的 LocationProvider" />
    
        <TextView
            android:id="@+id/ms_rs"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:textSize="20sp"
            android:textStyle="bold" />
    
    </LinearLayout>
    
  3. 添加权限地理定位权限和网络权限

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.INTERNET" />
    
  4. 修改 MainActivity.java

    package cn.twle.android.locationprovider;
    
    import android.content.Context;
    import android.location.Criteria;
    import android.location.LocationManager;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private Button btn_all;
        private Button btn_cd;
        private Button btn_fixed;
        private TextView ms_rs;
        private LocationManager lm;
    
        // 存放LocationProvider名称的集合
        private List<String> pNames = new ArrayList<String>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    
            btn_all = (Button) findViewById(R.id.btn_all);
            btn_cd = (Button) findViewById(R.id.btn_cd);
            btn_fixed = (Button) findViewById(R.id.btn_fixed);
            ms_rs = (TextView) findViewById(R.id.ms_rs);
    
            btn_all.setOnClickListener(this);
            btn_cd.setOnClickListener(this);
            btn_fixed.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_all:
                    pNames.clear();
                    pNames = lm.getAllProviders();
                    ms_rs.setText(getProvider());
                    break;
                case R.id.btn_cd:
                    pNames.clear();
                    Criteria criteria = new Criteria();
                    criteria.setCostAllowed(false);      // 免费
                    criteria.setAltitudeRequired(true);  // 能够提供高度信息
                    criteria.setBearingRequired(true);   // 能够提供方向信息
                    pNames = lm.getProviders(criteria, true);
                    ms_rs.setText(getProvider());
                    break;
                case R.id.btn_fixed:
                    pNames.clear();
                    pNames.add(lm.getProvider(LocationManager.GPS_PROVIDER).getName()); //指定名称
                    ms_rs.setText(getProvider());
                    break;
            }
        }
    
        //遍历数组返回字符串的方法
        private String getProvider(){
            StringBuilder sb = new StringBuilder();
            for (String s : pNames) {
                sb.append(s + "\n");
            }
            return sb.toString();
        }
    }
    

参考文档

  1. 官方 API 文档:LocationManager

  2. 官方 API 文档:LocationProvider

  3. 官方 API 文档: Location

  4. 官方 API 文档: Criteria

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.