安卓全球定位系统。位置侦听器不想获得修复:(

Posted

技术标签:

【中文标题】安卓全球定位系统。位置侦听器不想获得修复:(【英文标题】:Android GPS. Location Listener does not want to acquire a fix :( 【发布时间】:2011-11-16 09:06:31 【问题描述】:

下面是一个假设监听 GPS 更新并向主要活动发送通知的代码

但它似乎不起作用:)

没有错误,只有 onLocationChanged 没有被调用!

有趣的是:当我运行一些其他应用程序来获取 GPS 修复,然后启动我的应用程序 => onLocationChanged 被调用时,只有准确性会降低,最终修复会丢失。

我还尝试将 GPS 侦听器添加到此代码中=> 它可以工作,每秒都会报告视野中的卫星,永远不会获得修复。

这到底是怎么回事? :)

公共类PhoneGPSpos

private Handler myHandler = null;
private LocationManager lm;
private LocationListener locationListener;
private Location currentBest;
Context m_context;

public PhoneGPSpos(Context context, Handler handler)

    myHandler = handler;
    m_context = context;


    lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

 //  Bundle bundle = new Bundle();
 //  boolean xtraInjection=lm.sendExtraCommand(LocationManager.GPS_PROVIDER,"force_xtra_injection",bundle);
 //  boolean timeInjection=lm.sendExtraCommand(LocationManager.GPS_PROVIDER,"force_time_injection",bundle);

   currentBest = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);

    locationListener = new LocationListener() 
    

           public void onLocationChanged(Location location)
            
                Log.w("Compass", "Loc");

            if (location != null)
            
                currentBest = location;

                Message msg = new Message();

                msg.arg1 = 5;
                myHandler.sendMessage(msg);

            
            

           public void onStatusChanged(String provider, int status, Bundle 
           extras) 
            Log.d("Compass", "Stat");
            

           public void onProviderEnabled(String provider) 
            Log.d("Compass", "Prov e");
            

           public void onProviderDisabled(String provider) 
            Log.d("Compass", "Prov d");
         
   ; 


public void requestGPS()

    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
    Log.d("Compass", "gps requested");


public void stopGPS()

    Log.d("Compass", "gps stopped");
    lm.removeUpdates(locationListener);


public synchronized  Location getBest()

    return  currentBest;

【问题讨论】:

你在哪里测试?室内? 不是。正如我所说:“其他应用程序能够得到修复”。当我在调用 onLocationChanged 之后切换回我的应用程序时,只有准确性会降低。而修复最终会丢失 【参考方案1】:

好的,发现这是其他人也看到的问题:显然(至少在某些手机上)如果相机处于活动状态,GPS 监听器的工作效果会更差。

Problem with getting GPS data when using CameraPreview

android: Losing GPS signal strength on some phones when I start up the Camera and SurfaceView

Camera Preview and GPS reading in Android

为 http://code.google.com/p/android/issues/detail?id=20098 创建了 Andorid 问题

如果有人有解决方案请分享

【讨论】:

请务必接受您自己的答案,以便其他人可以快速找到您的解决方案。 我在同时请求网络位置时看到了这种情况。现在正在尝试找到与此相关的 SO 问题,以防有人有解决方法...【参考方案2】:
Check for permissions in your projects AndroidManifest.xml file

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

【讨论】:

GPS_PROVIDER 不需要互联网许可。 FINE 位置在。COARSE 不是。我没有使用网络。我只需要GPS【参考方案3】:

你在哪里测试?在室内? 其他应用程序使用哪些提供商?网络提供商?

我的猜测是,正在运行的应用程序使用网络提供商,并且由于您是最后一个已知的,它会从以前的应用程序位置 ping 返回该位置。网络提供商通过提供大致位置来帮助分配 gps 卫星。因此,当您启动应用程序时(在运行其他应用程序之后),您有卫星,但是(因为您可能在室内)没有网络,您可能会一点一点地丢失卫星,从而降低准确性。

故事的寓意:也使用网络提供商,或者确保您可以清楚地看到天空来测试 gps。

【讨论】:

不是。正如我所说:“其他应用程序能够得到修复”。当我在调用 onLocationChanged 之后切换回我的应用程序时,只有准确性会降低。而修复最终会丢失 所以当你调试这个应用程序时,你是在外面的天空清晰的视野中吗? 是的。 1)我启动我的应用程序。 2) 等待 ~ 10 分钟 - 无修复。3) 启动 GPS 状态。在几分钟内得到修复 4) 再次运行我的应用程序。 5)查看它如何以降低的准确性报告位置。 6)一段时间后修复丢失

以上是关于安卓全球定位系统。位置侦听器不想获得修复:(的主要内容,如果未能解决你的问题,请参考以下文章

我可以从侦听器内部引用 OnClickListener 的按钮吗? (安卓)

GPS Android - 只定位一次

一旦您调用取消注册位置侦听器,Gps 状态侦听器就会停止运行

位置侦听器从服务而不是 IntentService 工作

如何创建一个按钮,该按钮将在没有侦听器的情况下获取用户的位置

位置侦听器适用于 Android 6.0 但不适用于 android 8.0+ [关闭]