有没有一种可能的方式来使用GPS提供商快速检测新的位置?GPS提供商及其性能
回答
GPS通常很慢 - 就是这样。但也有几件事情可以为了加快用户的体验做到:
立即开始寻找一个位置的应用程序启动 - 不要等到他们到了那需要一个活动位置
使用网络供应商,这往往要快得多
使用被动提供商。即接收已被设备上的其他应用程序获取的位置更新
使用最后已知位置 - 将其存储一段时间,如果存在,则立即为您提供位置(虽然它可能有点旧)
如果适用于您的应用程序的情况下,保存在首选项
本文章由谷歌的雷托迈耶是一个伟大的地方开始自己的位置 - 看看在示例代码和详细的相关链接 http://blog.radioactiveyak.com/2011/06/how-to-build-location-based-apps-that.html
thinks olie c,但我认为网络提供商不比gps提供商更准确。我如何使用lastknown位置来检测新位置? – Dev
查看本页面的“快速修复最后一次已知位置”。这很容易http://developer.android.com/guide/topics/location/obtaining-user-location.html –
U可以通过网络提供商和GPS提供商检索位置。
如果你想快速检索位置,你可以同时检查两个提供者。 这里是代码..
创建一类像这首:
import android.content.Context;
import android.content.Intent;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.Handler;
import android.provider.Settings;
import android.util.Log;
import android.widget.Toast;
import com.tcs.android.eventinfo.data.DataStore;
public class GeoFence {
// public Timer timer1;
LocationManager lm;
LocationResult locationResult;
boolean gps_enabled=false;
boolean network_enabled=false;
Context mContext;
public Handler handler;
public GetLastLocation r;
public boolean isLocationNullSecondTime=false;
public GeoFence(Context context) {
mContext=context;
handler = new Handler();
chekStatusOfLocationProvider(isLocationNullSecondTime);
}
public void chekStatusOfLocationProvider(boolean isLocationNullSecondTime){
if(lm==null)
lm = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
Log.i("GPS"," GPS"+lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER));
Log.i("GPS"," Network"+lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER));
Log.i("GPS"," Passive"+lm.isProviderEnabled(LocationManager.PASSIVE_PROVIDER));
if ((!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)
&& !lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
|| isLocationNullSecondTime) {
Log.i("GPS", "Inside Constructor");
Toast.makeText(mContext, "Turn on your Location provider",
Toast.LENGTH_LONG).show();
Intent myIntent = new Intent(
Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(myIntent);
}
}
public boolean getLocation(LocationResult result)
{
Log.i("GEo fence","DataStore.IS_THREAD_RUNNING : "+DataStore.IS_THREAD_RUNNING);
if(!DataStore.IS_THREAD_RUNNING) {
/* if ((!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)
&& !lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
|| isLocationNullSecondTime) {
Log.i("GPS", "Inside Constructor");
Toast.makeText(mContext, "Turn on your Location provider",
Toast.LENGTH_LONG).show();
Intent myIntent = new Intent(
Settings.ACTION_LOCATION_SOURCE_SETTINGS);
mContext.startActivity(myIntent);
}*/
Log.i("GPS","inside getlocation");
//I use LocationResult callback class to pass location value from MyLocation to user code.
locationResult=result;
//exceptions will be thrown if provider is not permitted.
try{gps_enabled=lm.isProviderEnabled(LocationManager.GPS_PROVIDER);}catch(Exception ex){}
try{network_enabled=lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);}catch(Exception ex){}
//don't start listeners if no provider is enabled
if(!gps_enabled && !network_enabled){
Log.i("GPS","nothing is enable");
return false;
}
if(gps_enabled){
Log.i("GPS","inside getlocation Gps is enabled");
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 5000, locationListenerGps);
}
if(network_enabled){
Log.i("GPS","inside getlocation netwok is enable");
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,0, 5000, locationListenerNetwork);
}
r=new GetLastLocation();
handler.postDelayed(r,20000);
return true;
}
else {
return false;
}}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location) {
DataStore.IS_THREAD_RUNNING=true;
Log.i("GPS","inside onLocationcahnged of gps");
isLocationNullSecondTime=false;
lm.removeUpdates(this);
lm.removeUpdates(locationListenerNetwork);
handler.removeCallbacks(r);
locationResult.gotLocation(location);
}
public void onProviderDisabled(String provider) { Log.i("GPS","inside onProviderDisabled of gps");}
public void onProviderEnabled(String provider) { Log.i("GPS","inside onProviderEnabled of gps");}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
LocationListener locationListenerNetwork = new LocationListener() {
public void onLocationChanged(Location location) {
DataStore.IS_THREAD_RUNNING=true;
Log.i("GPS","inside onLocationcahnged of Network");
isLocationNullSecondTime=false;
lm.removeUpdates(this);
lm.removeUpdates(locationListenerGps);
handler.removeCallbacks(r);
locationResult.gotLocation(location);
}
public void onProviderDisabled(String provider) {Log.i("GPS","inside onProviderDisabled of Network");}
public void onProviderEnabled(String provider) {Log.i("GPS","inside onProviderEnabled of Network");}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
class GetLastLocation implements Runnable {
@Override
public void run() {
DataStore.IS_THREAD_RUNNING=true;
Log.i("GPS","inside the thread run");
lm.removeUpdates(locationListenerGps);
lm.removeUpdates(locationListenerNetwork);
Location net_loc=null, gps_loc=null;
if(gps_enabled){
gps_loc=lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
Log.i("GPS","gps location object :"+gps_loc);
}
if(network_enabled){
net_loc=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
Log.i("GPS","neteork object :"+ net_loc);
}
//if there are both values use the latest one
if(gps_loc!=null && net_loc!=null){
handler.removeCallbacks(r);
isLocationNullSecondTime=false;
Log.i("GPS","neteork object not null :"+ net_loc);
Log.i("GPS","GPS object not null :"+ gps_loc);
if(gps_loc.getTime()>net_loc.getTime())
locationResult.gotLocation(gps_loc);
else
locationResult.gotLocation(net_loc);
return;
}else{
handler.removeCallbacks(r);
if(gps_loc!=null){
isLocationNullSecondTime=false;
locationResult.gotLocation(gps_loc);
return;
}
else if(net_loc!=null){
isLocationNullSecondTime=false;
locationResult.gotLocation(net_loc);
return;
}
else{
isLocationNullSecondTime=true;
Log.i("GPS","Both the object is null and asking for turn on the Location provider :");
locationResult.gotLocation(null);
return;
}
}
//locationResult.gotLocation(null);
}
}
public static abstract class LocationResult{
public abstract void gotLocation(Location location);
}
然后在活动编写代码或实现这样的gotLocation(位置定位)方法:
public LocationResult locationResult = new LocationResult() {
@Override
public void gotLocation(final Location location) {
// do something
mLocation = location;
if (geoFence.handler != null) {
geoFence.handler.removeCallbacks(geoFence.r);
}
if (location == null) {
if (DataStore.IS_THREAD_RUNNING) {
DataStore.IS_THREAD_RUNNING=false;
}
if (!lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
createAlert("Turn on ur GPS provider", new int[] {
R.string.yes, R.string.no },2);
return;
}
if (!lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
createAlert("Turn on ur Network provider", new int[] {
R.string.yes, R.string.no },2);
return;
}
Toast.makeText(PreHomeScreen.this,
"Turn on your both Location provider and try again ",
Toast.LENGTH_LONG).show();
} else {
//////////////////////////////////Do ur work/////////////////////////////////////
}
}
};
我的博客包含如何明星的示例代码t位置服务并等待工作线程中的位置。您可以在应用程序启动时开始搜索位置,但在后台等待时继续运行应用程序。在需要位置之前,用户可能需要做一些事情,并且此时位置服务可以返回可用位置。
- 1. GPS提供商不提供
- 2. Android GPS提供商
- 3. 使用网络提供商和GPS提供商的GPS?
- 4. SecureRandom及其不同的提供商
- 5. 网络提供商与GPS提供商模拟位置android
- 6. 的LocationManager例外提供商“GPS”未知
- 7. GPS提供商安全例外
- 8. Android - GPS提供商不工作
- 9. GPS位置提供商可用性问题
- 10. 无法使用GPS提供商和网络提供商获取更新位置?
- 11. 支持的GPS提供商列表与禁用的GPS提供商列表相同
- 12. 提高Android GPS性能
- 13. 扩展服务提供商(提供商)
- 14. MSDAORA提供商
- 15. Angular2提供商
- 16. 角提供商
- 17. 为SAML服务提供商提供适当的安全性
- 18. Android:请求GPS提供商的特定时间
- 19. 当用户检查GPS提供商时,强行关闭
- 20. 通过GPS和网络提供商获取位置
- 21. 位置正在返回null LocationManager.getlastlocation Gps提供商
- 22. android GPS提供商的问题:太多更新
- 23. 在网络和GPS提供商之间切换
- 24. Android:如何使用GPS提供商离线当前位置?
- 25. 风俗MvcSiteMap提供商属性
- 26. IS从网络供应商或gps
- 27. 是否有可能为所有Cache提供商提供jsr107
- 28. Java OAuth提供商
- 29. 内容提供商
- 30. 链接提供商
使用网络提供商...... – st0le
谢谢,但为什么GPS提供商很慢,检测的位置? – Dev
谢谢stl0e&Jonas ... – Dev