0

位置情報サービスでバッテリーが消耗していることがわかりました。しかし、位置情報サービスがオンになっているからではなく、一部のアプリケーションがそのサービスを頻繁に使用しているからだと思います。どのアプリケーションが位置情報サービスを間違っているか(負荷が高い場合)を見つける方法はありますか?今すぐ位置情報サービスを使用してアプリケーションのリストを取得できますか?よろしくお願いします。

4

2 に答える 2

2

私の知る限り、LocationProvider にアクセスするアプリのリストを取得する簡単な方法はありません。しかし、診断する簡単な方法は、ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION 許可を 1 つずつ要求するアプリを強制終了することです。

多くのアプリは、onLocationChanged(...) などのコールバックを介して位置データを取得します。これにより、Android システムを変更せずに問題を特定することはほとんど不可能になります。位置情報サービスを変更して (Binder.getCallingUid() を介して) uid を記録し、位置情報サービスを使用している現在のアプリを取得できます。さほど難しくはありませんが、重量があります。

編集:

Frameworks/base/services/java/com/android/server の下に LocationManagerService.java があります。

一般に、位置情報戦略に従って、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 プロジェクト全体をコンパイルし、アプリケーションをインストールして、結果を取得できます。

于 2013-02-19T07:56:47.183 に答える
1

バックグラウンドで実行され、GPS を使用するサービスのようなものを意味していると思いますか? 自分で GPS を有効にしないで、まだ動いているようにするには?その場合、バックグラウンドでの GPS の使用が許可されているすべてのアプリを取得する方法はわかりません。[設定] -> [アプリ] に移動して、どのアプリが GPS の使用を許可されているかを確認してください。

典型的なバックグラウンド GPS ユーザーは Facebook アプリ (または google+ だと思います) です。お役に立てれば。

編集: または、不要なときに GPS を無効にして、アプリがバックグラウンドで GPS を使用できないようにすることもできます。

于 2013-02-19T07:54:02.817 に答える