【问题标题】:Android Things: location over Wi-FiAndroid Things:通过 Wi-Fi 定位
【发布时间】:2018-01-01 18:34:02
【问题描述】:

您好,可以通过 Wi-Fi 基于 Android Things 获取 Pico i.MX7 的位置吗?当我在手机上运行此代码时,一切正常,但是当我在 Pico 上运行它时,requestLocationUpdates 似乎没有更新任何内容,并且位置仍然为空。我也有 Manifest 的权限(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) {

    }
};

【问题讨论】:

  • 您的手机是否开启了 GPS?
  • @Onik 不,只有wifi
  • Pico 和您的手机是否在同一个 WiFi 网络上?
  • 是的。我什至尝试用电缆连接 Pico,但它仍然无法正常工作
  • 我在 LastKnownLocation 中收到第一个 null 并且未收到新的位置更新。是的,我也试过重新安装它

标签: location wifi android-things


【解决方案1】:

在 Android Things 中似乎没有自动更新位置的实现(即使对于 LocationManager.NETWORK_PROVIDER),但无论如何,如果您可以访问互联网,您可以使用 Google Maps Geolocation API 请求,例如:

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

在请求中包含有关目标WiFi access point 的信息,如果目标 WiFi 接入点在 Google 数据库中,您将获得 response JSON 的纬度/经度和准确度。要获得更精确的结果,您应该使用GPS module,例如通过 UART 连接。 Here 是在 Android Things 上使用 GPS 模块的官方说明,here - 用户模式驱动程序的源代码。此外,如果您将 GPS 模块与GpsDriver 一起使用,您可以将位置更新发送到框架(通过.reportLocation() 方法),您的问题代码应该可以工作。

【讨论】:

  • 我可以精确到 +-1 公里,甚至更多,所以 wifi 应该足够了。可惜没更新。这个解决方案看起来很复杂:(但我试着试一试。
  • @Yuro8 这并不像乍一看那样复杂。有很多examplestutorials
  • 是的,但现在我读到无法从 Android 6.0 及更高版本获取设备的 mac 地址。天啊,安卓的东西太破烂了
  • @Yuro8 尝试添加假地址,例如“01:23:45:67:89:AB”。或者首先从 UI(设置-> 等)获取 WiFi MAC 地址
  • 我认为请求很好,但它仍然返回 400 - JSON 无效 :( ` {"cellTowers": [{"cellId":"", "locationAreaCode":"", "mobileCountryCode" :"", "mobileNetworkCode":""}], "wifiAccessPoints":[ { "macAddress":"01:23:45:67:89:AB"},{"macAddress":"11:23:45: 67:89:AB"}]}`
猜你喜欢
  • 2013-03-09
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-05
  • 2016-07-17
相关资源
最近更新 更多