android getlastknownlocation在模拟器中始终为空

k75qkfdt  于 2023-02-14  发布在  Android
关注(0)|答案(4)|浏览(393)

这似乎是一个常见的问题,但我真的不明白为什么会发生这种情况,即使我读了吨类似的问题。
我正在模拟器设备上玩一个基本的位置类,我设置了所有内容-权限(FINE和COARSE),我在DDMS中设置了坐标,我还尝试使用telnet和〈geo fix...〉,但无论如何,它总是在getlastknownlocation行上崩溃并出现空指针异常,你知道这里出了什么问题吗?

public class MainActivity extends Activity implements LocationListener {
private static LocationManager ok;
private Location L;

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

    ok=(LocationManager)this.getSystemService(ok.GPS_PROVIDER);
    L=ok.getLastKnownLocation(ok.GPS_PROVIDER);
}

@Override
public void onLocationChanged(Location Loc) {
    try {
        double latop=Loc.getLatitude();
        double longe=Loc.getLongitude();
        
        Log.i("OK", "and"+longe+""+latop);
    } catch (NullPointerException e) {
    }
}
guykilcj

guykilcj1#

如果最近没有应用向您所需的提供商请求位置修复,getLastKnownLocation()通常会返回null
在模拟器上,它似乎更进了一步:由于您的应用调用了requestLocationUpdates(),因此除非已将位置传递到模拟器,否则您不会获得位置。
使用getLastKnownLocation()的一般模式是,如果你想获得一个真实的Location,使用requestLocationUpdates()removeLocationUpdates()来确保LocationManager通过你选择的提供商主动寻找位置。当然,如果你选择的话,你也可以使用LocationListeneronLocationChanged(),而不是getLastKnownLocation()

dphi5xsq

dphi5xsq2#

Android getlastknownlocation在模拟器上为空

@CommonsWare的答案很明确。要在模拟器上获得非空值,请转到Google Maps应用程序,然后获得某个位置

fykwrbwg

fykwrbwg3#

还有另一种选择,使用locationManager.addTestProvider()创建自己的提供程序;这样你就可以自己做测试了。

jhkqcmku

jhkqcmku4#

请求位置更新+获取最后位置

以下是基于Commonsware的答案的代码示例。我将在onCreate()方法中调用getLocationUpdates(),以便应用在您调用getLastLocation()方法之前获得位置更新。

private FusedLocationProviderClient fusedLocationClient;
private LocationRequest locationRequest;
private LocationCallback locationCallback;

onCreate(Bundle sis){
    super.onCreate(sis);
    getLocationUpdates();
}

public void getLocationUpdates(){
    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
    locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(1000);
    locationRequest.setFastestInterval(5000);
    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(@NonNull LocationResult locationResult) {
            fusedLocationClient.removeLocationUpdates(locationCallback);
        }
    };
    fusedLocationClient.requestLocationUpdates(locationRequest, locationCallback, Looper.getMainLooper());
}

public void getLastKnownLocation(){
    
       fusedLocationClient.getLastLocation().addOnSuccessListener(this, location -> {
        if (location != null) {
            Log.d("LOCATION", location);
        } else {
            Log.d("LOCATION", "Location is null");
        }
    });

}

对此有更多想法。

对于一些人来说,这种解决方案根本没有意义。但如果你的应用不需要不断更新位置,那么这可能是一个潜在的解决方案,立即获得位置。但总是有这个解决方案的优点和缺点。

相关问题