【问题标题】:Location service giving me null on some phones android位置服务在某些手机上给我 null android
【发布时间】:2015-12-01 20:45:44
【问题描述】:

我创建了一个服务来获取我从主线程调用的用户位置。现在,这项服务不仅可以从 GPS 获取我的位置,还可以从网络获取我的位置。为什么它在某些手机上获取用户位置,而在某些手机上却没有?

这是我的服务类:

 import android.app.Service;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.util.Log;

import java.util.List;


public class LocationService extends Service implements LocationListener {

    protected LocationManager locationManager;

    public String providerNow;
    private List<String> providers;

    public Location location;

    public LocationService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
        locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, this);

        providerNow = (GetProvider());
    }

    public Location getLocation() {

        location = locationManager.getLastKnownLocation(providerNow);
        return location;
    }


    public String GetProvider() {

        Criteria criteria = new Criteria();
        criteria.setAccuracy(2);

        providers = locationManager.getProviders(true);
        String providerToSend = providers.get(1);

        return providerToSend;

    }

    public IBinder onBind(Intent intent) {
        Log.i("TestMap", "onBind");
        //TODO for communication return IBinder implementation
        return null;
    }


    public void onLocationChanged(Location location) {
        Static.location = location;

        if (location != null) {
            Log.d("Lat", String.valueOf(location.getLatitude()));
            Log.d("Lon", String.valueOf(location.getLongitude()));
            Static.latitude = location.getLatitude();
            Static.longitude = location.getLongitude();
        }
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {

    }

    @Override
    public void onProviderEnabled(String provider) {
        providerNow = (GetProvider());
    }

    @Override
    public void onProviderDisabled(String provider) {
        providerNow = (GetProvider());
    }
}

这是我调用此服务的主线程的代码:

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash_screen);
        Intent serviceIntent = new Intent(this, LocationService.class);
        startService(serviceIntent);
        proveraInterneta();



        getSizeOfTheScreen();
    }

【问题讨论】:

  • 1) 如果禁用 GPS 提供程序数组长度为 1,您将在 GetProvider() 函数中崩溃 2) 请在您启动服务的位置添加您的代码
  • @Hoochwo 添加了代码,那么,可能是什么问题?

标签: android google-maps gps location


【解决方案1】:

以下是针对您所面临问题的两条建议:

  • 根据编码,使用 Google 的 Fused Location API。 FusedLocationProviderApi 可以通过 LocationServices 访问,如下所示,

    private FusedLocationProviderApi fusedLocationProviderApi = LocationServices.FusedLocationApi;
    

FusedLocationProviderApi 需要 GoogleApiClient 实例来获取 Location,可以通过如下方式获取。

googleApiClient = new GoogleApiClient.Builder(locationActivity)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();
  • 其次,从设备角度确保所有被测设备都开启了 GPS。
  • 最后但并非最不重要的一点是,检查清单中是否添加了此权限。

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    

查看此tutorial 以获得更多参考。

【讨论】:

  • 试过了,关闭gps后找不到我
【解决方案2】:

据我了解您的代码,当您调用 getLocation 方法时,然后从当前工作的提供者(或最新启用的提供者)获取最新位置。启用提供程序时,不能保证从 getLocation 方法获取位置。

如果我在启用 gps 提供程序后立即调用 getLastKnownLocation("gps"),那么得到空结果是很正常的。因为 gps 提供者必须至少触发一次 onLocationChanged 方法,所以我必须等待 gps 修复。这种情况对于网络提供商也是一样的。

在不确定提供者是否已修复的情况下调用 getLastKnownLocation("a provider") 方法,会给您带来不可靠(旧位置)或空结果。在这种情况下,如果某些手机没有给出 null,这意味着这些设备已经缓存了当前提供商的位置,或者他们很幸运,因为提供商已经预热了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多