開発
開発
プラットフォームを選択

位置情報API

概要

VR位置情報APIは、OSバージョン57以上のMeta Questヘッドセットに、豊富な位置情報機能を提供します。
VR位置情報APIでは、ネイティブのAndroid位置情報マネージャAPIを利用して、VRデバイスにAndroidネイティブ位置情報マネージャAPIをシームレスに実装します。そのため、VRデバイスでも、標準的なAndroidデバイスと同じように位置情報を取得できます。
: 現在のところ、Meta QuestヘッドセットにGPS機能はありません。そのため、VR位置情報APIでは、位置情報を調べるために、Wi-Fi地理的位置情報を利用しています。

前提条件

VR位置情報APIを利用するには、ヘッドセットでOSバージョン57以上が実行されていなければなりません。
VR位置情報APIでは、次のデバイスがサポートされています。

使用方法

位置情報のアクセス許可

アプリ開発者は、ユーザーのプライバシーを保護するため、ほかの実行時アクセス許可と同じように、ユーザーに対して明示的に位置情報のアクセス許可をリクエストする必要があります。また、それぞれのアプリに必要な最低限のアクセス許可だけをリクエストしなければなりません。

位置情報へのアクセスの種類

各アクセス許可には、以下のような特性の組み合わせがあります。
  • Category (カテゴリ): 前景位置情報(Meta Questヘッドセットでは、背景位置情報へのアクセスはサポートされていません。禁止されているAndroidアクセス許可を参照)。
  • Accuracy (正確性): 正確な位置情報かそれとも近似位置情報か(正確な位置情報と近似位置情報の定義については、こちらを参照)。

統合の手順

ステップ1

アプリマニフェストで、必要なアクセス許可を宣言します。例えば、次のようにします。
  • アプリで近似位置情報が必要な場合は、android.permission.ACCESS_COARSE_LOCATIONを使います。
  • アプリで正確な位置情報が必要な場合は、android.permission.ACCESS_FINE_LOCATIONを使います。
<manifest ... >
<!-- Always include this permission -->
<uses-permission
android:name="android.permission.ACCESS_COARSE_LOCATION"
 />
<!--Include only if your app benefits from precise location access. -->
  <uses-permission
android:name="android.permission.ACCESS_FINE_LOCATION"
 />
</manifest>

ステップ2

実行時に位置情報へのアクセスをリクエストします。ユーザーがアプリ内の機能を利用するようになってから、位置情報へのアクセス許可をリクエストするようにしてください。このアプローチは、適切なコンテキストにおいて実行時アクセス許可をリクエストするという、おすすめのプラクティスに沿ったものです。
: アプリがACCESS_FINE_LOCATION実行時アクセス許可をリクエストしていたとしても、ユーザーはアプリが近似位置情報だけを取得するようリクエストできます。このようなユーザーの意向に対応するため、ACCESS_FINE_LOCATIONアクセス許可を単独で要求することは避けてください。代わりに、実行時リクエストでは、ACCESS_FINE_LOCATIONアクセス許可とACCESS_COARSE_LOCATIONアクセス許可のどちらでも求められるようにしてください。
// Create a class-level field for the ActivityResultLauncher
private ActivityResultLauncher<String[]> locationPermissionLauncher;

// Initialize the ActivityResultLauncher in your onCreate or initialization method
locationPermissionLauncher = registerForActivityResult(
    new ActivityResultContracts.RequestMultiplePermissions(),
    new ActivityResultCallback<Map<String, Boolean>>() {
        @Override
        public void onActivityResult(Map<String, Boolean> permissions) {
            if (permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false)) {
                // Precise location access granted.
            } else if (permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false)) {
                // Only approximate location access granted.
            } else {
                // No location access granted.
            }
        }
    }
);
Sample Location Prompt
実行時アクセス許可ダイアログでのユーザーの選択内容に応じて、システムからアプリに付与されるアクセス許可を以下の表に示します。
アクセス許可正確近似
アプリ利用中
ACCESS_FINE_LOCATIONとACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
今回だけ
ACCESS_FINE_LOCATIONとACCESS_COARSE_LOCATION
ACCESS_COARSE_LOCATION
拒否
位置情報へのアクセス許可なし
位置情報へのアクセス許可なし

ステップ3

位置情報サブスクリプションを作成します。位置情報の更新呼び出しで指定されたパラメーターに基づいて、システムから位置情報が提供されます。
  1. 位置情報マネージャのインスタンスを作成します。
     LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    
  2. LocationManagerから位置情報の更新をリクエストします。
     locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
    
  3. 位置情報の更新情報を受け取るためのLocationListenerを実装します。
     private final LocationListener locationListener = new LocationListener() {
         @Override
         public void onLocationChanged(Location location) {
             // Handle location updates here
         }
     };
    

API

Android位置情報マネージャ

