Play 位置服务 getLastLocation 返回 null

2023-11-29

我正在尝试聆听位置变化,但有时onLocationChanged回调永远不会被调用并且getLastLocation回报null,而谷歌地图始终运行完美。

Note

如果我重新启动设备,定位服务将仅工作约 2 天;之后我的应用程序和SDK 示例当 Google 地图仍然工作时,它就可以工作。

这是我的服务代码:

public class VisitService extends Service implements
        GooglePlayServicesClient.ConnectionCallbacks,
        GooglePlayServicesClient.OnConnectionFailedListener, 
        LocationListener {

    private final IBinder mBinder = new VisitBinder();


    // A request to connect to Location Services
    private LocationRequest mLocationRequest;

    // Stores the current instantiation of the location client in this object
    private LocationClient mLocationClient;


    private boolean mLocationServiceConnected = false;

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        initLocation();
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public IBinder onBind(Intent intent) {
        initLocation();
        return mBinder;
    }

    public void startVisit() {
        if (!servicesConnected()) {
            listener.onVisitStartError();
            return;
        }

        if (mLocationServiceConnected) {
            if (isAcceptableLocation(mLocationClient.getLastLocation())) {
                Toast.makeText(this, "You have arrived!", Toast.LENGTH_LONG);
            } else {
                mVisitListener.onVisitStartError();
            }
        }    
    }

    private boolean isAcceptableLocation(Location location) {
        if (location == null) {
            Toast.makeText(this, "Location is null", Toast.LENGTH_LONG).show();
            return false;
        }

        return true;
    }


    private void initLocation() {

        if (mLocationRequest == null) {
            // Create a new global location parameters object
            mLocationRequest = LocationRequest.create();
            /*
             * Set the update interval
             */
            mLocationRequest
                    .setInterval(LocationUtils.UPDATE_INTERVAL_IN_MILLISECONDS);

            // Use high accuracy
            mLocationRequest
                    .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

            // Set the interval ceiling to one minute
            mLocationRequest
                    .setFastestInterval(LocationUtils.FAST_INTERVAL_CEILING_IN_MILLISECONDS);

        }

        if (mLocationClient == null) {
            mLocationClient = new LocationClient(this, this, this);
            mLocationClient.connect();
        }
    }

    /**
     * Verify that Google Play services is available before making a request.
     * 
     * @return true if Google Play services is available, otherwise false
     */
    private boolean servicesConnected() {

        // Check that Google Play services is available
        int resultCode = GooglePlayServicesUtil
                .isGooglePlayServicesAvailable(this);

        // If Google Play services is available
        if (ConnectionResult.SUCCESS == resultCode) {
            // In debug mode, log the status
            Log.d(LocationUtils.APPTAG,
                    getString(R.string.play_services_available));

            return true;
        } else {

            return false;
        }
    }

    public class VisitBinder extends Binder {
        public VisitService getService() {
            return VisitService.this;
        }
    }


    /**
     * In response to a request to start updates, send a request to Location
     * Services
     */
    private void startPeriodicUpdates() {

        mLocationClient.requestLocationUpdates(mLocationRequest, this);
        Toast.makeText(this, "Location Update Requested", Toast.LENGTH_LONG).show();
    }

    /**
     * In response to a request to stop updates, send a request to Location
     * Services
     */
    private void stopPeriodicUpdates() {
        mLocationClient.removeLocationUpdates(this);

    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.d(LocationUtils.APPTAG, "Location Services Connection faild");


    }

    @Override
    public void onConnected(Bundle bundle) {
        Log.d(LocationUtils.APPTAG, "Location Services Connected");
        mLocationServiceConnected = true;
        startPeriodicUpdates();
    }

    @Override
    public void onDisconnected() {
        mLocationServiceConnected = false;
    }

    @Override
    public void onLocationChanged(Location location) {
        Toast.makeText(this, "Location has been changed", Toast.LENGTH_LONG).show();
    }
}

安卓清单

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

首先,这是一个错误。我也面临这个问题。

您可以尝试一个简单的解决方法。

在尝试获取最后位置之前请求位置更新,即在尝试使用 getLastLocation() 查找最后位置之前请求位置更新;

就像:

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria crta = new Criteria();
crta.setAccuracy(Criteria.ACCURACY_FINE);
crta.setAltitudeRequired(true);
crta.setBearingRequired(true);
crta.setCostAllowed(true);
crta.setPowerRequirement(Criteria.POWER_LOW); 
String provider = locationManager.getBestProvider(crta, true);
Log.d("","provider : "+provider);
// String provider = LocationManager.GPS_PROVIDER; 
locationManager.requestLocationUpdates(provider, 1000, 0, locationListener);
Location location = locationManager.getLastKnownLocation(provider); 

该实现基于LocationManager。请选择位置客户端。

希望能帮助到你!

UPDATE

在这里,您还可以使用 onLocationChanged() 方法,因为每次位置更改时它都会更新您,而 getLastLocation() 方法返回最知名的位置,该位置可能为 NULL。

根据文档,GetLastLocation() 方法在极少数情况下将返回 NULL。但这种情况也经常发生在我身上。

最新更新

伙计们,关于 GPS 只有一处更新:

首先我们需要利用GoogleApiClient反而LocationClient class.

其次我们需要实施GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener

第三,我们需要重写它onConnected() , onConnectionSuspended() and onConnectionFailed() method.

休息一下,你就可以出发了。

CHEERS!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Play 位置服务 getLastLocation 返回 null 的相关文章

