Android GPS定位及实例

使用GPS 定位,首先,需要在清单文件(AndroidManifest.xml)中注册获取定位的权限:

1.获取位置管理器对象LocationManager

import android.location.LocationManager;  
    LocationManager lm;  //
     lm =(LocationManager) this.getSystemService(Context`.LOCATION_SERVICE);  //


2.一般使用LocationManager的getLastKnownLocation(LocationManager.GPS_PROVIDER);方法获取Location对象

String provider = LocationManager.GPS_PROVIDER;// 指定LocationManager的定位方法
Location location = locationManager.getLastKnownLocation(provider);// 调用getLastKnownLocation()方法获取当前的位置信息

不过不建议用这种方法,有几点原因:
一,在很多提供定位服务的应用程序中,不仅需要获取当前的位置信息,还需要监视位置的变化,在位置改变时调用特定的处理方法 ,其中LocationManager提供了一种便捷、高效的位置监视方法requestLocationUpdates(),可以根据位置的距离变化和时间间隔设定,产生位置改变事件的条件,这样可以避免因微小的距离变化而产生大量的位置改变事件 。
二,当你开启GPS,provider的值为GPS。这时的定位方式为GPS,由于GPS定位慢,所以它不可能立即返回你一个Location对象,所以就返回null了。
关于这个问题,参考链接:
1.android定位的实现

2.Android位置服务介绍,并介绍如何通过LocationManager对象获取位置信息

3.Android开发获取GPS位置,包含apn\wifi\gps 几种方法

3.推荐locationManager.requestLocationUpdates();

方法LocationManager中设定监听位置变化的代码如下:

lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10,new MyLocationListener());

接下来介绍上面这行代码的各个参数,第一个参数是我们之前指定LocationManager的定位方法,GPS定位或网络定位,第二个参数指的是产生位置改变事件的时间间隔,单位为微秒,第三个参数指的是距离条件,单位为米,第四个参数是回调函数,用于处理位置改变事件,即设置LocationListener监听器。总的来说,那一行代码将产生位置改变事件的条件设定为距离改变10米,时间间隔为2秒。

4.使用location对象具有的getLongitude()和getLatitude()获取经纬度数据

tv_01.setText("经度:"+loc.getLongitude());
tv_02.setText("纬度:"+loc.getLatitude());

5.具体实现的简单demo代码如下

package introduction.android.gpsLocationin;
/*
 * 本工程GPSLocation的功能是使用GPS实时定位,实时显示手机的经纬度
 */
import introduction.android.gpsLocation.R;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.LocationListener;
import android.location.LocationManager;  //
import android.location.Location;   //
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
    private Button btn_listen;
    private TextView tv_01,tv_02;
    LocationManager lm;  //
    Location loc;  //

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lm =(LocationManager) this.getSystemService(Context.LOCATION_SERVICE);  //
        //检测GPS状态(是否开启)
        if(!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)){  //若未打开GPS
            Toast.makeText(MainActivity.this,"请开启GPS服务",Toast.LENGTH_LONG).show();
            Intent myintent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(myintent);  //运行手机的设置程序
        }   

        btn_listen=(Button) findViewById(R.id.btn_listen);
        tv_01=(TextView) findViewById(R.id.tv_01);
        tv_02=(TextView) findViewById(R.id.tv_02);

        btn_listen.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,new MyLocationListener());
            }
        }); 
    }
    //位置监听器方法
    class MyLocationListener implements LocationListener{  //位置监听器,作为方法参数
        @Override
        public void onLocationChanged(Location loc) {
            // TODO Auto-generated method stub
            tv_01.setText("经度:"+loc.getLongitude());
            tv_02.setText("纬度:"+loc.getLatitude());
        }
        @Override
        public void onProviderDisabled(String provider) {
            //当provider被用户关闭时调用
            Log.i("GpsLocation","provider被关闭!");
        }
        @Override
        public void onProviderEnabled(String provider) {
            //当provider被用户开启后调用
            Log.i("GpsLocation","provider被开启!");
        }
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
            //当provider的状态在OUT_OF_SERVICE、TEMPORARILY_UNAVAILABLE和AVAILABLE之间发生变化时调用
            Log.i("GpsLocation","provider状态发生改变!");
        }       
    }
}

6,通过经纬度获取城市位置

   getPosition(double longitude, double latitude){
        // 通过经纬度获取地址,由于地址会有多个,这个和经纬度精确度有关            
        // 本实例中定义了最大的返回数2,即在集合对象中有两个值
        List<Address> list = null;
        Geocoder ge = new Geocoder(getActivity());
        try {
            list = ge.getFromLocation(latitude, longitude, 2);
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (list !=null && list.size()>0){
            for (int i = 0; i < list.size(); i++){
                Address ad = list.get(i);
                cityName = ad.getLocality();//获取城市
            }
        }
    }


————————————————

转载于:https://blog.csdn.net/Bruce_shan/article/details/50536203

猜你喜欢

转载自blog.csdn.net/weixin_42602900/article/details/122988213