Android位置情報マネージャでは、以下のAPIがサポートされています。
  •   public Location getLastKnownLocation (String provider)
    
    この呼び出しを実行すると、指定されたプロバイダーから、最新の既知の位置情報が返されます。これまでの位置情報がない場合はnullになります。状況によっては、かなり古い位置情報が返される場合があるので、位置情報の経過時間を必ずチェックしてください。
  •   public void getCurrentLocation (String provider,
                      LocationRequest locationRequest,
                      CancellationSignal cancellationSignal,
                      Executor executor,
                      Consumer<Location> consumer)
    
    指定されたLocationRequestに基づいて、指定されたプロバイダーから、現在地情報の単一の修正が非同期で返されます。
  •   public void requestLocationUpdates (String provider,
                      long minTimeMs,
                      float minDistanceM,
                      LocationListener listener)
    
    指定された引数を使って特定のプロバイダーからの位置情報の更新情報と、呼び出し元スレッドのルーパーにおけるコールバックを登録します。
      public void requestLocationUpdates (String provider,
                  long minTimeMs,
                  float minDistanceM,
                  PendingIntent pendingIntent)
    
    指定されたプロバイダーを使った位置情報の更新情報と、指定されたPendingIntentを通じて配信されるコールバックを登録します。
      public void requestLocationUpdates (String provider,
                  LocationRequest locationRequest,
                  PendingIntent pendingIntent)
    
    LocationRequestを使って指定されたプロバイダーから提供される位置情報の更新情報と、指定されたPendingIntentを通じて配信されるコールバックを登録します。
      public void requestLocationUpdates (String provider,
                      LocationRequest locationRequest,
                      Executor executor,
                      LocationListener listener)
    
    指定されたプロバイダーを使った位置情報の更新情報を登録し、指定されたExecutorのコールバックを登録します。
  •  public void removeUpdates (LocationListener listener)
    
    指定されたLocationListenerの位置情報の更新情報をすべて削除します。

サポートされているAPI

: getCurrentLocation()など、一部のAPIの動作はAOSPと異なる場合があります。
公開メソッド 
getAllProviders()は、利用可能なすべての位置情報プロバイダーの名前のリストを返します。
getCurrentLocation()は、指定されたLocationRequestに基づいて、指定されたプロバイダーから現在地情報の単一の修正を非同期で返します。注: この呼び出しでMeta Questヘッドセットから提供される位置情報は、キャッシュに入れられたものである場合があります
getLastKnownLocation(String provider)は、プロバイダーによる既知の最新の位置情報をキャッシュから取得します。
getProvider(String provider)は、利用可能な位置情報プロバイダーの名前のリストを返します。注: Androidでは、APIのバージョン31でこのメソッドは廃止されました
getProviderProperties(String provider)は、指定されたプロバイダーのプロパティを返します。その時点でプロパティが未知の場合はnullを返します。
getProviders()は、利用可能な位置情報プロバイダーの名前のリストを返します。
hasProvider() 指定された位置情報プロバイダーがこのデバイス上に存在する場合、現在有効であるかどうかに関係なくtrueを返します。
isLocationEnabled()は、位置情報の状態が現在有効か無効かを返します。変更のリッスンについては、MODE_CHANGED_ACTIONを参照してください。
isProvidedEnabled()は、指定されたプロバイダーが現在有効か無効かのステータスを返します。変更のリッスンについては、PROVIDERS_CHANGED_ACTIONを参照してください。
requestFlush()は、指定されたプロバイダーに、リスナーに対して一括処理した位置情報をフラッシュするようリクエストします。
requestLocationUpdates() 指定したプロバイダーからの位置情報の更新情報を登録します。
requestSingleUpdate()は、指定したプロバイダーと保留中のインテントを使って、単一の位置情報の更新情報を登録します。注: Androidでは、APIのバージョン30でこのメソッドは廃止されました

サポートされていないAPI

: addGpsStatusListener()など、GNSS関連のAPIはサポートされていません。
公開メソッド 
addGpsStatusListener() Meta QuestヘッドセットにはGPSチップセットがありません。
addNmeaListener() Meta QuestヘッドセットにはGPSチップセットがありません。
addProximityAlert() ACCESS_BACKGROUND_LOCATIONアクセス許可は禁止されています
addTestProvider() SecurityExceptionになります。
clearTestProvider() SecurityExceptionになる
getGnssAntennaInfo() Meta QuestヘッドセットにはGPSチップセットがありません。
getGnssCapabilitie() Meta QuestヘッドセットにはGPSチップセットがありません。
getGnssHardwareModelName() Meta QuestヘッドセットにはGPSチップセットがありません。
getGnssYearofHardware() Meta QuestヘッドセットにはGPSチップセットがありません。
getGPSStatus() Meta QuestヘッドセットにはGPSチップセットがありません。
registerAntennaInfoListener() Meta QuestヘッドセットにはGPSチップセットがありません。
registerGnssMeasurementsCallback() Meta QuestデバイスにはGPSチップセットがありません。
registerGnssNavigationCallback() Meta QuestヘッドセットにはGPSチップセットがありません。
registerGnssStatusCallback() Meta QuestヘッドセットにはGPSチップセットがありません。
removeGpsStatusListener() Meta QuestヘッドセットにはGPSチップセットがありません。
removeNmeaListener() Meta QuestヘッドセットにはGPSチップセットがありません。
removeProximityAlert() ACCESS_BACKGROUND_LOCATIONアクセス許可は禁止されています
removeTestProvider() SecurityExceptionになります。
sendExtraCommand() ACCESS_LOCATION_EXTRA_COMMANDSアクセス許可は禁止されています
setTestProviderEnabled() SecurityExceptionになる。
setTestProviderLocation() SecurityExceptionになる。
setTestProviderStatus() SecurityExceptionになる。
unregisterAntennaInfoListener() Meta QuestヘッドセットにはGPSチップセットがありません。
unregisterGnssNavigationMessageCallback() Meta QuestヘッドセットにはGPSチップセットがありません。

ベストプラクティス

VR位置情報APIの使用を最適化し、位置情報データに関する法的義務、契約義務、プライバシーの義務を遵守するため、以下のベストプラクティスに従ってください。
  • バッテリー消費量を最小限に抑えるため、位置情報の更新は必要な場合にだけリクエストしてください。
  • ユーザーのプライバシーを尊重するため、正確な位置情報データが必要でない場合は、近似位置情報を使ってください。
  • アプリが位置情報へのアクセスを必要とする理由をユーザーに明確に説明してください。
ナビゲーションロゴ
日本語
© 2026 Meta