在我重新激活 WiFi/移动网络之前,服务中的 Android 位置侦听器不起作用

Posted

技术标签:

【中文标题】在我重新激活 WiFi/移动网络之前,服务中的 Android 位置侦听器不起作用【英文标题】:Android Location listener in Service does not work until I reactivate WiFi/mobile network 【发布时间】:2013-06-14 16:23:57 【问题描述】:

我的位置监听器工作正常,收集数据没有任何问题。但有时它不会收集任何数据。此时我必须关闭并重新启动我的位置提供程序。重新启动可以解决问题,但是,这可能不是用户期望做的最好的事情。

当我使用 GPS 作为提供者时,没有问题。

位置监听器在服务中工作。我无法理解这个问题。是关于 android 还是我的代码?

提前致谢。

【问题讨论】:

"当我使用 GPS 作为提供者时,没有问题。"所以您面临的问题仅与网络提供商有关?你能显示一些代码吗? 确保你的服务没有被杀死或者 CPU 没有休眠。 嗨 Mehul,设备尝试获取位置信息。但是位置监听器什么也不返回。 Rajeev,是的,我想是的。 是关于在一段时间后关闭而没有使用的网络。您是否尝试过在打开 wi-fi 时上网以查看它是否启动了侦听器? Diogo,上网没问题。我可以上网了。 【参考方案1】:

您可以使用新的位置提供程序 (FusedLocationProvider),它结合了来自不同位置提供程序的信息,因此如果您的设备有任何获取位置的可能性,您就会知道。当然,您应该在您的设备的首选项中启用应用程序使用位置信息。

查看 developers.android.com 以获取有关此提供程序的详细信息。

这对我来说很好用:

public class FusedLocationListener implements GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, com.google.android.gms.location.LocationListener  

    public interface LocationListener 
        public void onReceiveLocation(Location location);
    

    private LocationListener mListener;

    public static final String TAG = "Fused";
    private LocationClient locationClient;
    private LocationRequest locationRequest;


    protected int minDistanceToUpdate = 1000;
    protected int minTimeToUpdate = 10*1000;

    protected Context mContext;


    @Override
    public void onConnected(Bundle bundle) 
        Log.d(TAG, "Connected");
        locationRequest = new LocationRequest();
        locationRequest.setSmallestDisplacement(1);
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(30000);
        locationRequest.setNumUpdates(1);
        locationClient.requestLocationUpdates(locationRequest, this);

    

    @Override
    public void onDisconnected() 
        Log.d(TAG, "Disconnected");
    

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) 
        Log.d(TAG, "Failed");
    


    private static FusedLocationListener instance;

    public static synchronized FusedLocationListener getInstance(Context context, LocationListener listener)
        if (null==instance) 
            instance = new FusedLocationListener(context, listener);
        
        return instance;
    


    private FusedLocationListener(Context context, LocationListener listener)
        mContext = context;
        mListener = listener;
    


    public void start()

        Log.d(TAG, "Listener started");
        locationClient = new LocationClient(mContext,this,this);
        locationClient.connect();

    


    @Override
    public void onLocationChanged(Location location) 
        Log.d(TAG, "Location received: " + location.getLatitude() + ";" + location.getLongitude());
        //notify listener with new location
        mListener.onReceiveLocation(location);
    


    public void stop() 
        locationClient.removeLocationUpdates(this);
    

用法:

public class MyActivity extends Activity implements FusedLocationListener.LocationListener 

 @Override
    public void onCreate(Bundle savedInstanceState) 

      FusedLocationListener locationListener FusedLocationListener.getInstance(getApplicationContext(), this);             

       locationListener.start();
   

@Override
    public void onReceiveLocation(Location location) 
       //handle location here
    


【讨论】:

您好,Rodion,谢谢您的回答。我复制了您的代码,当我第一次打开我的测试应用程序时,会收到位置更新。之后,我无法再接收位置更新。位置更新的最小间隔是多少?我错过了什么吗? locationRequest 具有参数 .setNumUpdates(),设置为 1。有关详细信息,请参阅 onConnected() 方法(.setSmallestDisplcement 和 .setUpdateInterval 设置最小距离和以毫秒为单位的位置更新间隔)。 我尝试了不同的组合,但无法获得多个位置更新。我阅读了 SDK 文档,但与我的没有什么不同。 嗨,Rodion,您的回答并没有直接解决我的问题。但是,你向我展示的方式非常好。非常感谢。 developer.android.com/training/location/…本教程没问题。我可以收到更新。 @RodionAltshuler FusedLocationListener locationListener FusedLocationListener.getInstance(getApplicationContext(), this); locationListener.start();它给出了错误【参考方案2】:

为什么不同时使用 *GPS_PROVIDER* 和 *NETWORK_PROVIDER* ?我试过了,效果很好。

在其他设备上或仅在您的设备上进行测试时是否会出现此错误?

【讨论】:

用户必须开启 GPS 才能获取位置更新。如果应用程序不是导航应用程序或类似的 stg,大多数用户不会选择打开它。我测试过的大多数手机都会出现此错误。但尤其是在三星 Galaxy S2 上。【参考方案3】:

