zoukankan      html  css  js  c++  java
  • Android开发--用户定位服务--UserLocation

    Android开发--用户定位服务--UserLocation

    2013-01-28 08:32:26     我来说两句       作者:BruceZhang

    收藏    我要投稿

    [java] 

    <span style="background-color: rgb(243, 248, 251); font-family: simsun;">用户定位介绍:</span>  

     

    User Location的作用:

    1.获取用户的位置

    2.追踪用户的移动

     

    User Location的关键API

    1.Location Manager:用于管理Android的用户定位服务

    2.Location Providers:提供多种定位方式供开发者选择。

      <1>GPS Provider

      <2>Network Provider

      <3>Passive

     

    定位方式的分类:

    1.GPS定位:使用GPS卫星进行定位,需要在AndroidManifest.xml当中声明如下权限:

        android.permission.ACCESS_FINE_LOCATION

     

    2.NETWORK定位:使用信号接收塔和WIFI接入点进行定位,需要在AndroidManifest.xml当中声明如下权限:

        android.permission.ACCESS_FINE_LOCATION

      或

        android.permission.ACCESS_COARSE_LOCATION

    以上两种定位方式的区别是GPS定位精度更高,但同时也更耗电

     

    获取用户的当前位置:

    1.AndroidManifest.xml当中声明相应的权限;

    2.获取LocationManager对象;

    3.选择LocationProvider

    4.绑定LocationListener对象。

     

     

    LocationListener有四个方法:

    1.onLocationChanged(Location location):当设备的位置发生改变时调用

        我们可以调用location.getLongitude()location.getLatitude()来得到设备所处的经度和纬度

    2.onProviderDisabled(String provider):当提供数据Provider禁用时调用

    3.onProviderEnabled(String provider):当提供数据的Provider使用时调用

    4.onStatusChanged(String provider,int status,Bundle extras):当状态改变时

     

     

    我们需要实现LocationListener的以上四个方法:

    [java]  

    <span style="font-size:18px;">private class TestLocationListener implements LocationListener{  

        @Override  

        public void onLocationChanged(Location location){  

            System.out.println(location.getLongitude());  

            System.out.println(location.getLatitude());  

        }  

        

        @Override  

        public void onProviderDisabled(String provider){  

            // do something you need  

        }  

       

        @Override  

        public void onProviderEnabled(String provider){  

            // do something you need  

        }  

      

        @Override  

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

            // do something you need  

        }  

    }</span>  

     

    测试当前设备的LocationProvider

    由于一般的设备存在不止一种定位方法,所以在这里给出查找定位服务的方法:

    [java]  

    <span style="font-size:18px;">List<String> providers=locationManager.getAllProviders();  

                for(Iterator<String> iterator=providers.iterator();iterator.hasNext();){  

                    String string=(String)iterator.next();  

                    Log.d("BruceZhang", string+" ");</span>  

     

    由于有多个Provider,那么就需要做出选择,在这里给出选择最好的Provider的方法:

    此时需要用到一个类--Criteria

    下面是在Android SDK文档上给出的解释:

    A class indicating the application criteria for selecting a location provider. Providers maybe ordered according to accuracy, power usage, ability to report altitude, speed, and bearing, and monetary cost.

    它提供了一系列的方法,设置用户的需求,并最终给出用户所需要的最佳的Provider,下面是文档上对设置条件的解释:

    [java] view plaincopy

    <span style="font-size:18px;">void   setAccuracy(int accuracy)  

    Indicates the desired accuracy for latitude and longitude.</span>  

    [java]  

    <span style="font-size:18px;">  

    void     setAltitudeRequired(boolean altitudeRequired)  

    Indicates whether the provider must provide altitude information.</span>  

    [java]  

    <span style="font-size:18px;">  

    void     setBearingAccuracy(int accuracy)  

    Indicates the desired bearing accuracy.</span>  

    [java 

    <span style="font-size:18px;">  

    void     setBearingRequired(boolean bearingRequired)  

    Indicates whether the provider must provide bearing information.</span>  

    [java]  

    <span style="font-size:18px;">  

    void     setCostAllowed(boolean costAllowed)  

    Indicates whether the provider is allowed to incur monetary cost.</span>  

    [java]  

    <span style="font-size:18px;">  

    void     setHorizontalAccuracy(int accuracy)  

    Indicates the desired horizontal accuracy (latitude and longitude).</span>  

    [java] 

    <span style="font-size:18px;">  

    void     setPowerRequirement(int level)  

    Indicates the desired maximum power level.</span>  

    [java]  

    <span style="font-size:18px;">  

    void     setSpeedAccuracy(int accuracy)  

    Indicates the desired speed accuracy.</span>  

    [java] view plaincopy

    <span style="font-size:18px;">  

    void     setSpeedRequired(boolean speedRequired)  

    Indicates whether the provider must provide speed information.</span>  

    [java] view plaincopy

    <span style="font-size:18px;">  

    void     setVerticalAccuracy(int accuracy)  

    Indicates the desired vertical accuracy (altitude).</span>  

     

    追踪用户的位置:

    对用户的位置进行更新用到的方法和解释如下:

    [java]  

    //          public void requestLocationUpdates (String provider,   

    //          long minTime, float minDistance, LocationListener listener)   

    //          Added in API level 1  

    //          Register for location updates using the named provider, and a pending intent.   

    //  

    //          Parameters  

    //          provider  the name of the provider with which to register   

    //          minTime  minimum time interval between location updates, in milliseconds   

    //          minDistance  minimum distance between location updates, in meters   

    //          listener  a LocationListener whose onLocationChanged(Location) method will be called for each location update   

                  

                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,   

                        0, new TestLocationListener());  

     

    下面,给出一个例子,实现用户的定位,取得支持的LocationProvider,根据条件获取最佳的Provider

    一下是实现的源代码:

    [java]  

    public class MainActivity extends Activity {  

        private Button button;  

        private Button button2;  

        private Button button3;  

        private Button button4;  

        private LocationManager locationManager;  

      

        @Override  

        protected void onCreate(Bundle savedInstanceState) {  

            super.onCreate(savedInstanceState);  

            setContentView(R.layout.activity_main);  

            button=(Button)findViewById(R.id.button1);  

            button2=(Button)findViewById(R.id.button2);  

            button3=(Button)findViewById(R.id.button3);  

            button4=(Button)findViewById(R.id.button4);  

            button.setOnClickListener(new ButtonListener());  

            button2.setOnClickListener(new ProviderButtonListener());  

            button3.setOnClickListener(new BestProviderButtonListener());  

            button4.setOnClickListener(new MyLocation());  

              

            locationManager=(LocationManager)MainActivity.this.  

                    getSystemService(Context.LOCATION_SERVICE);  

        }  

          

        private class ButtonListener implements OnClickListener{  

      

            @Override  

            public void onClick(View v) {  

                // TODO Auto-generated method stub  

    //          LocationManager locationManager=(LocationManager)MainActivity.this.  

    //                  getSystemService(Context.LOCATION_SERVICE);  

                /* 

                 * 各个参数的意义: 

                 * 1.定义当前所使用的Location Provider 

                 * 2.位置更新一次的最小时间间隔 

                 * 3.位置更新的最小距离 

                 * 4.绑定监听器--位置发生变化会调用其中的方法 

                 */  

                Log.d("BruceZhang", "Bond Success");  

    //          public void requestLocationUpdates (String provider,   

    //          long minTime, float minDistance, LocationListener listener)   

    //          Added in API level 1  

    //          Register for location updates using the named provider, and a pending intent.   

    //  

    //          Parameters  

    //          provider  the name of the provider with which to register   

    //          minTime  minimum time interval between location updates, in milliseconds   

    //          minDistance  minimum distance between location updates, in meters   

    //          listener  a LocationListener whose onLocationChanged(Location) method will be called for each location update   

                  

                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0,   

                        0, new TestLocationListener());  

            }  

              

        }  

          

        private class ProviderButtonListener implements OnClickListener{  

      

            @Override  

            public void onClick(View v) {  

                // TODO Auto-generated method stub  

                List<String> providers=locationManager.getAllProviders();  

                for(Iterator<String> iterator=providers.iterator();iterator.hasNext();){  

                    String string=(String)iterator.next();  

                    Log.d("BruceZhang", string+" ");  

                }  

            }  

              

        }  

          

        private class BestProviderButtonListener implements OnClickListener{  

      

            @Override  

            public void onClick(View v) {  

                // TODO Auto-generated method stub  

                Criteria criteria=new Criteria();  

                criteria.setAccuracy(Criteria.ACCURACY_FINE);  

                criteria.setPowerRequirement(Criteria.POWER_LOW);  

                criteria.setAltitudeRequired(false);  

                criteria.setSpeedRequired(false);  

                criteria.setCostAllowed(false);  

                //第二个参数设置为false时,不管当前的那个provider是否可用,都需要进行查找,并根据条件设为最优  

                String provider=locationManager.getBestProvider(criteria, false);  

                Log.d("BruceZhang", "The best provider is:"+provider);  

            }  

              

        }  

          

        private class MyLocation implements OnClickListener{  

      

            @Override  

            public void onClick(View v) {  

                // TODO Auto-generated method stub  

                //对用用户定位服务主要是中间两个参数的设置  

                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000,   

                        2000, new TestLocationListener());  

            }  

              

        }  

          

        private class TestLocationListener implements LocationListener{  

        

            //这个函数的参数是用户当前的位置  

            @Override  

            public void onLocationChanged(Location arg0) {  

                // TODO Auto-generated method stub  

    //          Toast.makeText(MainActivity.this, "您当前的经度是:"+arg0.getLongitude()+" "+  

    //          "您当前的纬度是:"+arg0.getLatitude(),  

    //                  Toast.LENGTH_SHORT).show();  

                Log.d("BruceZhang", arg0.getLongitude()+"");  

                Log.d("BruceZhang", arg0.getLatitude()+"");  

            }  

      

            @Override  

            public void onProviderDisabled(String arg0) {  

                // TODO Auto-generated method stub  

                  

            }  

      

            @Override  

            public void onProviderEnabled(String arg0) {  

                // TODO Auto-generated method stub  

                  

            }  

      

            @Override  www.2cto.com

            public void onStatusChanged(String arg0, int arg1, Bundle arg2) {  

                // TODO Auto-generated method stub  

                  

            }  

              

        }  

      

        @Override  

        public boolean onCreateOptionsMenu(Menu menu) {  

            // Inflate the menu; this adds items to the action bar if it is present.  

            getMenuInflater().inflate(R.menu.activity_main, menu);  

            return true;  

        }  

      

    }  

     

  • 相关阅读:
    java数组
    python中的换行与不换行
    金融业务知识2---资金的时间价值与跨时期优化
    金融业务知识1---金融和金融系统
    你真的理解正向代理和反向代理吗?
    webpack(9)plugin插件功能的使用
    webpack(8)vue组件化开发的演变过程
    webpack(7)webpack使用vue配置
    webpack(6)webpack处理图片
    webpack(5)webpack处理css文件
  • 原文地址:https://www.cnblogs.com/wangmars/p/3239518.html
Copyright © 2011-2022 走看看