Макет локации на Android 8.0 (Oreo)

У меня есть приложение (назовите его A), которое запускает службу, которая проверяет местоположение, полученное от Bluetooth GPS, чтобы использовать его в другом приложении (назовите его B):

  1. A (с услугой, которая получает местоположение Bluetooth Bluetooth)
  2. Макет местоположения в системе Android
  3. B (получить местоположение из системы Android)

На Android 7.0 все работает, но в Android 8.0 (Oreo) приложение B не считывает местоположение, полученное от блютуса, то есть, я думаю, из-за проблемы с поддельным местоположением, потому что журнал всегда печатает эту строку:

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 разрешение, и приложение может макетировать местоположение в настройках разработчика.

Что я делаю неправильно?

Заранее спасибо и хорошего дня.

0 ответов

Кажется, есть ошибка на экране настроек разработчика (Samsung?) В Oreo. Я также настроил свое приложение как провайдер макетов и с разрешением в манифесте. Для меня проблема была решена удалением приложения в качестве провайдера фиктивного местоположения и его повторным добавлением:

Developer options -> Mock location app -> No apps
Developer options -> Mock location app -> Your app

Тем не менее, я все еще вижу эти сообщения в журнале:

E/PassiveLocationListener_FLP: isFromMockProvider, return
I/LocationManagerService: remove xxxxxxx 
I/LocationManagerService: removeUpdates, receiver.requestedID = xxxxxxx, receiver.mIdentity.mPid = 2908, receiver.mIdentity.mUid = 1000
D/SLocation: removeGpsStatusListener
D/ListenerMonitor_FLP: removeListener, not existed listener android, xxxxxxx in mListenerIdMap
E/RequestManager_FLP: [LocationManagerService] Location remove xxxxxxx from system
Другие вопросы по тегам