web-dev-qa-db-ja.com

Location Managerは更新権限を削除します

私はAndroid studioを使用しており、compileSdkVersionは23で、以下のコードを使用しています)

 if(locationManager != null){
            locationManager.removeUpdates(GPSListener.this);
        }

gPSリスナーがLocationListenerを実装するクラスである場合にgpsの更新を停止します。

しかし、removeUpdates行で、lint警告を下回っています

呼び出しには、ユーザーによって拒否される可能性のある許可が必要です。コードは、許可が使用可能かどうか(checkPermissionを使用)を明示的にチェックするか、潜在的なSecurityExceptionを処理する必要があります

上記のコードの問題は何ですか。マニフェストファイルに追加の権限を追加する必要がありますか?.

よろしく。

8
Madhukar Hebbar

SDK 23以降、Location API機能を呼び出す前に権限を確認する必要があります。これを行う方法の例を次に示します。

_if (locationManager != null) {
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
            || checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
        locationManager.removeUpdates(GPSListener.this);
    }
}
_

checkSelfPermission()があります。これは、「あなた」(このアプリ)が正しい権限を持っているかどうかを確認するためのものです。 checkPermission()もあります。これは、別のプロセスが正しい権限を持っているかどうかを確認するためのものです。

メモ

  • このランタイムチェックを行うのに続いて、AndroidManifestで関連する権限を要求することも必要です。
  • targetSdkが23未満の場合は、代わりにContextCompat.checkSelfPermission()を使用してください(JerryBradyに感謝)
26
Tim Castelijns

私のcheckSelfPermission()を使用できませんでした。私の最小APIは14で、23が必要なためです。それを知っていれば、tryからcatch a SecurityExceptionを使用することもできます。

例:

try {
    locationManager.removeUpdates(GPSListener.this);
} catch (SecurityException e) {
    Log.e("PERMISSION_EXCEPTION","PERMISSION_NOT_GRANTED");
}
14
Rodrigo Borba

ContextCompatに関するJerry Bradyのコメントに追加するには、これは<23の完全なコードです。

 if (ContextCompat.checkSelfPermission(this, Android.Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED
                || ContextCompat.checkSelfPermission(this, Android.Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)
5
Wouter de Jong