从未调用过位置服务 onProviderEnabled

Posted

技术标签:

【中文标题】从未调用过位置服务 onProviderEnabled【英文标题】:Location service onProviderEnabled never called 【发布时间】:2011-09-21 06:00:57 【问题描述】:

我有一项服务可以在我的应用中更新位置。当我在禁用 GPS 的情况下启动我的应用程序时,返回 android 菜单并启用 GPS,最后返回我的应用程序(服务尚未被销毁),永远不会调用 onProviderEnabled。有人可以帮忙吗?

更新:如果我重新启动应用程序,则提供程序已启用。只有 onProviderEnabled 没有被调用...

在我需要位置的每一项活动中

super.onCreate(savedInstanceState); 

    //....

    // Bind location service
    bindService(new Intent(this, LocationService.class), mConnection, Context.BIND_AUTO_CREATE);

    //....

@Override
protected void onDestroy() 
    super.onDestroy();       
    // Unbind LocationService
    ItemDetail.this.unbindService(mConnection);

服务是

public class LocationService extends Service implements LocationListener 
    LocationManager locationManager; 

    @Override
    public IBinder onBind(Intent intent) 
        return null;
    

    @Override
    public void onCreate()         
        locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

        if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))         

            // Update after minimum 5 minutes and if user has moved at least 100 meters.
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 100, this);        

            Location loc = getBestLocation(locationManager);
            if(loc!=null)
                GlobalVars.lat = (Double) (loc.getLatitude());
                GlobalVars.lng = (Double) (loc.getLongitude());
            
        
    

    public void onLocationChanged(Location loc)         
        GlobalVars.lat = (Double) (loc.getLatitude());
        GlobalVars.lng = (Double) (loc.getLongitude()); 
    

    public static Location getBestLocation(LocationManager locationManager) 

        Location location_gps = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
        Location location_network = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

        // If both are available, get the most recent
        if(location_gps!=null && location_network !=null) 
            return (location_gps.getTime() > location_network.getTime())?location_gps:location_network;
        
        else if(location_gps==null && location_network ==null)
            return null;
        
        else
            return (location_gps==null)?location_network:location_gps;

    

    public void onProviderEnabled(String s)
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 100, this); 
    
    public void onProviderDisabled(String s)
        locationManager.removeUpdates(this);
        GlobalVars.lat = null;
        GlobalVars.lng = null;  
    
    public void onStatusChanged(String s, int i, Bundle b)

    @Override
    public void onDestroy()        
        locationManager.removeUpdates(this);
    

【问题讨论】:

嘿!你解决了这个问题吗?我也想做像你一样的事情——所以我很乐意使用你的代码作为参考资料。我仍然很困惑如何使用带有位置管理器的服务来遇到 ANR... 【参考方案1】:

在您的 LocationService.onCreate() 方法中,您的代码会检查 GPS 提供程序是否已禁用。

if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER))...

但您只有在订阅已启用时才开始订阅。请注意,您的侦听器将永远不会向LocationManager 注册,并且不会收到位置提供程序被禁用或启用的任何更新。而是将您的 onCreate() 方法更改为始终调用

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5 * 60 * 1000, 100, this);

【讨论】:

以上是关于从未调用过位置服务 onProviderEnabled的主要内容,如果未能解决你的问题,请参考以下文章

Netty channelRead 从未调用过

Twitter UserTimeline 有效,但 SearchTimeline 似乎从未调用过服务器

网站的 OSX 推送通知 - 从未调用过 Safari requestPermission 回调

onIabPurchaseFinished 从未调用过。

Firebase OnTokenRefresh() 从未调用过?

didDeselectRowAt 从未调用过[重复]