android确定经纬度的小误区

本文详细介绍了如何在Android应用中使用LocationManager类进行位置服务管理,包括请求位置更新、处理位置变化等操作,并展示了必要的权限声明及代码实现。

android LocationManager的使用

android提供LoacationManager类来获取自己的经纬度。也可以通过反向地理编码发送http给google返回一个确定值给自己再在解析显示到textview上(Geocoding API)。

首先需要申明权限
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission
android:name="android.permission.INTERNET" />

FINE权限对应的是GPS功能权限,
COARSE对应的是NETWORK权限,
Internet对应的是联网权限。

public class MainActivity extends AppCompatActivity {

    @Bind(R.id.one_text)
    TextView oneText;

    private LocationManager locationManager;
    private String provider;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);


        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        //这里传入true表示启用的位置提供器都得到返回
        List<String> providerList = locationManager.getProviders(true);
        if (providerList.contains(LocationManager.GPS_PROVIDER)) {
            provider = LocationManager.GPS_PROVIDER;
        } else if (providerList.contains(LocationManager.NETWORK_PROVIDER)) {
            provider = LocationManager.NETWORK_PROVIDER;
        } else {
            Toast.makeText(this, "没有打开任何位置提供器", Toast.LENGTH_SHORT).show();
            return;
        }
        /**
        //如果直接拿GPS定位,这个Location很有肯能为Null.而出现空指针
        //可能是BUG,GPS在室内,会为location或者很难找到
        //而是用network则不会出现这个情况
          */
        Location location = locationManager.getLastKnownLocation(provider);

        if (location != null) {
            /**
             * 这个lacation是空的
             * Toast也不会弹出来,说明程序不运行进来,location是空的
             */
            Toast.makeText(this, "dadadaadadaadaddadadadada", Toast.LENGTH_SHORT).show();
            showLocation(location);
        }

        //这个if也是要你检查权限,不加也能运行,但会红线提示而已
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

            return;
        }

        /**
         * 四个参数,第一个是GPS/NETWORK,第二个是刷新时间(毫秒),第三个是刷新距离(米),第四个是接口实例
         */
 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, locationListener);   //调用GPS
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 3000, 0, locationListener);//调用NETWORK
    }


    private void showLocation(Location location) {
        String myLocation = "经度:" + location.getLatitude() + "\n"
                + "纬度:" + location.getLongitude();
        Toast.makeText(this, "" + myLocation, Toast.LENGTH_SHORT).show();
        oneText.setText(myLocation);
    }


    LocationListener locationListener = new LocationListener() {
        /**
         * 移动距离超过,调用此方法
         * @param location
         */
        @Override
        public void onLocationChanged(Location location) {
            showLocation(location);
        }

        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {

        }

        @Override
        public void onProviderEnabled(String s) {

        }

        @Override
        public void onProviderDisabled(String s) {

        }
    };


    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (locationManager != null) {

            //这个if也是要你检查权限,不加也能运行,但会红线提示而已
            if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                return;
            }
            locationManager.removeUpdates(locationListener);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值