Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5800672
  • 博文数量: 409
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 8273
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 19:15
个人简介

qq:78080458 学习交流群:150633458

文章分类

全部博文(409)

文章存档

2019年(127)

2018年(130)

2016年(20)

2015年(60)

2014年(41)

2013年(31)

分类: Android平台

2015-02-04 17:28:07

 用户定位
一、简单的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

点击(此处)折叠或打开

  1. package com.example.location;

  2. import java.util.Iterator;
  3. import java.util.List;

  4. import android.location.Criteria;
  5. import android.location.Location;
  6. import android.location.LocationListener;
  7. import android.location.LocationManager;
  8. import android.os.Bundle;
  9. import android.app.Activity;
  10. import android.content.Context;
  11. import android.content.DialogInterface;
  12. import android.content.DialogInterface.OnClickListener;
  13. import android.view.Menu;
  14. import android.view.View;
  15. import android.widget.Button;

  16. public class MainActivity extends Activity {
  17.     
  18.     private Button getLocationBtn = null;
  19.     private Button getBestProviderBtn = null;
  20.     private Button getAllProviderBtn = null;
  21.     private LocationManager locationManager = null;
  22.     
  23.     @Override
  24.     protected void onCreate(Bundle savedInstanceState) {
  25.         super.onCreate(savedInstanceState);
  26.         setContentView(R.layout.activity_main);
  27.         
  28.         //获取按钮
  29.         getLocationBtn = (Button)findViewById(R.id.getLocationBtn);
  30.         getAllProviderBtn = (Button)findViewById(R.id.getAllProviderBtn);
  31.         getBestProviderBtn = (Button)findViewById(R.id.getBestProviderBtn);
  32.         //为按钮绑定监听器
  33.       getLocationBtn.setOnClickListener(new btnListener());
  34.       getAllProviderBtn.setOnClickListener(new btnListener());
  35.       getBestProviderBtn.setOnClickListener(new btnListener());
  36.      
  37.       //获取LocationManager(获取定位服务)
  38.         locationManager=(LocationManager)MainActivity.this.getSystemService(Context.LOCATION_SERVICE);
  39.     }

  40.     class testLocationListener implements LocationListener
  41.     {

  42.         @Override
  43.         public void onLocationChanged(Location location)
  44.         {
  45.             // TODO Auto-generated method stub
  46.             //打印出纬度
  47.             System.out.println(location.getLatitude());
  48.             //打印出经度
  49.             System.out.println(location.getLongitude());
  50.         }

  51.         @Override
  52.         public void onProviderDisabled(String provider)
  53.         {
  54.             // TODO Auto-generated method stub
  55.             
  56.         }

  57.         @Override
  58.         public void onProviderEnabled(String provider)
  59.         {
  60.             // TODO Auto-generated method stub
  61.             
  62.         }

  63.         @Override
  64.         public void onStatusChanged(String provider, int status, Bundle extras)
  65.         {
  66.             // TODO Auto-generated method stub
  67.             
  68.         }
  69.         
  70.     }

  71.     class btnListener implements android.view.View.OnClickListener
  72.     {
  73.         @Override
  74.         public void onClick(View v)
  75.         {
  76.             // TODO Auto-generated method stub
  77.             switch(v.getId())
  78.             {
  79.                 case R.id.getAllProviderBtn:
  80.                     List<String> providers = locationManager.getAllProviders();
  81.                     for(Iterator iterator=providers.iterator(); iterator.hasNext(); )
  82.                     {
  83.                         String provider = (String)iterator.next();
  84.                         System.out.println(provider);
  85.                     }
  86.                     break;
  87.                 case R.id.getBestProviderBtn:
  88.                     getBestLocationProvider provider = new getBestLocationProvider();
  89.                     System.out.println(provider.getProvider(locationManager, provider.setCriteria()));
  90.                     break;
  91.                 case R.id.getLocationBtn:
  92.              //绑定一个LocationListnener对象,当用户位置发生改变时,会触发监听器
  93.                   //第一个参数是定位的方式,第二个参数是定位的周期(单位ms)
  94.                   //第三个参数是定位的距离,每隔多少米定位一次
  95.                   //第四个参数是监听器
  96.                   locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new testLocationListener());
  97.                     break;
  98.                 default:
  99.                     break;
  100.             }
  101.         }
  102.     }

  103.     @Override
  104.     public boolean onCreateOptionsMenu(Menu menu) {
  105.         // Inflate the menu; this adds items to the action bar if it is present.
  106.         getMenuInflater().inflate(R.menu.main, menu);
  107.         return true;
  108.     }
  109.     
  110. }
