Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android getLastKnownLocation返回null_Android_Google Maps_Location - Fatal编程技术网

Android getLastKnownLocation返回null

Android getLastKnownLocation返回null,android,google-maps,location,Android,Google Maps,Location,我读过一些关于这方面的问题,但我没有找到我需要的答案 所以,情况是,我已经设置好了我的地图,我想获取我当前的gps位置。 我已检查我的变量是否为空,但我的结果来自: getLastKnownLocation(provider, false); 但是给我空值,所以这是我需要帮助的地方。 我添加了粗略+精细位置的权限。但我通常会禁用手机的各种网络数据,因为我对手机账单中不可预测的数据流费用不太满意。因此,我只为这次测试启用并连接了WiFi 为了实现这一点,我还需要启用其他功能吗?我认为WiFi应该

我读过一些关于这方面的问题,但我没有找到我需要的答案

所以,情况是,我已经设置好了我的地图,我想获取我当前的gps位置。 我已检查我的变量是否为空,但我的结果来自:

getLastKnownLocation(provider, false);
但是给我空值,所以这是我需要帮助的地方。 我添加了粗略+精细位置的权限。但我通常会禁用手机的各种网络数据,因为我对手机账单中不可预测的数据流费用不太满意。因此,我只为这次测试启用并连接了WiFi


为了实现这一点,我还需要启用其他功能吗?我认为WiFi应该足够了?

您正在尝试从网络提供商处获取缓存位置。你必须等待几分钟,直到你得到一个有效的修复。由于网络提供商的缓存为空,因此您显然在那里得到了一个空值。

使用此方法获取最后一个已知位置:

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

private Location getLastKnownLocation() {
    mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
    List<String> providers = mLocationManager.getProviders(true);
    Location bestLocation = null;
    for (String provider : providers) {
        Location l = mLocationManager.getLastKnownLocation(provider);
        if (l == null) {
            continue;
        }
        if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
            // Found best last known location: %s", l);
            bestLocation = l;
        }
    }
    return bestLocation;
}
LocationManager mLocationManager;
位置myLocation=getLastKnownLocation();
私有位置getLastKnownLocation(){
mlLocationManager=(LocationManager)getApplicationContext().getSystemService(位置服务);
List providers=mLocationManager.getProviders(true);
位置bestLocation=null;
for(字符串提供程序:提供程序){
位置l=mLocationManager.getLastKnownLocation(提供者);
if(l==null){
继续;
}
if(bestLocation==null | | l.getAccuracy()
添加此代码

if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
     return;
}
在功能之前执行以下操作:

locationManagerObject.RequestLocationUpdate(LocationManager.GPS\u提供程序、更新之间的最短时间、更新的最短距离、新LocationListener())
以及函数:
locationManagerObject.getLastKnownLocation(LocationManager.GPS\u提供程序)
将您的线路替换为

Location location = LocationServices.FusedLocationApi.getLastLocation(googleApiClient);

当你不应该的时候,你正在混合新的和旧的位置API

要获得最后一个已知位置,您只需打电话

compile "com.google.android.gms:play-services-location:11.0.1"
mLocationClient.getLastLocation();
连接位置服务后

阅读如何使用新的位置API

private void getLastLocationNewMethod(){
FusedLocationProviderClient mFusedLocationClient=LocationServices.getFusedLocationProviderClient(此);
mFusedLocationClient.getLastLocation()文件
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时的公共无效(位置){
//如果GPS关闭,GPS位置可能为空
如果(位置!=null){
获取地址(位置);
}
}
})
.addOnFailureListener(新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
Log.d(“MapDemoActivity”,“尝试获取最后一个GPS位置时出错”);
e、 printStackTrace();
}
});
}

试试这个它对我很好:-

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

        private Location getLastKnownLocation() {
            Location oldLoc;
            while (true){
                oldLoc = mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                if (oldLoc == null){
                    continue;
                }
                else {
                    break;
                }
            }
            return oldLoc;
        }

您可以使用网络提供商代替GPS提供商以获得更快的结果。

