2013-02-19 20 views
1

我发现位置服务耗尽我的电池。但我认为这不是因为位置服务处于开启状态,这是因为某些应用程序使用该服务很多。有什么办法可以找到,哪个应用程序集的位置服务错误(高负载)?我现在可以使用位置服务获得应用程序列表吗? 非常感谢您的帮助。哪些应用程序正在使用位置服务?

+1

此问题与编程/软件开发有关。我需要以编程方式查找哪个应用程序重载位置服务。 – Michal 2013-02-20 12:02:40

回答

1

我想你的意思是像在后台运行的服务和使用GPS?所以你不要自己激活GPS,但它仍然在运行? 在这种情况下,我不知道要获取所有允许在后台使用GPS的应用。 你可以进入你的设置 - >应用程序,并检查允许哪些应用程序使用GPS的权限。

一个典型的背景GPS用户是Facebook应用程序(或谷歌+我猜)。 希望这有助于。

编辑:另外,你可以禁用GPS,当你不需要它,这样没有应用程序有可能在后台使用它。

+0

我明白了,你是对的,我可以做到这一点(除了关闭GPS,因为我需要它),但我更有趣的是以编程方式寻找问题的资源,因为根据我的经验,一些应用程序忽略了我设置的(通常是Facebook) 。这意味着我不能确定设置是否正常:(无论如何,谢谢你的回复。 – Michal 2013-02-19 09:00:57

+1

我猜如果你在你的设置中关闭GPS,你的设备的硬件部分会被关闭(或者至少我希望如此) 。所以即使Facebook的愚蠢也不应该能够连接。 – chrissik 2013-02-19 09:10:55

2

据我所知,没有简单的方法来获取访问LocationProvider的应用程序列表。但是,一种简单的诊断方法是杀死逐个请求ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION权限的应用程序。

许多应用通过像onLocationChanged(...)这样的回调来获取位置数据,这使得几乎不可能在不修改Android系统的情况下识别您的问题。您可以修改位置服务以记录uid(通过Binder.getCallingUid())以获取使用位置服务的当前应用程序。这不是很困难,但很重。

编辑:

有下框架/基/服务/ JAVA/COM /安卓/服务器LocationManagerService.java。

一般来说,根据它的Location Strategies,有几种方法可以在Android中获取位置信息。

LocationManager.requestLocationUpdates

你可以看看这LocationManagerService.java实施。该方法从客户端接收ILocationListener(Binder对象),如果它接收到位置更新,则稍后调用此侦听器。

@Override 
public void requestLocationUpdates(LocationRequest request, ILocationListener listener, 
     PendingIntent intent, String packageName) { 
    if (request == null) request = DEFAULT_LOCATION_REQUEST; 
    checkPackageName(packageName); 
    int allowedResolutionLevel = getCallerAllowedResolutionLevel(); 
    checkResolutionLevelIsSufficientForProviderUse(allowedResolutionLevel, 
      request.getProvider()); 
    LocationRequest sanitizedRequest = createSanitizedRequest(request, allowedResolutionLevel); 

    final int pid = Binder.getCallingPid(); 
    final int uid = Binder.getCallingUid(); 
    Receiver recevier = checkListenerOrIntent(listener, intent, pid, uid, packageName); 

    // providers may use public location API's, need to clear identity 
    long identity = Binder.clearCallingIdentity(); 
    try { 
     synchronized (mLock) { 
      requestLocationUpdatesLocked(sanitizedRequest, recevier, pid, uid, packageName); 
     } 
    } finally { 
     Binder.restoreCallingIdentity(identity); 
    } 
} 

基本上,你可以获取应用程序的UID在这种方法来知道有多少应用程序正在请求位置更新。但是你还应该记住看看removeUpdates方法。

LocationManager.getLastKnownLocation

您也可以登出应用程序的UID在这个方法的实现。

修改代码后,您可以编译整个Android项目,安装您的应用程序并获得您的结果。

+0

好的,感谢您的建议,我会尝试杀死方法,但我有点害怕该应用程序可以一次又一次地启动,它可能很难找到它,如果我不想卸载所有这些应用程序(也有一些应用程序是不可能卸载的) 你能否澄清一点我如何修改位置服务?我不确定我是否遵守 – Michal 2013-02-19 08:53:32

+0

通常,应用程序如果没有意图(不是广播)发送给它,将无法开始。为了修改位置服务,我将更新答案。 – StarPinkER 2013-02-19 09:05:00

+0

谢谢,我将尝试实现这一点:) – Michal 2013-02-19 10:06:40

相关问题