Android GPS 可用位置提供者
地理定位有好几种,比如使用 GPS
或者根据网络位置定位,LocationManager
提供了 getAllProviders()
方法可以列出所有的位置提供者
范例
下面我们写一个 demo 列出当前设备的所有位置提供者,并且演示如何选择最优的位置提供者
从视频中可以看到,当前可用的 LocationProvider 有三个,分别是
位置提供者 | 说明 |
---|---|
passive | 被动提供,由其他程序提供 |
gps | 通过GPS获取定位信息 |
network | 通过网络获取定位信息 |
-
创建一个 空的 Android 项目
cn.twle.android.LocationProvider
-
修改
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>
-
添加权限地理定位权限和网络权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" />
-
修改
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(); } }