android 获取地理位置时为null

发现有很多android 手机获取地理位置,很多时候都不一定能够获取到,并且不一定准确,因为那个位置都是上次获取的时候拿到的,得更新。具体实现代码如下

import android.app.Activity;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.widget.TextView;

import java.util.Iterator;
import java.util.List;

public class LocationBase extends Activity {
    private TextView myText;
    private String textStr = "";
    private LocationManager mgr = null;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addText("Location Based-Services Demo...");

        //步骤 1: 获取系统的定位管理器
        mgr = (LocationManager) getSystemService(LOCATION_SERVICE);
        addText("get system Location Manager " + mgr);
    }

    //步骤2.2 持续跟踪中的停止update:在本例中,我们要求不断获得位置更新,我们必须在人工进行removeUpdates(),否则即使应用中所有的Activity都关闭,App仍继续在不断更新位置信息,导致应用资源无法被回收
    protected void onPause() {
        super.onPause();
        PackageManager pm = getPackageManager();
        boolean permissionFine = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.ACCESS_FINE_LOCATION", getPackageName()));
        boolean permissionCoarse = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.ACCESS_COARSE_LOCATION", getPackageName()));
        if (permissionFine == true && permissionCoarse == true) {
            mgr.removeUpdates(onLocationChange);
        }
        addText("Remove Updates...");
    }

    //步骤2:设置持续跟踪
    //步骤 2.1(1) :我们在onResume()中持续跟踪,相应的在onPause()中关闭出现跟踪。我们只在Activity运行时进行跟踪。具体见Activity的生命周期
    protected void onResume() {
        super.onResume();


        mgr.addTestProvider(LocationManager.NETWORK_PROVIDER,

                "requiresNetwork" == "", "requiresSatellite" == "", "requiresCell" == "", "hasMonetaryCost" == "",
                "supportsAltitude" == "", "supportsSpeed" == "",
                "supportsBearing" == "", android.location.Criteria.POWER_LOW,
                android.location.Criteria.ACCURACY_FINE);
        mgr.setTestProviderEnabled(LocationManager.NETWORK_PROVIDER, true);

        PackageManager pm = getPackageManager();
        boolean permissionFine = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.ACCESS_FINE_LOCATION", getPackageName()));
        boolean permissionCoarse = (PackageManager.PERMISSION_GRANTED == pm.checkPermission("android.permission.ACCESS_COARSE_LOCATION", getPackageName()));

        addText("Request Updates automatically ...");

        List<String> list = mgr.getAllProviders(); //mgr即LocationManager
        for (Iterator<String> i = list.iterator(); i.hasNext(); ) {
            System.out.println("\t" + i.next());
        }

        Criteria criteria = new Criteria();
        String providerName = mgr.getBestProvider(criteria, true /*enabledOnly*/); //criteria不能填null,否则出现异常
        LocationProvider provider = mgr.getProvider(providerName);
        location = mgr.getLastKnownLocation(providerName);
        if (permissionFine == true && permissionCoarse == true) {
//步骤2.1 (2):由于人的位置是不断变化,我要设置一个位置变化的范围,包括同时满足最小的时间间隔和最小的位移变化,如果两个条件要同时满足,将位置监听器将被触发。实际上该方法有多个参数格式,特别是requestLocationUpdates (long minTime, float minDistance, Criteria criteria,PendingIntent intent),当位置变化时可调用其他的Activity。 在本例中,我们制定用GPS,则在权限中必须要求精确定位许可。
           while(location == null) {
            mgr.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 100/*10秒,为测试方便*/, 0.1f/*1公里*/, onLocationChange/*位置监听器*/);
           }
        }

        if (location != null)
            System.out.println("Get Location from " + providerName + " : " + location.getLatitude() + "," + location.getLongitude());
    }

    Location location;

    //步骤3:位置监听器LocationListener 的设置,当位置发生变化是触发onLocationChanged( )
    LocationListener onLocationChange = new LocationListener() {
        public void onLocationChanged(Location location2) {
            location = location2;
            addText("Location Changed : (" + location.getLongitude() + "," + location.getLatitude() + ")");
        }

        public void onProviderDisabled(String arg0) {
            addText("onProviderDisabled");
        }

        public void onProviderEnabled(String arg0) {
            addText("onProviderEnabled");
        }

        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
            addText("onStatusChanged");
        }
    };

    private void addText(String s) {
        textStr = textStr.concat(s + "\n\n");
        myText.setText(textStr);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值