你可以为我创建检测这两者

///首先创建MYlocation类

    public class MyLocation 
                Timer timer1;
                LocationManager lm;
                LocationResult locationResult;
                boolean gps_enabled=false;
                boolean network_enabled=false;

                public boolean getLocation(Context context, LocationResult result)
                
                    //I use LocationResult callback class to pass location value from MyLocation to user code.
                    locationResult=result;
                    if(lm==null)
                        lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

                    //exceptions will be thrown if provider is not permitted.
                    trygps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);catch(Exception ex)
                    trynetwork_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);catch(Exception ex)

                    //don't start listeners if no provider is enabled
                    if(!gps_enabled && !network_enabled)
                        return false;

                    if(gps_enabled)
                        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
                    if(network_enabled)
                        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
                    timer1=new Timer();
                    timer1.schedule(new GetLastLocation(), 20000);
                    return true;
                

                LocationListener locationListenerGps = new LocationListener() 
                    public void onLocationChanged(Location location) 
                        timer1.cancel();
                        locationResult.gotLocation(location);
                        lm.removeUpdates(this);
                        lm.removeUpdates(locationListenerNetwork);
                    
                    public void onProviderDisabled(String provider) 
                    public void onProviderEnabled(String provider) 
                    public void onStatusChanged(String provider, int status, Bundle extras) 
                ;

                LocationListener locationListenerNetwork = new LocationListener() 
                    public void onLocationChanged(Location location) 
                        timer1.cancel();
                        locationResult.gotLocation(location);
                        lm.removeUpdates(this);
                        lm.removeUpdates(locationListenerGps);
                    
                    public void onProviderDisabled(String provider) 
                    public void onProviderEnabled(String provider) 
                    public void onStatusChanged(String provider, int status, Bundle extras) 
                ;

                class GetLastLocation extends TimerTask 
                    @Override
                    public void run() 
                         lm.removeUpdates(locationListenerGps);
                         lm.removeUpdates(locationListenerNetwork);

                         Location net_loc=null, gps_loc=null;
                         if(gps_enabled)
                             gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                         if(network_enabled)
                             net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

                         //if there are both values use the latest one
                         if(gps_loc!=null && net_loc!=null)
                             if(gps_loc.getTime()>net_loc.getTime())
                                 locationResult.gotLocation(gps_loc);
                             else
                                 locationResult.gotLocation(net_loc);
                             return;
                         

                         if(gps_loc!=null)
                             locationResult.gotLocation(gps_loc);
                             return;
                         
                         if(net_loc!=null)
                             locationResult.gotLocation(net_loc);
                             return;
                         
                         locationResult.gotLocation(null);
                    
                
                public void cancelTimer()
                 timer1.cancel(); 
                  lm.removeUpdates(locationListenerGps);
                  lm.removeUpdates(locationListenerNetwork);
                
                public static abstract class LocationResult
                    public abstract void gotLocation(Location location);
                

        

/在你的主类中,你可以像我暗示的那样使用它

   public class Main extends Activity 

     public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        mWebView=(WebView)findViewById(R.id.webview);


                final String string_loc = getIntent().getExtras().getString("nearest");
                LocationResult locationResult = new LocationResult()

                    @Override
                    public void gotLocation(Location location) 

                        passLat=Double.toString(location.getLatitude());
                        passLong=Double.toString(location.getLongitude());
                        maps="http://maps.google.com/maps?q="+string_loc+"+loc:"+passLat+","+passLong+"&hq=hospital&t=m&z=12";
                        mWebView.loadUrl(maps);
                    
                ;
                  myLocation.getLocation(this, locationResult);  
        

  

//希望对你有帮助

【讨论】:

嗨 Laux,感谢您的回答。问题是我不能直接使用 GPS。 不能直接使用GPS是什么意思?怎么办?【参考方案4】:

使用网络提供商需要互联网连接才能工作。它从小区和 wifi 热点收集一些信息。然后它查询一个后端服务器,该服务器查找它的数据库并给出一个大概的位置。该设备可以预取一些位置信息,因此您不需要持续的互联网连接,但是当设备移出预取位置时,它需要再次连接互联网。

这可能是您的问题,您有时会失去互联网连接(wifi 进入睡眠状态)并重新启动提供商使其重新连接到互联网。同样,这充其量只是我的猜测:)

【讨论】:

嗨,Srikant,我不这么认为。因为出现这个问题时,我可以毫无问题地上网。 嗯,这是我能想到的唯一原因。顺便说一句,其他人也面临这个问题:***.com/questions/16013601/… .

以上是关于在我重新激活 WiFi/移动网络之前,服务中的 Android 位置侦听器不起作用的主要内容,如果未能解决你的问题,请参考以下文章

晕,Spotlight怎么连接

win10设置wifi热点提示“无法启动承载网络”怎么解决

手机扫描不到 wifi怎么办

如何处理wifi和移动数据之间的网络变化?

openwrt无线网卡未激活

显示“无法访问网络”的有效方式使用“重试”和“Wifi 设置”、“移动网络”等附加选项查看