随机推荐

  • 使用jquery动态改变背景颜色

    现在我的页面的一部分有一个对象列表 当您将鼠标悬停在它们上方时 背景会变成浅黄色 并在鼠标移开时恢复为白色 我希望其中一个对象在满足条件时变成绿色背景 如果不满足则恢复正常 我遇到这种情况有一个问题 如果满足条件 它会改变颜色 如果不满足
  • 如何避免在 Excel 文件下载过程中出现 Response.End()“Thread was being aborted”异常

    我尝试将数据集转换为 Excel 并下载该 Excel 我得到了所需的 Excel 文件 但是每次 Excel 下载都会引发 System Threading ThreadAbortException 如何解决这个问题 请帮我 我在我的 a
  • 手机上测试Admob时DEVICE_ID_EMULATOR和TEST_EMULATOR的区别

    使用 TEST EMULATOR 和 DEVICE ID EMULATOR 有什么区别 我想在我的手机上测试admob广告系统 NOT在 PC 上的模拟器上 AdRequest ad new AdRequest Builder addTes
  • 如何更改进度条的颜色

    我想改变颜色最后更新文本 默认情况下它是黑色的 有没有办法引入一些代码来改变我为栏文本所做的文本颜色 帮我介绍一下缺少的代码 div span 2 span div div div Last updated 7 01 2013 progre
  • 从另一个 php 文件调用未定义的函数

    好吧 这就是我的代码的样子 索引 php require once WebsiteRoot include testfile php TestFunction include testfile php function TestFuncti
  • QLPreviewController 视图

    我只是想访问 QLPreviewController view 事实上 我想捕获其视图上的点击事件以显示 隐藏工具栏等 我正在尝试 QLPreviewController qlpc QLPreviewController new qlpc
  • 如何进行通用订单[重复]

    这个问题在这里已经有答案了 我有一个数据库作为数据框 我想对所有列进行排序 但保持元素之间的关系 例如 如果我执行以下操作 gt DF A B C D 1 11 2 432 4 2 11 3 432 4 3 13 4 241 5 4 42
  • 使用 mongoose model.find() 获取仅 1 个字段的所有条目

    我尝试使用 model find 的不同变体 但没有一个能达到我想要的效果 下面的代码是我正在使用的代码 但它显示每个字段 而我只想要 iframe 字段 app get api videos function req res Video
  • 如何将选择值存储到 php 变量中

    我有一个简单的下拉选择菜单 div div
  • 将匹配多个批量输入的 LINQ 表达式 [重复]

    这个问题在这里已经有答案了 如何编写匹配多个批量输入的 LINQ 表达式 这是我的数据库表 Members Division Department 1 3 4 9 5 1 6 3 9 2 我想选择标有 的成员 这是我的输入 int divi
  • JPA + Spring 异常后回滚事务

    我正在使用 Spring 和 JPA 下面带有 HIbernate 当抛出 PersistenceException 时 我想捕获它并返回错误消息 以便它不会传播给调用者 Transactional public String save O
  • 空引用 - 任务ContinueWith()

    对于以下代码段 NET v4 0 30319 我在第二个延续中收到如下所示的空引用异常 最有趣的是 这个问题只发生在 8GB RAM 的机器上 但其他用户有 16GB 或更多内存 他们没有报告任何问题 这是一个非常间歇性的问题 这让我怀疑垃
  • 对 URL 进行编码/解码

    在 Go 中编码和解码整个 URL 的推荐方法是什么 我知道这些方法url QueryEscape and url QueryUnescape 但它们似乎并不正是我正在寻找的 具体来说 我正在寻找像 JavaScript 这样的方法enco
  • 如何在 Scala 3 中证明 `Tuple.Map[H *: T, F] =:= (F[H] *: Tuple.Map[T, F])`

    我正在尝试编写一个包含元组类型给定实例的特征 是的 我知道summonAll存在 trait TupleInstances C T lt Tuple val instances Tuple Map T C given C TupleInst
  • 无法在 codeigniter 3 中使用 SMTP gmail 配置发送电子邮件

    下面是我的代码 我参考了堆栈溢出和 codeigniter 用户指南中的所有示例 我仍然无法解决这个问题 public function send config protocol smtp config smtp crypto ssl co
  • Access/Excel VBA - 时间延迟

    Note 刷新 Excel 中链接到 Access 数据库的表 Excel 中的表需要按顺序刷新 例如 Test Sheet1 Test Sheet2 Test Sheet3 Excel 文件由多个用户访问 问题 在 Access vba
  • 查看更多和查看更少按钮

    下面的脚本每次单击按钮时都会显示 4 个项目 我需要的是在单击后更改按钮的文本以 显示更多 然后在显示所有项目时更改为 显示更少 我尝试添加这个 if nowShowing gt numInList partners button a to
  • ngRepeat 按深层属性过滤

    如果我有一个以对象作为属性值的复杂对象 如何按嵌套属性之一进行过滤 这可以通过 OOB ng repeat 过滤器来完成吗 Data Name John Smith Manager id 123 Name Bill Lumburg ngRe
  • 使用 href onclick 更新 div 而不重新加载页面?

    我用这个现有的问题来帮助我 HTML 更改 更新页面内容而不刷新 重新加载页面 template comparison php 文件从 header php 代码中获取代码 但实际的 获取代码 并未显示 否则 模板页面将没有标题 templ
  • Play 位置服务 getLastLocation 返回 null

    我正在尝试聆听位置变化 但有时onLocationChanged回调永远不会被调用并且getLastLocation回报null 而谷歌地图始终运行完美 Note 如果我重新启动设备 定位服务将仅工作约 2 天 之后我的应用程序和SDK 示