getBestLocationProvider.java

点击(此处)折叠或打开

  1. package com.example.location;

  2. import android.location.Criteria;
  3. import android.location.LocationManager;
  4. import android.widget.Button;

  5. public class getBestLocationProvider
  6. {
  7.     
  8.     //设置查询条件
  9.     public Criteria setCriteria()
  10.     {
  11.         Criteria criteria = new Criteria();
  12.         //要求高精度
  13.         criteria.setAccuracy(Criteria.ACCURACY_FINE);
  14.         //要求省电
  15.         criteria.setPowerRequirement(Criteria.POWER_LOW);
  16.         //要求不能产生费用
  17.         criteria.setCostAllowed(false);
  18.         //不要求速度
  19.         criteria.setSpeedRequired(false);
  20.         
  21.         return criteria;
  22.     }
  23.      //获取满足条件的最佳provider
  24.     public String getProvider(LocationManager locationManager, Criteria criteria)
  25.     {
  26.         return locationManager.getBestProvider(criteria, false);
  27.     }
  28. }
AndroidMenifest.xml

点击(此处)折叠或打开

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android=""
  3.     package="com.example.location"
  4.     android:versionCode="1"
  5.     android:versionName="1.0" >

  6.     <uses-sdk
  7.         android:minSdkVersion="8"
  8.         android:targetSdkVersion="18" />

  9.     <application
  10.         android:allowBackup="true"
  11.         android:icon="@drawable/ic_launcher"
  12.         android:label="@string/app_name"
  13.         android:theme="@style/AppTheme" >
  14.         <activity
  15.             android:name="com.example.location.MainActivity"
  16.             android:label="@string/app_name" >
  17.             <intent-filter>
  18.                 <action android:name="android.intent.action.MAIN" />

  19.                 <category android:name="android.intent.category.LAUNCHER" />
  20.             </intent-filter>
  21.         </activity>
  22.     </application>
  23.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  24. </manifest>
activity_main.xml

点击(此处)折叠或打开

  1. <RelativeLayout xmlns:android=""
  2.     xmlns:tools=""
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:paddingBottom="@dimen/activity_vertical_margin"
  6.     android:paddingLeft="@dimen/activity_horizontal_margin"
  7.     android:paddingRight="@dimen/activity_horizontal_margin"
  8.     android:paddingTop="@dimen/activity_vertical_margin"
  9.     tools:context=".MainActivity" >

  10.     <Button
  11.         android:id="@+id/getLocationBtn"
  12.         android:layout_width="fill_parent"
  13.         android:layout_height="wrap_content"
  14.         android:text="用户定位" />
  15.     <Button
  16.         android:id="@+id/getAllProviderBtn"
  17.         android:layout_width="fill_parent"
  18.         android:layout_height="wrap_content"
  19.         android:layout_below="@+id/getLocationBtn"
  20.         android:text="所有定位方式" />
  21.     <Button
  22.         android:id="@+id/getBestProviderBtn"
  23.         android:layout_width="fill_parent"
  24.         android:layout_height="wrap_content"
  25.         android:layout_below="@+id/getAllProviderBtn"
  26.         android:text="最佳定位方式" />
  27. </RelativeLayout>



阅读(14705) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~