Googleは、Android場所のアクセス許可の変更をメールで通知しています:
2016年10月15日に、ACCESS_FINE_LOCATIONを使用するが「Android.hardware.location.gps」のuse-featureを明示的に持たないAPIバージョン21(Android 5.0、Lollipop)以降を対象とするアプリに影響する変更を行います。今後、これらのアプリはGPSハードウェアを持たないデバイスにインストールできるようになります。ほとんどの場合、Wi-FiおよびCell-IDベースの場所はこれらのアプリの一般的な操作に十分な忠実度を提供するため、これは問題になりません。ただし、GPSナビゲーターなどのGPSハードウェアを必要とするアプリは、明示的に「Android.hardware.location.gps」uses-featureをマニフェストに追加する必要があります。
アプリが適切に機能するためにGPSを必要とし、マニフェスト宣言に含まれていない場合、ユーザーのアプリエクスペリエンスが低下する可能性があります。
また、融合ロケーションプロバイダーを使用していて、GPSから最も正確なロケーションサンプル(PRIORITY_HIGH_ACCURACYなど)を受信する場合は、アプリのマニフェストに「Android.hardware.location.gps」機能を含める必要があります。 Playは、GPSセンサーを備えたデバイスにのみアプリを配布します。
この変更の詳細については、 Android Developersヘルプセンター をご覧ください。
NETWORK_PROVIDERまたはGPS_PROVIDERから位置情報の更新を受信するには、AndroidマニフェストファイルでACCESS_COARSE_LOCATIONまたはACCESS_FINE_LOCATIONアクセス許可を宣言することにより、ユーザーのアクセス許可を要求する必要があります。これらのアクセス許可がない場合、アプリケーションは実行時に場所の更新を要求すると失敗します。
NETWORK_PROVIDERとGPS_PROVIDERの両方を使用している場合、ACCESS_FINE_LOCATION許可のみを要求する必要があります。これには、両方のプロバイダーに対する許可が含まれているためです。 ACCESS_COARSE_LOCATIONの許可により、NETWORK_PROVIDERへのアクセスのみが許可されます。
注意:アプリがAndroid 5.0(APIレベル21)以上を対象とする場合、アプリがAndroid.hardware.location.networkまたはAndroid.hardware.location.gpsハードウェア機能を使用することを宣言する必要がありますアプリがNETWORK_PROVIDERまたはGPS_PROVIDERのどちらからロケーション情報を受信するかに応じて、マニフェストファイルでこれらのロケーションプロバイダーソースのいずれかからロケーション情報を受信する場合、アプリがアプリマニフェストでこれらのハードウェア機能を使用することを宣言する必要があります。 Android 5.0(API 21)より前のバージョンを実行しているデバイスで、ACCESS_FINE_LOCATIONまたはACCESS_COARSE_LOCATION許可を要求すると、ロケーションハードウェア機能に対する暗黙の要求が含まれます。ただし、 Android 5.0(APIレベル21)以降。
API 21をターゲットにし、ACCESS_FINE_LOCATION
を使用して、融合ロケーションプロバイダーを使用しています。 GPSが利用可能かどうかは特に気にせず、最も正確な位置が報告されることのみです。
Android.hardware.location.gps
とAndroid.hardware.location.network
の両方が必要だと思います。または、これはLocationManager
のみであり、融合位置ではありませんか?Android.hardware.location.gps
とAndroid.hardware.location.network
は必要ですか?
2番目の引用は、Android.hardware.location.network
またはAndroid.hardware.location.gps
、1つまたは他のロケーションプロバイダーが特に必要な場合。
GPS経由の更新が必要な場合は、Android.hardware.location.gps
。 WiFiおよびセルラーネットワーク経由で更新する場合は、Android.hardware.location.network
。
ネットワークとGPSの両方からの更新が必要な場合は、両方を含める必要があります<uses-feature>
要素。
どちらも指定しない場合、デバイスはそのプロバイダーのないデバイスにインストールされる可能性があります。たとえば、GPS、セルラーネットワーク、またはWi-Fiチップのないデバイスにインストールできます。
つまり、位置情報を取得するには、ネットワーク位置情報機能またはGPS機能が必要です。アプリケーションにどちらかが必要であると宣言しない場合、位置情報の更新をまったく取得できない場合があります。
API 21 vs 20以下
上記はAPI 21以降にのみ当てはまることに注意してください。 API 21より前は、ACCESS_COARSE_LOCATION
許可は、location.network
機能、wherasリクエストACCESS_FINE_LOCATION
はlocation.gps
機能( <uses-feature>
)。
現時点での唯一の変更点は、API 21以降では、アプリがACCESS_FINE_LOCATION
はまもなくGPSのないデバイスにインストールできるようになります。アプリで以前にGPSが利用可能であると想定されていた(そしてGPSが必要である)場合は、Android.hardware.location.gps
。
Googleは、ネットワークロケーションプロバイダーは現在、良好なロケーション、つまり変更に十分であると述べています。
TL; DR:いいえ、マニフェストにuses-feature
を追加する必要はありませんが、依存する場合があります。
完全な回答:
マニフェストのuses-feature
は、アプリケーションを正しく実行するために必要な機能を含まないデバイスをGoogle Playが除外できるようにするためのものです。 (例として、ターンバイターン方式のナビゲーションアプリの場合はGPS、カメラアプリの場合はカメラ)。
この引用を注意深く読んでください:
gPSナビゲーターなどのGPSハードウェアを必要とするアプリは、明示的に「Android.hardware.location.gps」uses-featureをマニフェストに追加する必要があります
(...)
gPSから最も正確な位置サンプルを受け取りたい
言及したように、FusedLocationProviderが、デバイスがインストールされている最適な場所を提供することだけを気にします。つまり、PRIORITY_HIGH_ACCURACY
をリクエストしている場合でも、GPSを搭載していないデバイスにアプリがインストールされる可能性があり、GPSと同じくらい正確な位置を取得できない場合があります。 、ロケーションプロバイダーを含まないデバイスにインストールします。
編集:
2番目の引用に基づいて、Android.hardware.location.gpsとAndroid.hardware.location.networkの両方が必要だと思います。または、これはLocationManager専用であり、融合した場所ではありませんか?
私はちょうどドキュメントを掘りに行きました https://developer.Android.com/guide/topics/manifest/uses-feature-element.html#hw-features 3つの可能性:
そのため、場所の形式がなければアプリケーションが機能しない場合は、最初のAndroid.hardware.location
を使用する必要があります。それ以外の場合、アプリは場所を使用しますが、機能に不可欠ではない場合は、何も含めないでください
すばやく簡単なソリューション:
アプリはAndroid.hardware.location.gpsを使用してGPS経由で更新する必要があります。 WiFiおよびセルラーネットワーク経由で更新する場合は、Android.hardware.location.networkが必要です。
ロケーションデータの要件に基づいて、マニフェストファイルに以下の行を追加します。
<uses-feature Android:name="Android.hardware.location" Android:required="false" />
<uses-feature Android:name="Android.hardware.location.gps" Android:required="false" />
お役に立てれば..
私の理解では、 ses-feature要素 のドキュメントを読んで、暗黙的および明示的なuses-featureエントリに基づいてGoogle Playでアプリケーションがどのようにフィルタリングされるかを理解するだけで十分です。
Google Playは、ユーザーに表示されるアプリケーションをフィルタリングするため、ユーザーはデバイスと互換性のあるアプリケーションのみを表示およびダウンロードできます。アプリケーションをフィルタリングする方法の1つは、機能の互換性です。
特定のユーザーのデバイスとアプリケーションの機能の互換性を判断するために、Google Playは以下を比較します。
アプリケーションに必要な機能—アプリケーションは、マニフェストの要素で機能を宣言します...デバイス、ハードウェアまたはソフトウェアで利用可能な機能—デバイスは、サポートする機能を読み取り専用のシステムプロパティとして報告します。
...
機能が必須であると明示的に宣言されている場合、Google Playはその機能をアプリケーションに必要な機能のリストに追加します。次に、その機能を提供しないデバイス上のユーザーからアプリケーションをフィルタリングします。
機能が必須ではないと明示的に宣言されている場合、Google Playはその機能を必須機能のリストに追加しません。そのため、アプリケーションをフィルタリングする際に、明示的に宣言された不要な機能は考慮されません。デバイスが宣言された機能を提供しない場合でも、他のフィルタリングルールが適用されない限り、Google Playは引き続きデバイスと互換性のあるアプリケーションを考慮し、ユーザーに表示します。
ロケーション許可の暗黙的なuses-feature
アイテムは次のとおりです。
Android.hardware.location
Android.hardware.location.network
(ターゲットAPIレベルが20以下の場合のみ)Android.hardware.location
Android.hardware.location.gps
(ターゲットAPIレベルが20以下の場合のみ)Googleのメールメッセージに記載されている変更は、uses-feature
の暗黙的なAndroid.hardware.location.gps
アイテムがACCESS_FINE_LOCATION
を含むAPI 21+に存在しないことです。 ACCESS_COARSE_LOCATION
とAndroid.hardware.location.network
についても同様の状況が当てはまるようです。
Googleでは、すべてのuses-feature
エントリの明示的な列挙を推奨していますが、それでもアクセス許可に基づいた暗黙的なエントリを提供しています。次のドキュメントの抜粋から、uses-feature
を省略することと、暗黙のuses-feature
エントリがない限り、それを不要と宣言することに違いはないと思います。
機能が必須ではないと明示的に宣言されている場合、Google Playはその機能を必須機能のリストに追加しません。
アプリケーションの使用例によって、どのuses-feature
エントリが存在するかが決まります。以下にいくつかの使用例を示します。特に明記しない限り、すべてのuses-feature
エントリが必要です
アプリケーションはLocationManager
から明示的にGPSを使用するか、アプリケーションはGPSの高精度を必要とします。これは、Googleのメールに記載されている例です。
ACCESS_FINE_LOCATION
Android.hardware.location
(暗黙)Android.hardware.location.gps
(API 20までの暗黙的)ネットワークロケーションを明示的に使用する
ACCESS_COARSE_LOCATION
Android.hardware.location
(暗黙)Android.hardware.location.network
(API 20までの暗黙的)GPSとネットワークの両方を使用
ACCESS_FINE_LOCATION
Android.hardware.location
(暗黙)Android.hardware.location.gps
(API 20までの暗黙的)Android.hardware.location.network
GPSとネットワークの少なくとも1つを使用します。これは、元の質問のFusedLocationProviderApiのケースです。
ACCESS_FINE_LOCATION
/ACCESS_COARSE_LOCATION
Android.hardware.location
(暗黙)利用可能な場合は場所を使用し、利用できない場合でもアプリケーションのインストールを許可します
ACCESS_FINE_LOCATION
Android.hardware.location
required = false(暗黙のオーバーライド)Android.hardware.location.gps
required = false(API 20までの暗黙的なオーバーライド)最初のポイント:
最初の引用に基づいて、変更を加える必要はないと思います。
FusedLocation
およびGPS
およびNetworkProvider
を可用性ごとに自動的に検出し、最適な推定ロケーション(高精度を得るには、ACCESS_FINE_LOCATION
パーミッションを追加する必要があります)。 APIをターゲットにしている場合でも上記の21アプリで何も変更する必要はありません-FusedLocation
は以前と同様に機能します。
そしてあなたの2番目のポイント:
2番目の引用に基づいて、
Android.hardware.location.gps
とAndroid.hardware.location.network
の両方が必要だと思います。または、これはLocationManager専用であり、融合した場所ではありませんか?
FusedLocation
APIを使用しており、LocationManager
で置き換えたFusedLocation
APIを使用していないため、無視する必要があります。したがって、2番目の引用は、LocationManagar
を使用するアプリ専用です。
NETWORK_PROVIDERおよびGPS_PROVIDERは一部ですLocationManager Not FusedLocation
API
はい、融合プロバイダーを使用している場合、両方の許可が必要です。
ACCESS_COARSE_LOCATION
-NETWORK_PROVIDER
から位置情報の更新を受信します。 Android.hardware.location.network
機能の許可を追加するだけで十分です。
ACCESS_FINE_LOCATION
-NETWORK_PROVIDERとGPS_PROVIDER
の両方から位置情報の更新を受信します。 Android.hardware.location.gps
とAndroid.hardware.location.network
の両方の機能許可を追加する必要があります。融合位置にも適用できます。