5

一部の Android バージョン (2.3.x だと思います) から、アプリの権限に関係なく、API を介して GPS をオン/オフすることはできません。以前は、電源制御ウィジェット (ここを参照) のバグを悪用することで可能でしたが、現在は修正されています。

root アクセス権があるとします。GPS のオンとオフを切り替えるにはどうすればよいですか?


EDIT:これは、通常のアプリでは許可されていないジェリービーンのログを読み取る許可を取得する方法です。gps を切り替えるために WRITE_SECURE_SETTINGS パーミッションに同様のソリューションを使用しようとしましたが、うまくいきませんでした。


編集:これまでのところ、機能するソリューションは1つだけ見つかりました。アプリをシステムアプリに変換することです(機能するソリューションはここで見つけることができ、Android 4.2.1でも機能します)。ただし、ルート許可は私が知っていることに従ってすべてを実行できるため、ルートを使用して最初からバイパスすることを考えました。

4

3 に答える 3

3

Androidのソースコードを少し調べたところ、次のコードが見つかりました

 public static final boolean isLocationProviderEnabled(ContentResolver cr, String provider) {
            String allowedProviders = Settings.Secure.getString(cr, LOCATION_PROVIDERS_ALLOWED);
            return TextUtils.delimitedStringContains(allowedProviders, ',', provider);
        }

  /**
   * Thread-safe method for enabling or disabling a single location provider.
   * @param cr the content resolver to use
   * @param provider the location provider to enable or disable
   * @param enabled true if the provider should be enabled
   */
        public static final void setLocationProviderEnabled(ContentResolver cr,
                String provider, boolean enabled) {
            // to ensure thread safety, we write the provider name with a '+' or '-'
            // and let the SettingsProvider handle it rather than reading and modifying
            // the list of enabled providers.
            if (enabled) {
                provider = "+" + provider;
            } else {
                provider = "-" + provider;
            }
            putString(cr, Settings.Secure.LOCATION_PROVIDERS_ALLOWED, provider);
        }       

root アクセス権があれば、Settings.Secure の読み取りと書き込みの両方ができると思います。このようにして、GPS を制御できるようになります (setLocationProviderEnabled)。

ただし、私が理解しているように、GPS ハードウェアはオフにならず、このロケーション プロバイダーは無視されます。

GPS と通信してハードウェアをオフにするインターフェイスを認識していません。ただし、別のオプションとして、GPS を担当するカーネル モジュールを無効にすることもできます (その名前はわかりません)。

更新 1

Android (4.1) で WRITE_SECURE_SETTIONS がどのように定義されているかを確認しました。ここにあります

   <permission android:name="android.permission.WRITE_SECURE_SETTINGS"
        android:permissionGroup="android.permission-group.DEVELOPMENT_TOOLS"
        android:protectionLevel="signature|system|development"
        android:label="@string/permlab_writeSecureSettings"
        android:description="@string/permdesc_writeSecureSettings" />

「システム」レベルに基づく。それをアプリケーションのマニフェストに追加し、このアプリケーションをシステム イメージにコピーします (書き込み可能としてマウントする必要があります)。

後もう一つ。uid シェルにはこの許可があります。

 <assign-permission name="android.permission.WRITE_SECURE_SETTINGS" uid="shell" />   

正確には覚えていませんが、一時的に uid を変更する方法があります (root の場合)。私はAndroidコードのどこかにいました。したがって、uid を shell に変更し、何かを実行して元に戻すことができます。

更新 2

uidをチェーンするこの方法を見つけました。

AOSPをダウンロードすると、さまざまな場所のネイティブ ライブラリでどのように使用されているかがわかります。

./base/cmds/screenshot/screenshot.c

setuid(AID_SHELL); を行います。

./native/cmds/dumpstate/dumpstate.c

setuid(AID_SHELL)

そしてそれは他のいくつかの場所にあります。

WRITE_SECURE_SETTINGS パーミッションを持つ AID_SHELL グループを取得するには、それを試してみるべきだと思います。

アップデート 3

詳細はわかりません。gps ハードウェア用のネイティブ ドライバと UNIX デバイスが必要だと思います。ただし、異なるデバイスでは異なる名前になる可能性があります。

rmmod linux コマンドを使用して、一部のモジュールを削除することができます。GPSを無効にするべきだと思います。

于 2013-02-23T23:14:48.930 に答える
1

このSO Questionは、トピックに関連するものに最も近いようです。

バージョン 2.2 までは、GPS 設定の変更を可能にするバグのエクスプロイトがありました。2.3以降、ユーザーの介入なしでは現在のところ不可能のようです。

失敗したいくつかの試みの回答/コメントは次のとおりです。 - Android でプログラムで GPS を有効または無効にするにはどうすればよいですか? - https://stackoverflow.com/a/10004614/238722

どうやらBusyBoxでそれを行う方法があるようですが、オンラインでしっかりしたものを見つけることができません。ソース: https://stackoverflow.com/a/14850224/238722

アップデート

BusyBox に関連するリンクされた回答には、ダウンロード可能なこの作業サンプル プロジェクトが含まれています。

于 2013-02-23T22:54:59.003 に答える