Android Things: определение местоположения по Wi-Fi

Здравствуйте, возможно ли получить местоположение Pico i.MX7 на основе Android Things через Wi-Fi? Когда я запускаю этот код на телефоне, все работает отлично, но когда я запускаю его на Pico, кажется, что requestLocationUpdates ничего не обновляет, и местоположение по-прежнему равно нулю. У меня тоже есть разрешения в манифесте (как FINE, так и COARSE). Спасибо!

public class MainActivity extends Activity {

private LocationManager mLocationManager;
private String locationProvider = LocationManager.NETWORK_PROVIDER;

private TextView lat;
private TextView lon;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lat = (TextView) findViewById(R.id.lat);
    lon = (TextView) findViewById(R.id.lon);

    if (ContextCompat.checkSelfPermission(this,
            Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {

        if (ActivityCompat.shouldShowRequestPermissionRationale(this,
                Manifest.permission.ACCESS_FINE_LOCATION)) {

        } else {

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
                    2);
        }
    }

    mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Location location = mLocationManager.getLastKnownLocation(locationProvider);
    mLocationManager.requestLocationUpdates(locationProvider, 10, 0, mLocationListener);
    // Toast.makeText(this, "Start", Toast.LENGTH_SHORT).show();
    showMyLocation(location);

    //Intent intent = new Intent(getApplicationContext(), SprinklerActivity.class);
    //startActivity(intent);
}

private void showMyLocation(Location l) {
    if (l == null) {
        Toast.makeText(this, "No location", Toast.LENGTH_SHORT).show();
        lat.setText("0");
        lon.setText("0");
    } else {
        Toast.makeText(this, "Latitude: " + l.getLatitude(), Toast.LENGTH_SHORT).show();
        Toast.makeText(this, "Longitude: " + l.getLongitude(), Toast.LENGTH_SHORT).show();
        lat.setText(l.getLatitude() + "");
        lon.setText(l.getLongitude() + "");
    }
}

private LocationListener mLocationListener = new LocationListener() {
    @Override
    public void onLocationChanged(Location location) {
        showMyLocation(location);
    }

    @Override
    public void onStatusChanged(String s, int i, Bundle bundle) {

    }

    @Override
    public void onProviderEnabled(String s) {

    }

    @Override
    public void onProviderDisabled(String s) {

    }
};

person Yuro8    schedule 01.01.2018    source источник
comment
У вас включен GPS на телефоне?   -  person Onik    schedule 01.01.2018
comment
@Оник нет, только вайфай   -  person Yuro8    schedule 01.01.2018
comment
Pico и ваш телефон подключены к одной и той же сети Wi-Fi?   -  person Onik    schedule 01.01.2018
comment
Да. Я даже пытался подключить Pico кабелем, но он все равно не работает.   -  person Yuro8    schedule 01.01.2018
comment
Я получаю первый нуль в LastKnownLocation, и новые обновления местоположения не получены. Да, я тоже пытался переустановить   -  person Yuro8    schedule 01.01.2018
comment
Используете ли вы поставщика услуг определения местоположения Служб Google Play или встроенного в ОС? Встроенная версия может использовать только GPS, тогда как Play Services будет использовать несколько датчиков.   -  person Nick Felker    schedule 01.01.2018
comment
@Ник Фелкер, он использует встроенный API. Yuro8, попробуйте использовать FusedLocationProviderClient.   -  person Onik    schedule 01.01.2018
comment
Я пробовал это даже с FusedLocaton, но все та же проблема :(   -  person Yuro8    schedule 03.01.2018
comment
Да, он установлен. Я компилирую эти два:   -  person Yuro8    schedule 03.01.2018


Ответы (1)


Кажется, нет реализации для автоматического обновления местоположения в Android Things (даже для LocationManager.NETWORK_PROVIDER), но в любом случае, если у вас есть доступ в Интернет, вы можете использовать Google Maps Geolocation API, например:

https://www.googleapis.com/geolocation/v1/geolocate?key=YOUR_API_KEY

с информацией о целевой точке доступа Wi-Fi в запросе, и если целевая WiFi точка доступа находится в базе данных Google, вы получили ответ JSON с широтой/долготой и точность. Для получения более точных результатов следует использовать модуль GPS, подключен через, например, UART. Вот официальное описание использования модулей GPS на Android Things, а здесь - исходный код драйвера пользовательского режима. Кроме того, если вы используете модуль GPS с GpsDriver< /a> вы можете отправить обновление местоположения в платформу (через .reportLocation()), и ваш код вопроса должен работать.

person Andrii Omelchenko    schedule 02.01.2018
comment
У меня все в порядке с точностью около +-1 км, даже больше, поэтому Wi-Fi должно хватить. Жаль, что не обновляется. Это решение выглядит таким сложным :( но я попробую. - person Yuro8; 03.01.2018
comment
@Yuro8 Это не так сложно, как кажется на первый взгляд. Существует множество примеров и руководства. - person Andrii Omelchenko; 03.01.2018
comment
Да, но сейчас я читаю, что невозможно получить mac-адрес устройства с Android 6.0 и выше. О боже, андроиды такие рваные - person Yuro8; 03.01.2018
comment
@Yuro8 Попробуйте добавить поддельный адрес, например 01:23:45:67:89:AB. Или сначала получить MAC-адрес WiFi из пользовательского интерфейса (Настройки-›и т.д.) - person Andrii Omelchenko; 03.01.2018
comment
Я думаю, что запрос хороший, но он все еще возвращает 400 - JSON недействителен :( ` {cellTowers: [{cellId:, locationAreaCode:, mobileCountryCode:, mobileNetworkCode:}], wifiAccessPoints: [ { macAddress:01:23:45:67 :89:AB},{macAddress:11:23:45:67:89:AB}]} ` - person Yuro8; 04.01.2018
comment
@Yuro8 Отправить пустой массив cellTowers или даже не добавлять этот тег вместо отправки пустых () полей. И странные символы после 67 во втором mac адресе. Сначала попробуйте отправить JSON из пример: { "considerIp": "false", "wifiAccessPoints": [ { "macAddress": "00:25:9c:cf:1c:ac", "signalStrength": -43, "signalToNoiseRatio": 0 }, { "macAddress": "00:25:9c:cf:1c:ad", "signalStrength": -55, "signalToNoiseRatio": 0 } ] } - person Andrii Omelchenko; 04.01.2018