GPS提供商及其表现

时间:2011-09-03 09:46:39

标签: android gps

是否有可能使用GPS提供商快速检测新位置?

3 个答案:

答案 0 :(得分:6)

GPS往往很慢 - 这就是它的方式。但是,为了加快用户体验,您可以采取以下措施:

  • 应用程序启动后立即开始寻找位置 - 不要等到他们进入需要某个位置的活动

  • 使用网络提供商,这通常要快得多

  • 使用被动提供程序。即接收设备上其他应用获取的位置更新

  • 使用最近一次的位置 - 存储一段时间,如果存在,会立即为您提供一个位置(虽然可能有点旧)

  • 如果您的应用程序的上下文合适,请自行在prefs中存储位置

Google的Reto Meier的这篇文章是一个很好的起点 - 查看示例代码的相关链接和更多细节 http://blog.radioactiveyak.com/2011/06/how-to-build-location-based-apps-that.html

答案 1 :(得分:0)

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);
}

然后在您的Activity中编写代码或实现gotLocation(Location location)方法,如下所示:

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/////////////////////////////////////

}

    }
};

答案 2 :(得分:0)

我的博客包含有关如何启动位置服务并等待工作线程中的位置的示例代码。您可以在应用程序启动时开始搜索位置,但在后台等待时继续运行应用程序。用户可能需要在需要位置之前执行某些操作,并且此时位置服务可以返回可用位置。

http://www.scotthelme.co.uk/blog/android-location-services/