3

別のアプリケーション (B と呼ぶ) で使用するために、Bluetooth GPS から取得した位置をモックするサービスを実行するアプリケーション (A と呼ぶ) があります。

  1. A (Bluetooth GPS 位置情報を取得するサービスあり)
  2. Androidシステムのモックロケーション
  3. B (Android システムから位置情報を取得)

すべてが Android 7.0 で動作しますが、Android 8.0 (Oreo) では、アプリケーション B は Bluetooth から取得した場所を読み取りません。つまり、ログには常に次の行が出力されるため、場所をモックする際の問題があると思います。

E PassiveLocationListener_FLP: isFromMockProvider, return

場所をモックするために使用しているコードは次のとおりです。

 private void changeToMockLocation() {
    Log.i(TAG, "changeToMockLocation()");

    Location newLocation = new Location(PROVIDER_NAME);
    newLocation.setLatitude(mNMEAData.getLatitude());
    newLocation.setLongitude(mNMEAData.getLongitude());
    newLocation.setAccuracy(mNMEAData.getAccuracy());
    newLocation.setTime(System.currentTimeMillis());

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        newLocation.setElapsedRealtimeNanos(SystemClock.elapsedRealtimeNanos());
    }

    // Set mock location.
    if (ActivityCompat.checkSelfPermission(
            mContext, android.Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {
        try {
            mLocationManager.setTestProviderLocation(PROVIDER_NAME, newLocation);
        } catch (Exception e) {
            Log.e(TAG, "Error while setting test provider location: " + e);
        }
    }
}

問題は、例外が出力されていないことです。そのため、プロセスは正しいと思いますが、何らかの理由で Android で許可されていないようです。

ALLOW_MOCK_LOCATIONマニフェストで許可を宣言し、アプリはDeveloper Settingsで場所をモックできます。

私は何を間違っていますか?

よろしくお願いします。良い一日を。

4

1 に答える 1