在Android中确定设备当前位置的最简单最短的方法是什么?一个近似的城市级位置足够好,我需要Lat / Long坐标,而不是名称。想想天气的位置。但是我用它来进行日出/日落计算。
StackOverflow和Web上的所有其他示例至少有一页长并且依赖于回调。但我正处于一个表面绘制功能的中间,不能等待回调。我只是想得到最后一个已经位于内存中某处的已知位置。
一个答案将我指向LocationManager.getLastKnownLocation()
,但Android Studio表示它不知道该方法。所以它可能已经过时,并从更新的API中删除。
我是Android开发的新手,并且不知道在哪里搜索。网页片段把我带到了这里,但这一次没有了。
答案 0 :(得分:3)
但是我正处于监视面部绘制功能的中间,不能等待回调。
您经常无法选择。
我只想获得最后一个已知位于内存中的位置。
它经常不在记忆中。
一个答案将我指向了LocationManager.getLastKnownLocation(),但Android Studio表示它不知道该方法。
该方法存在,如the documentation for that method中所示。
由于您的问题没有您正在尝试的代码,因此任何人都很难帮助解释代码未编译的原因。也许您试图在getLastKnownLocation()
类上调用LocationManager
,而不是LocationManager
的实例。
请注意getLastKnownLocation()
经常返回null
,因为设备通常不会主动跟踪用户位置。此外,用户可能已禁用位置访问,或者设备可能处于飞行模式(因此无法访问非GPS源),或者设备可能位于导致蹩脚信号的设施中(例如,大型停车结构) )等等。
您也可以使用Play服务'fused location provider,但需要回调。
答案 1 :(得分:1)
在表盘中间绘制功能与否应该不会产生影响。 您在网上找到的大多数片段确实会告诉您使用回调。不是因为在某些情况下它“好”,而是因为它 系统如何工作。
您可以让系统知道您对设备的位置感兴趣。
然后系统开始计算信息。
当确定一个位置,然后每次位置变化足够大(通过准确性定义)时,系统会告诉您现在设备的实际位置(通过这些回调)。
创建表盘渲染器时开始实现此逻辑。可以选择显示“未知位置”(如@CommonsWare所述,由于各种原因,位置可能无法使用)。并以最适合的方式(最终)存储最后知道的位置(SharedPref听起来像是一个不错的选择)。
答案 2 :(得分:-2)
将这些权限添加到manifest.xml
在您的活动中实现LocationListener,此类中的方法将为您提供有关Android设备位置更新的更新
@Override
public void onLocationChanged(Location location) {
}
在活动的oncreate方法中调用此startGettingLocations方法,以便可以从用户请求所需的所有权限
private void startGettingLocations() {
Log.i("Process", "start getting locations");
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
boolean isGPS = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
boolean isNetwork = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
boolean canGetLocation = true;
int ALL_PERMISSIONS_RESULT = 101;
long MIN_DISTANCE_CHANGE_FOR_UPDATES = 100;// Distance in meters
long MIN_TIME_BW_UPDATES = 1000 * 10 * 6 ;// Time in milliseconds
ArrayList<String> permissions = new ArrayList<>();
ArrayList<String> permissionsToRequest;
permissions.add(Manifest.permission.ACCESS_FINE_LOCATION);
permissions.add(Manifest.permission.ACCESS_COARSE_LOCATION);
permissionsToRequest = findUnAskedPermissions(permissions);
//Check if GPS and Network are on, if not asks the user to turn on
if (!isGPS && !isNetwork) {
showSettingsAlert();
} else {
// check permissions
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (permissionsToRequest.size() > 0) {
requestPermissions(permissionsToRequest.toArray(new String[permissionsToRequest.size()]),
ALL_PERMISSIONS_RESULT);
canGetLocation = false;
}
}
}
if(ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED){
Log.i("Permissions", "fine loc not granted");
} else{
Log.i("Permissions", "fine loc granted");
}
if(ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED){
Log.i("Permissions", "coarse loc not granted");
} else{
Log.i("Permissions", "coarse loc granted");
}
if (ActivityCompat.checkSelfPermission(this,
android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
Toast.makeText(this, "Permission not Granted", Toast.LENGTH_SHORT).show();
return;
}
//Starts requesting location updates
if (canGetLocation) {
if (isGPS) {
lm.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
} else if (isNetwork) {
// from Network Provider
lm.requestLocationUpdates(
LocationManager.NETWORK_PROVIDER,
MIN_TIME_BW_UPDATES,
MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
}
}
else{
Toast.makeText(this, "Can't get location", Toast.LENGTH_SHORT).show();
}
}