我有一些Android代码,需要快速获得最佳可用位置,从GPS、网络或任何可用的东西。准确性不如速度重要。

获得最佳的可用位置无疑是一项非常标准的任务。但是我找不到任何代码来演示它。Android位置代码要求指定标准、注册更新和等待--如果您有详细的标准,并且不介意等待,这是很好的。

但是我的应用程序需要更多地工作,就像地图应用程序第一次定位你时一样--从任何可用的提供者那里工作,只需检查位置是否过时或空。

我曾尝试使用我自己的代码来完成这个任务,但是我遇到了问题。(如果这有任何区别的话,它就在IntentService中进行上传。我已经把所有的信息代码都包括了。)这个代码有什么问题?

@Override
protected void onHandleIntent(Intent arg0) {
    testProviders();
    doUpload();
}
private boolean doUpload() {
       int j = 0;
       // check if we have accurate location data yet - wait up to 30 seconds
       while (j < 30) {
           if ((latString == "") || (lonString == "")) {
               Log.d(LOG_TAG, "latlng null");
               Thread.sleep(1000);
               j++;
       } else {
                Log.d(LOG_TAG, "found lat " + latString + " and lon " + lonString);
            break;
       }
       //do the upload here anyway, with or without location data
       //[code removed for brevity]
}
public boolean testProviders() {
    Log.e(LOG_TAG, "testProviders");
    String location_context = Context.LOCATION_SERVICE;
    locationmanager = (LocationManager) getSystemService(location_context);
    List<String> providers = locationmanager.getProviders(true);
    for (String provider : providers) {
        Log.e(LOG_TAG, "registering provider " + provider);
        listener = new LocationListener() {
            public void onLocationChanged(Location location) {
                // keep checking the location - until we have
                // what we need
                //if (!checkLoc(location)) {
                Log.e(LOG_TAG, "onLocationChanged");
                locationDetermined = checkLoc(location);
                //}
            }
            public void onProviderDisabled(String provider) {
            }
            public void onProviderEnabled(String provider) {
            }
            public void onStatusChanged(String provider, int status,
                    Bundle extras) {
            }
        };
        locationmanager.requestLocationUpdates(provider, 0,
                0, listener);
    }
    Log.e(LOG_TAG, "getting updates");
    return true;
}
private boolean checkLoc(Location location) {
    float tempAccuracy = location.getAccuracy();
    int locAccuracy = (int) tempAccuracy;
    Log.d(LOG_TAG, "locAccuracy = " + locAccuracy);
    if ((locAccuracy != 0) && (locAccuracy < LOCATION_ACCURACY)) {
        latitude = location.getLatitude();
        longitude = location.getLongitude();
        latString = latitude.toString();
        lonString = longitude.toString();
        return true;
    }
    return false;
}
public void removeListeners() {
    // Log.e(LOG_TAG, "removeListeners");
    if ((locationmanager != null) && (listener != null)) {
        locationmanager.removeUpdates(listener);
    }
    locationmanager = null;
    // Log.d(LOG_TAG, "Removed " + listener.toString());
}
@Override
public void onDestroy() {
    super.onDestroy();
    removeListeners();
}

不幸的是,这会找到网络提供程序,但只有输出latlng null30次-它似乎从来没有得到一个位置,在任何地方。我甚至没有收到locationChanged...

从DDMS中我可以看到输出如下:

NetworkLocationProvider: onCellLocationChanged [305,8580]
NetworkLocationProvider: getNetworkLocation(): returning cache location with accuracy 75.0

似乎暗示网络提供商确实有一些位置信息。

有人能帮忙吗?

火星救援队长火星救援队长提问于
一夜之后的沉默闲来无事回答于

启动位置更新:

void getCurrentLocation() {
    List<String> providers = locationManager.getProviders(criteria, true);
    if (providers != null) {
        Location newestLocation = null;
        for (String provider : providers) {
            Location location = locationManager.getLastKnownLocation(provider);
            if (location != null) {
                if (newestLocation == null) {
                    newestLocation = location;
                } else {
                    if (location.getTime() > newestLocation.getTime()) {
                        newestLocation = location;
                    }
                }
                locationManager.requestLocationUpdates(provider, 0, 0, this);
            }
        }
    } else {
        LocationDialogFragment dialog = new LocationDialogFragment();
        dialog.show(getSupportFragmentManager(),
            LocationDialogFragment.class.getName());
    }
}

接收位置更新:

@Override
public void onLocationChanged(Location location) {
    float bestAccuracy = -1f;
    if (location.getAccuracy() != 0.0f
        && (location.getAccuracy() < bestAccuracy) || bestAccuracy == -1f) {
        if (location.getAccuracy() < Const.MIN_ACCURACY) {
            locationManager.removeUpdates(this);
        }
    }
    bestAccuracy = location.getAccuracy();
}

位置设置对话框:

public class LocationDialogFragment extends DialogFragment {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
        builder.setMessage(R.string.location_dialog_message)
                .setPositiveButton(R.string.location_dialog_positive_button,
                    new OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Intent settingsIntent = new Intent(
                                    Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                            startActivity(settingsIntent);
                        }
                    })
                .setNegativeButton(R.string.location_dialog_negative_button,
                    new OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Toast.makeText(getActivity(),
                                R.string.no_location_message, Toast.LENGTH_LONG)
                                    .show();
                        }
                    });
        return builder.create();
    }
}

回答过的其他问题

申请到一个签名以后,这个签名在有效期内可以给多个客户端同时使用么?

可以,但是强烈不建议由客户端直接保存签名。签名应该保存在自己的服务器上,然后使用自定义的方式对客户端的请求进行身份验证,验证通过则直接在服务器上调用 COS API。

我存储桶创建了,为什么还是说文件不存在?

用的是不是旧版 API? https://cloud.tencent.com/document/product/436/6059 服务端 SDK 错误码 -1 指定的上传文件不存在... 展开详请

云对大数据分析意味着什么?

在云中创新 长期以来,Facebook的座右铭是“ 快速行动并打破局面。”通过Facebook,我们的想法是实现尽可能多的功能并尽可能多地探索机会。如果某个功能发生故障,他们可以修复并改进它。Facebook最终放弃了打破他们的网站,但他们继续鼓励创新文化。 云使敏捷文化比以往任...... 展开详请

如何利用云计算加固服务器,防止SSH攻击?

可以修改sshd服务器的配置文件/etc/ssh/sshd_config的读写权限,对所有非root用户设置只读权限,防止非授权用户修改sshd 服务的安全设置。

5G技术将可能带动哪些领域的发展?

首次安装mariadb,关于密码的问题?

1. 我的成都地域 CentOS 7 镜像里面是没有的,可以用 rpm -qa | grep maria 检测一下。

2. 重置密码可以参考这个:https://blog.csdn.net/geoffreychan/article/details/78076966

所属标签

扫码关注云+社区