尽快将用户的当前位置置于阈值内,同时节省电池电量.
首先,android有两个提供商; 网络和GPS.有时网络更好,有时GPS更好.
"更好"是指速度与准确度之比.
如果我几乎可以立即获得位置并且不打开GPS,我愿意牺牲几米精度.
其次,如果您要求更新位置更改,则在当前位置稳定时不会发送任何内容.
谷歌有一个确定"最佳"位置的例子:http://developer.android.com/guide/topics/location/obtaining-user-location.html#BestEstimate
但我认为它不是应该尽可能好的地方/可能.
我有点困惑为什么谷歌没有标准化的位置API,开发者不应该关心位置来自哪里,你应该只指定你想要的东西,手机应该为你选择.
我需要找到一个很好的方法来确定"最佳"位置,也许是一些启发式或者可能通过某些第三方库.
这并不意味着确定最好的提供商!
我可能会使用所有提供商并选择其中最好的.
该应用程序将以固定间隔收集用户的位置(假设每10分钟左右)并将其发送到服务器.
该应用程序应尽可能节省电池,并且位置应具有X(50-100?)米的精度.
目标是以后能够在地图上绘制白天用户的路径,因此我需要足够的准确性.
您认为对于期望和接受的准确度的合理价值是什么?
我一直在使用100米接受,并且根据需要使用30米,这要问多少?
我希望以后能够在地图上绘制用户的路径.
期望100米,接受500米更好吗?
此外,现在我每次更新GPS的时间最长为60秒,如果你在室内的准确度可能超过200米,这个位置太短了吗?
这是我目前的代码,感谢任何反馈(除了缺少错误检查,这是TODO):
protected void runTask() {
final LocationManager locationManager = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
updateBestLocation(locationManager
.getLastKnownLocation(LocationManager.GPS_PROVIDER));
updateBestLocation(locationManager
.getLastKnownLocation(LocationManager.NETWORK_PROVIDER));
if (getLocationQuality(bestLocation) != LocationQuality.GOOD) {
Looper.prepare();
setLooper(Looper.myLooper());
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
updateBestLocation(location);
if (getLocationQuality(bestLocation) != LocationQuality.GOOD)
return;
// We're done …Run Code Online (Sandbox Code Playgroud) 我在使用Android定位系统的NETWORK提供商获取当前位置坐标时遇到了麻烦.
已经阅读了很多教程,并为我的项目实现了4或5个现有的类,所有这些都给了我最后的坐标但不是当前的坐标.
我很确定问题是我缺少的基本问题,但我无法理解究竟是什么.
我现在使用的代码:
这是我的主要活动
package com.example.locationtests;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GPSTracker mGPS = new GPSTracker(this);
TextView text = (TextView) findViewById(R.id.texts);
if(mGPS.canGetLocation ){
mGPS.getLocation();
text.setText("Lat"+mGPS.getLatitude()+"Lon"+mGPS.getLongitude());
}else{
text.setText("Unabletofind");
System.out.println("Unable");
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
这是我用于跟踪的课程:
package com.example.locationtests;
import android.app.AlertDialog; …Run Code Online (Sandbox Code Playgroud) 我正在创建一个将在自己的进程中运行的后台服务.它应该允许我听设备位置是否已更改.我应该能够在通知用户界面之前更改移动距离等标准.
我怎么能这样做?我对服务和LocationListener实现有一点了解.任何围绕网络的教程将不胜感激.
我从堆栈溢出中获得了一个反向链接,但我对此并不了解.
在我的应用程序中,我在应用程序打开时获取当前位置的纬度和经度,但在应用程序关闭时则不会.
我正在使用Service类来获取我的应用程序中的当前位置纬度和经度.
即使应用程序关闭,请告诉我如何获取当前位置的纬度和经度
我正在构建一个Android应用程序,它将跟踪用户的地理位置并在地图上绘制他们的路线.
我使用的是谷歌播放服务的位置API,如所描述这里.
我的应用程序需要获得ACCESS_FINE_LOCATION许可才是直观的,我将其放入清单中:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
Run Code Online (Sandbox Code Playgroud)
我还需要获得ACCESS_COARSE_LOCATION许可吗?我需要粗略位置的用例是什么?
android android-location android-permissions google-play-services google-geolocation
我试图通过使用获取位置FusedLocationApi.getLastLocation,我在清单文件中获得了位置权限:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Run Code Online (Sandbox Code Playgroud)
但是,null当我从系统请求位置时,我得到了.我只是测试关闭和位置服务,所以它可能与此有关(当然,当我尝试这个时它是开启的).但即使在返回null之后,我也在等待onLocationChanged被调用,而且它从未被调用过.我在这里也看到了类似的问题:FusedLocationApi.getLastLocation总是为null
这是我的代码:
protected LocationRequest createLocationRequest() {
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(120000);
mLocationRequest.setFastestInterval(30000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
return mLocationRequest;
}
protected GoogleApiClient getLocationApiClient(){
return new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
}
LocationRequest locationRequest = createLocationRequest();
@Override
public void onLocationChanged(Location location) {
App.setLocation(location); // NEVER CALLED
}
@Override
public void onConnected(Bundle bundle) {
App.setLocation(LocationServices.FusedLocationApi.getLastLocation(locationApiClient)); //RETURNS NULL
LocationRequest locationRequest = createLocationRequest();
LocationServices.FusedLocationApi.requestLocationUpdates(locationApiClient, locationRequest, this);
}
Run Code Online (Sandbox Code Playgroud)
在onCreate我的应用程序上:
locationApiClient = getLocationApiClient(); …Run Code Online (Sandbox Code Playgroud) android android-location android-4.4-kitkat fusedlocationproviderapi android-fusedlocation
我需要在两个位置之间获得距离,但我需要像图中的蓝线一样得到距离.

我接下来尝试:
public double getDistance(LatLng LatLng1, LatLng LatLng2) {
double distance = 0;
Location locationA = new Location("A");
locationA.setLatitude(LatLng1.latitude);
locationA.setLongitude(LatLng1.longitude);
Location locationB = new Location("B");
locationB.setLatitude(LatLng2.latitude);
locationB.setLongitude(LatLng2.longitude);
distance = locationA.distanceTo(locationB);
return distance;
}
Run Code Online (Sandbox Code Playgroud)
但我得到红线距离.
我在onAddGeofencesResult(int statusCode, String[] geofenceRequestIds)回调中遇到错误statusCode = 1000.
我启用了GPS和WiFi.我也有Google Play服务,我可以跟踪我的位置并请求更新.为什么我无法添加地理围栏?我甚至无法从文档示例应用程序添加地理围栏.我收到以下Toast消息:
"添加地理栅栏:失败,错误代码1000 GeofenceRequestIds = [1,2,1,2]"
从文档(statusCode 1000):
public static final int GEOFENCE_NOT_AVAILABLE
地理围栏服务现在不可用.通常这是因为用户在设置>位置访问中关闭了位置访问权限.
常数值:1000(0x000003e8)
android geolocation android-location google-play-services android-geofence
我使用下面给出的代码来获取位置:
public Location getLocation() {
try {
mLocationManager = (LocationManager) context.getSystemService(LOCATION_SERVICE);
// getting GPS status
boolean isGPSEnabled = mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
// getting network status
boolean isNetworkEnabled = mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
// no network provider is enabled
} else {
// First get location from Network Provider
if (isNetworkEnabled) {
mLocationManager.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
Log.d("Network", "Network");
if (mLocationManager != null) {
location = mLocationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
if (location != null) {
lat = location.getLatitude();
lng = location.getLongitude();
}
}
} …Run Code Online (Sandbox Code Playgroud) 是否有可能获得用户在位置设置选项下的三种模式中选择的位置模式的信息,即
1.准确度高
2.电池节省
3.仅限GPS
我想以编程方式检查用户是否选择了高精度模式,如果没有,则自动启用它.可能吗 ?请指教.