web-dev-qa-db-ja.com

ユーザーが設定にアクセスしなくても、プログラムでロケーションモードの高精度またはバッテリー節約を有効にする

これを尋ねる理由:(アプリで試してみる理由)

それは起こりますLollipopのGoogleマップを使用した場合。 ロケーションが無効になっている場合でも、ユーザーがマップアプリから入力した後、[設定]にアクセスせずに高精度モードでロケーションがオンになります。

Bluetoothを有効にする場合も同様の機能を実現できます。この場合、アクションはアプリで開始されます。ユーザーは選択する必要がありますが、ユーザーは以下を使用して設定にリダイレクトされません:

startActivity(new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE));

BluetoothAdapter で見つけることができますが、LocationAdapterがないことがわかっているので、私は gms-> LocationServices を探しました。基本的には Location APIリファレンスAndroid.location.LocationManager しかし、_ACTION_REQUEST_ENABLE_のようなものはまだ利用できないようです。

同じ方法が他にもあることを願っており、もっと多くの人が試してみました。

ご注意ください:
context.startActivity(new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS));はそのようには動作しません。

20
Pararth

UPDATE 3

ロケーション設定の変更を促す@patrickandroid、コメント、2番目の更新からのリンクが壊れています

GoogleSamples; Android場所とオプション-コード参照用

UPDATE 2

GoogleSamples;-コード参照用

このサンプルは、このリポジトリに含まれるLocationUpdatesサンプルに基づいており、ユーザーがロケーションダイアログを使用してデバイスのロケーション設定を更新できるようにします。

SettingsApiを使用して、デバイスのシステム設定がアプリの場所のニーズに合わせて適切に構成されていることを確認します。


UPDATE 1

Google Play servicesバージョン7.0(2015年3月)リリース...

ロケーション設定-FusedLocationProviderApiは複数のセンサーを組み合わせて最適なロケーションを提供しますが、アプリが受信するロケーションの精度は、有効になっている設定に大きく依存しますデバイス(GPS、wifi、機内モードなど)。新しいSettingsApiクラスを使用すると、ユーザーがアプリを終了せずに設定を変更するためのワンタッチコントロールを表示する[場所の設定]ダイアログを表示できます。

パブリックインターフェイスSettingsApiの使用

  • 目的のロケーションリクエストを実行するために、デバイスで関連するシステム設定が有効になっているかどうかを確認します。
  • 必要に応じて、ユーザーが必要な場所の設定をシングルタップで有効にできるダイアログを呼び出します。


前の部分を参照用に残します。
Update/Answer
この回答を探しているすべての人のために、Google Play Services 7.0
場所を検出して近くのデバイスに接続するためのAPIを追加し、モバイル広告、フィットネスデータ、位置設定などを改善します。

Google Play開発者サービス7.0では、特定のLocationRequestが成功するために必要なロケーション設定が有効になっていることを確認する標準メカニズムを導入しています。改善が可能な場合は、アプリを終了せずに設定を変更するためのワンタッチコントロールをユーザーに表示できます。

exactly this

このAPIは、特にロケーション設定ダイアログを統合してGoogleマップのようにアプリのユーザーエクスペリエンスに位置情報が重要である場合、ユーザーエクスペリエンスを大幅に向上させる絶好の機会を提供します。ロケーション状態が良好なユーザーの数。

出典:Android開発者ブログ:Google Play開発者サービス7.0-みんなの場所!

SDKが近日登場!
今後数日間でGoogle Play開発者サービス7.0を展開します。このブログ投稿、公開されたドキュメント、および公開が完了したらSDKが利用可能になることを期待してください。

実装後にプログラム的なl-o-cを更新します

23
Pararth

上記の@ user2450263のメモに基づいて、ここにスニペットを示します。

/**
 * Prompt user to enable GPS and Location Services
 * @param mGoogleApiClient
 * @param activity
 */
public static void locationChecker(GoogleApiClient mGoogleApiClient, final Activity activity) {
    LocationRequest locationRequest = LocationRequest.create();
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    locationRequest.setInterval(30 * 1000);
    locationRequest.setFastestInterval(5 * 1000);
    LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
            .addLocationRequest(locationRequest);
    builder.setAlwaysShow(true);
    PendingResult<LocationSettingsResult> result =
            LocationServices.SettingsApi.checkLocationSettings(mGoogleApiClient, builder.build());
    result.setResultCallback(new ResultCallback<LocationSettingsResult>() {
        @Override
        public void onResult(LocationSettingsResult result) {
            final Status status = result.getStatus();
            final LocationSettingsStates state = result.getLocationSettingsStates();
            switch (status.getStatusCode()) {
                case LocationSettingsStatusCodes.SUCCESS:
                    // All location settings are satisfied. The client can initialize location
                    // requests here.
                    break;
                case LocationSettingsStatusCodes.RESOLUTION_REQUIRED:
                    // Location settings are not satisfied. But could be fixed by showing the user
                    // a dialog.
                    try {
                        // Show the dialog by calling startResolutionForResult(),
                        // and check the result in onActivityResult().
                        status.startResolutionForResult(
                                activity, 1000);
                    } catch (IntentSender.SendIntentException e) {
                        // Ignore the error.
                    }
                    break;
                case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE:
                    // Location settings are not satisfied. However, we have no way to fix the
                    // settings so we won't show the dialog.
                    break;
            }
        }
    });
}

そして、それを

mGoogleApiClient = new GoogleApiClient
            .Builder(this)
            .enableAutoManage(this, 34992, this)
            .addApi(LocationServices.API)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .build();

    locationChecker(mGoogleApiClient, MyActivity.this);

基本的に、ユーザーはこのようなプロンプトを取得します。設定では、高精度モードでロケーションを有効にできます Turn on GPS

21
PsyGik

Android 6.0.1 Marshmallow、ボタンイベントOnClickでテストされたソリューションはvoidを呼び出します:

private void openGPSSettings() {
    //Get GPS now state (open or closed)
    boolean gpsEnabled = Settings.Secure.isLocationProviderEnabled(getContentResolver(), LocationManager.GPS_PROVIDER);

    if (gpsEnabled) {
        Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCATION_MODE, 0);
    } else {
        Settings.Secure.putInt(getContentResolver(), Settings.Secure.LOCATION_MODE, 3);
    }
}

Androidでは、USBデバッグを有効にするか、ルート化する必要があります。 adb Shellで以下のコマンドを実行します(デバイスのルートシェルから、またはデバイスがルート化されていない場合はUSBで接続されたコンピューターから):

pm grant com.example.application.test Android.permission.WRITE_SECURE_SETTINGS

アプリマニフェストにこれらの権限を追加します。

<uses-permission Android:name="Android.permission.WRITE_SETTINGS" />
<uses-permission Android:name="Android.permission.WRITE_SECURE_SETTINGS" />