用户定位
一、简单的UserLocation
1、UserLocation用来干什么
获取用户位置,追踪用户移动
2、UserLocation的关键API
LocationManager: 用于管理定位的服务
LocationProvider:提供定位方式,GPS/NetWork/passive
3、定位方式
A、使用GPS卫星,需要在AndroidMenifest中声明权限
android.permission.ACCESS_FINE_LOCATION 这是一个比较精确的定位
B、NetWork,用信号接收塔和WiFi接入点,需要在AndroidMenifest中声明权限
android.permission.ACCESS_COARSE_LOCATION 这是一个不很精确的定位
或者
android.permission.ACCESS_FINE_LOCATION
4、获取当前位置的步骤
A、在AndroidMenifest中声明权限
B、获取LocationManager(获取定位服务)
LocationManager locationManager=(LocationManager)MainActivity.this.getSystemService(Context.LOCATION_SERVICE)
C、选择LocationProvider(选择定位方式)
D、绑定一个LocationListnener对象,当用户位置发生改变时,会触发监听器
//第一个参数是定位的方式,第二个参数是定位的周期(单位ms)
//第三个参数是定位的距离,每隔多少米定位一次
//第四个参数是监听器
locationManager.requestLocationUpdates(LocationMnager.GPS_PROVIDER, 0, 0, new testLocationListener)
5、LocationListener的四个方法
A、onLocationChanged,当用户位置发生改变时调用该方法
B、onProviderDisabled,当提供数据的provider不能使用时调用该方法
C、onProviderEnabled,当提供数据的provider可以使用时调用该方法
D、onStatusChanged,当提供数据的provider发生改变时调用该方法
6、Android模拟器可以模拟定位服务,启动Eclipse的DDMS视图,可以发送经度和纬度到模拟器
二、选择最佳定位方式,追踪位置
1、得到所有的LocationProvider
LocationManager.getAllProviders(),将结果打印出来可以知道有三种定位方式GPS/NetWork/passive
2、Android通过Criteria来设置一系列的查询条件,用于查询符合条件的LocationProvider
Criteria criteria = new Criteria()
所谓最佳定位方式,就是满足当前设定条件的定位方式,Criteria可以设定的条件有
(1)、criteria.setAccuracy(int accuracy)
设置定位的精确度,有两种取值ACCURACY_COARSE(精确度不太高) ACCURACY_FINE(精确度高)
(2)、criteria.setAltitudeRequired(boolean altitudeRequired)
设置是否需要测试海拔,TRUE/FALSE
(3)、criteria.setBearingRequired(boolean bearingRequired)
设置是否需要获取方向
(4)、criteria.setBearingAccuracy(int bearingAccuracy)
设置获取方向的精度,取值ACCURACY_HIGN/ACCURACY_LOW
(5)、criteria.setCostAllowed(int costAllowed)
设置是否可以发生收费现象
(6)、criteria.setHorizontalAccuracy(int accuracy)
设置水平方向的精度,取值 ACCURACY_HIGN/ACCURACY_LOW/ACCURACY_MEDIUM
(7)、criteria.setVerticalAccuracy(int accuracy)
设置垂直方向的精度,取值 ACCURACY_HIGN/ACCURACY_LOW/ACCURACY_MEDIUM
(8)、criteria.setPowerRequirement(int level)
设置电量消耗的级别,取值PEWER_LOW/POWER_MEDIUM/POWER_HIGH
(9)、criteria.setSpeedRequired(boolean speedRequired)
设置是否需求速度
(10)、criteria.setSpeedAccuracy(int accuracy)
设置速度的精度,取值ACCURACY_HIGN/ACCURACY_LOW/ACCURACY_MEDIUM
3、获取最佳定位方式
//第一个参数是当前设置的条件
//第二个参数是false,会查询当前所有的定位方式;第二个参数真true,查询已经打开的定位方式
locationManager.getBestProvider(criteria, false)
三、源代码
MainActivity.java
getBestLocationProvider.java
-
package com.example.location;
-
-
import android.location.Criteria;
-
import android.location.LocationManager;
-
import android.widget.Button;
-
-
public class getBestLocationProvider
-
{
-
-
//设置查询条件
-
public Criteria setCriteria()
-
{
-
Criteria criteria = new Criteria();
-
//要求高精度
-
criteria.setAccuracy(Criteria.ACCURACY_FINE);
-
//要求省电
-
criteria.setPowerRequirement(Criteria.POWER_LOW);
-
//要求不能产生费用
-
criteria.setCostAllowed(false);
-
//不要求速度
-
criteria.setSpeedRequired(false);
-
-
return criteria;
-
}
-
//获取满足条件的最佳provider
-
public String getProvider(LocationManager locationManager, Criteria criteria)
-
{
-
return locationManager.getBestProvider(criteria, false);
-
}
-
}
AndroidMenifest.xml
-
<?xml version="1.0" encoding="utf-8"?>
-
<manifest xmlns:android=""
-
package="com.example.location"
-
android:versionCode="1"
-
android:versionName="1.0" >
-
-
<uses-sdk
-
android:minSdkVersion="8"
-
android:targetSdkVersion="18" />
-
-
<application
-
android:allowBackup="true"
-
android:icon="@drawable/ic_launcher"
-
android:label="@string/app_name"
-
android:theme="@style/AppTheme" >
-
<activity
-
android:name="com.example.location.MainActivity"
-
android:label="@string/app_name" >
-
<intent-filter>
-
<action android:name="android.intent.action.MAIN" />
-
-
<category android:name="android.intent.category.LAUNCHER" />
-
</intent-filter>
-
</activity>
-
</application>
-
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
-
</manifest>
activity_main.xml
-
<RelativeLayout xmlns:android=""
-
xmlns:tools=""
-
android:layout_width="match_parent"
-
android:layout_height="match_parent"
-
android:paddingBottom="@dimen/activity_vertical_margin"
-
android:paddingLeft="@dimen/activity_horizontal_margin"
-
android:paddingRight="@dimen/activity_horizontal_margin"
-
android:paddingTop="@dimen/activity_vertical_margin"
-
tools:context=".MainActivity" >
-
-
<Button
-
android:id="@+id/getLocationBtn"
-
android:layout_width="fill_parent"
-
android:layout_height="wrap_content"
-
android:text="用户定位" />
-
<Button
-
android:id="@+id/getAllProviderBtn"
-
android:layout_width="fill_parent"
-
android:layout_height="wrap_content"
-
android:layout_below="@+id/getLocationBtn"
-
android:text="所有定位方式" />
-
<Button
-
android:id="@+id/getBestProviderBtn"
-
android:layout_width="fill_parent"
-
android:layout_height="wrap_content"
-
android:layout_below="@+id/getAllProviderBtn"
-
android:text="最佳定位方式" />
-
</RelativeLayout>
阅读(14705) | 评论(0) | 转发(1) |