web-dev-qa-db-ja.com

Android.hardware.location.gpsとAndroid.hardware.location.networkはいつ必要ですか?

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ヘルプセンター をご覧ください。

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が利用可能かどうかは特に気にせず、最も正確な位置が報告されることのみです。

  • 最初の引用に基づいて、変更を加える必要はないと思います。
  • 2番目の引用に基づいて、Android.hardware.location.gpsAndroid.hardware.location.networkの両方が必要だと思います。または、これはLocationManagerのみであり、融合位置ではありませんか?

Android.hardware.location.gpsAndroid.hardware.location.networkは必要ですか?

31
mattm

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_LOCATIONlocation.gps機能( <uses-feature> )。

現時点での唯一の変更点は、API 21以降では、アプリがACCESS_FINE_LOCATIONはまもなくGPSのないデバイスにインストールできるようになります。アプリで以前にGPSが利用可能であると想定されていた(そしてGPSが必要である)場合は、Android.hardware.location.gps

Googleは、ネットワークロケーションプロバイダーは現在、良好なロケーション、つまり変更に十分であると述べています。

18
Tanis.7x

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
  • Android.hardware.location.network

そのため、場所の形式がなければアプリケーションが機能しない場合は、最初のAndroid.hardware.locationを使用する必要があります。それ以外の場合、アプリは場所を使用しますが、機能に不可欠ではない場合は、何も含めないでください

11
Budius

すばやく簡単なソリューション:

アプリは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" />

お役に立てれば..

8
Jatin

私の理解では、 ses-feature要素 のドキュメントを読んで、暗黙的および明示的なuses-featureエントリに基づいてGoogle Playでアプリケーションがどのようにフィルタリングされるかを理解するだけで十分です。

Google Playは、ユーザーに表示されるアプリケーションをフィルタリングするため、ユーザーはデバイスと互換性のあるアプリケーションのみを表示およびダウンロードできます。アプリケーションをフィルタリングする方法の1つは、機能の互換性です。

特定のユーザーのデバイスとアプリケーションの機能の互換性を判断するために、Google Playは以下を比較します。

アプリケーションに必要な機能—アプリケーションは、マニフェストの要素で機能を宣言します...デバイス、ハードウェアまたはソフトウェアで利用可能な機能—デバイスは、サポートする機能を読み取り専用のシステムプロパティとして報告します。

...

機能が必須であると明示的に宣言されている場合、Google Playはその機能をアプリケーションに必要な機能のリストに追加します。次に、その機能を提供しないデバイス上のユーザーからアプリケーションをフィルタリングします。

機能が必須ではないと明示的に宣言されている場合、Google Playはその機能を必須機能のリストに追加しません。そのため、アプリケーションをフィルタリングする際に、明示的に宣言された不要な機能は考慮されません。デバイスが宣言された機能を提供しない場合でも、他のフィルタリングルールが適用されない限り、Google Playは引き続きデバイスと互換性のあるアプリケーションを考慮し、ユーザーに表示します。


ロケーション許可の暗黙的なuses-featureアイテムは次のとおりです。

ACCESS_COARSE_LOCATION

  • Android.hardware.location
  • Android.hardware.location.network(ターゲットAPIレベルが20以下の場合のみ)

ACCESS_FINE_LOCATION

  • Android.hardware.location
  • Android.hardware.location.gps(ターゲットAPIレベルが20以下の場合のみ)

Googleのメールメッセージに記載されている変更は、uses-featureの暗黙的なAndroid.hardware.location.gpsアイテムがACCESS_FINE_LOCATIONを含むAPI 21+に存在しないことです。 ACCESS_COARSE_LOCATIONAndroid.hardware.location.networkについても同様の状況が当てはまるようです。

Googleでは、すべてのuses-featureエントリの明示的な列挙を推奨していますが、それでもアクセス許可に基づいた暗黙的なエントリを提供しています。次のドキュメントの抜粋から、uses-featureを省略することと、暗黙のuses-featureエントリがない限り、それを不要と宣言することに違いはないと思います。

機能が必須ではないと明示的に宣言されている場合、Google Playはその機能を必須機能のリストに追加しません。


アプリケーションの使用例によって、どのuses-featureエントリが存在するかが決まります。以下にいくつかの使用例を示します。特に明記しない限り、すべてのuses-featureエントリが必要です

  1. アプリケーションはLocationManagerから明示的にGPSを使用するか、アプリケーションはGPSの高精度を必要とします。これは、Googleのメールに記載されている例です。

    • ACCESS_FINE_LOCATION
    • Android.hardware.location(暗黙)
    • Android.hardware.location.gps(API 20までの暗黙的)
  2. ネットワークロケーションを明示的に使用する

    • ACCESS_COARSE_LOCATION
    • Android.hardware.location(暗黙)
    • Android.hardware.location.network(API 20までの暗黙的)
  3. GPSとネットワークの両方を使用

    • ACCESS_FINE_LOCATION
    • Android.hardware.location(暗黙)
    • Android.hardware.location.gps(API 20までの暗黙的)
    • Android.hardware.location.network
  4. GPSとネットワークの少なくとも1つを使用します。これは、元の質問のFusedLocationProviderApiのケースです。

    • ACCESS_FINE_LOCATION/ACCESS_COARSE_LOCATION
    • Android.hardware.location(暗黙)
  5. 利用可能な場合は場所を使用し、利用できない場合でもアプリケーションのインストールを許可します

    • ACCESS_FINE_LOCATION
    • Android.hardware.location required = false(暗黙のオーバーライド)
    • Android.hardware.location.gps required = false(API 20までの暗黙的なオーバーライド)
2
mattm

最初のポイント:

最初の引用に基づいて、変更を加える必要はないと思います。

FusedLocationおよびGPSおよびNetworkProviderを可用性ごとに自動的に検出し、最適な推定ロケーション(高精度を得るには、ACCESS_FINE_LOCATIONパーミッションを追加する必要があります)。 APIをターゲットにしている場合でも上記の21アプリで何も変更する必要はありません-FusedLocationは以前と同様に機能します。

そしてあなたの2番目のポイント:

2番目の引用に基づいて、Android.hardware.location.gpsAndroid.hardware.location.networkの両方が必要だと思います。または、これはLocationManager専用であり、融合した場所ではありませんか?

FusedLocation AP​​Iを使用しており、LocationManagerで置き換えたFusedLocation AP​​Iを使用していないため、無視する必要があります。したがって、2番目の引用は、LocationManagarを使用するアプリ専用です。

NETWORK_PROVIDERおよびGPS_PROVIDERは一部ですLocationManager Not FusedLocation AP​​I

1
androidXP

はい、融合プロバイダーを使用している場合、両方の許可が必要です。

ACCESS_COARSE_LOCATION-NETWORK_PROVIDERから位置情報の更新を受信します。 Android.hardware.location.network機能の許可を追加するだけで十分です。

ACCESS_FINE_LOCATION-NETWORK_PROVIDERとGPS_PROVIDERの両方から位置情報の更新を受信します。 Android.hardware.location.gpsAndroid.hardware.location.networkの両方の機能許可を追加する必要があります。融合位置にも適用できます。

1
Eshack Nazir