我在Xamarin.Android中遇到了这个问题

Location Location=locationManager.GetLastKnownLocation(provider);
返回空值。我检查了我的代码,知道我刚刚请求访问\u粗略\u位置的权限。我添加了代码以请求访问\u精细\u位置的权限,现在它没有返回空值。以下是我的代码:

void AskPermissions()
{
    if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) != (int)Permission.Granted ||
            CheckSelfPermission(Manifest.Permission.AccessFineLocation) != (int)Permission.Granted)
        RequestPermissions(new string[] { Manifest.Permission.AccessCoarseLocation, Manifest.Permission.AccessFineLocation }, 0);
    else
        GetLocation();
}

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
    if (CheckSelfPermission(Manifest.Permission.AccessCoarseLocation) == (int)Permission.Granted &&
            CheckSelfPermission(Manifest.Permission.AccessFineLocation) == (int)Permission.Granted)
        GetLocation();
    else
        Log.Info(tag, "Permission not Granted: Please enter desired Location manually.");
}

void GetLocation()
{
    locationManager = (LocationManager)GetSystemService(LocationService);
    provider = locationManager.GetBestProvider(new Criteria(), false);
    Location location = locationManager.GetLastKnownLocation(provider);
    if (location != null)
        Log.Info(tag, "Location Lat: " + location.Latitude + " Lon: " + location.Longitude);
    else
        Log.Info(tag, "Location is null");
}

如果任何来自Xamarin.Android(C#)的人都会发现它很有用。对于Java或Android Studio,代码将类似,只是有一些小的语法更改,如
GetLastKnownLocation()
将是
GetLastKnownLocation()
在Java中,方法名以小写字母开头,而在C中,方法名以大写字母开头。

我喜欢这个更新位置的解决方案:

LocationManager mLocationManager;
Location myLocation = getLastKnownLocation();

private Location getLastKnownLocation() {
    mLocationManager = (LocationManager)getApplicationContext().getSystemService(LOCATION_SERVICE);
    List<String> providers = mLocationManager.getProviders(true);
    Location bestLocation = null;
    for (String provider : providers) {
        Location l = mLocationManager.getLastKnownLocation(provider);
        if (l == null) {
            continue;
        }
        if (bestLocation == null || l.getAccuracy() < bestLocation.getAccuracy()) {
            // Found best last known location: %s", l);
            bestLocation = l;
        }
    }
    return bestLocation;
}

在resume中,添加以下条件:

Location myLocation = getLastKnownLocation();
if (myLocation == null) {
      locationManager.requestLocationUpdates(
      LocationManager.PASSIVE_PROVIDER,
      MIN_TIME_BW_UPDATES,
      MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
      Log.d("GPS", "GPS Enabled");
 }

也许是一些基本的,但检查GPS是否打开。

好的,所以我需要建立缓存?当我的应用程序因此崩溃时,我该怎么做?你必须使用位置侦听器的onLocationChanged方法。获得有效的修复需要时间(几分钟)好的,谢谢。我会一直摆弄直到我看到它弹出一个日志=)即使它没有任何存储,我也需要移动它吗?结果我一直都是正确的,我只是注意到一个错误,我找到了一个解决方案。我的手机没有设置允许谷歌定位GPS。所以,是的。无论如何,谢谢=)很好的实现,非常灵活e、 谢谢!效果很好。谢谢!在手机中启用位置。问题是关于
getLastKnownLocation返回null
…如果对于所有提供商
mLocationManager.getLastKnownLocation
,此代码将不会改变任何内容…因为它可以返回null)它仍将返回null…答案是…抱歉,您无法避免此问题…如果您确实希望该位置不使用GetLastKnownLocation您正在混合getLastLocation的新api和旧api,请遵循此答案。此答案值得一读:感谢您指出存在新api。这应该是公认的答案。非常感谢您使用此api速度快多了谢谢伙计我不知道它存在位置在这里也返回空值。原因是什么?检查位置许可同意…这应该是可以接受的答案。谢谢。