GPS провайдер и его производительность - PullRequest
1 голос
/ 03 сентября 2011

Есть ли способ очень быстро обнаружить новое местоположение с помощью провайдера GPS?

Ответы [ 3 ]

6 голосов
/ 03 сентября 2011

GPS часто работает медленно - так оно и есть. Но есть несколько вещей, которые вы можете сделать, чтобы ускорить взаимодействие с пользователем:

  • Начните искать местоположение, как только приложение запустится - не ждите, пока они доберутся до действия, для которого требуется местоположение

  • Использование сетевого провайдера, который часто намного быстрее

  • Воспользуйтесь пассивным провайдером. то есть получать обновления местоположения, которые были получены другими приложениями на устройстве

  • Использовать последнее известное местоположение - оно сохраняется некоторое время и, если оно существует, мгновенно дает вам местоположение (хотя оно может быть немного старым)

  • Если это уместно в контексте вашего приложения, сохраните местоположение в префе

Эта статья от Reto Meier от Google - отличное место для начала - посмотрите на соответствующие ссылки для примера кода и более подробно http://blog.radioactiveyak.com/2011/06/how-to-build-location-based-apps-that.html

0 голосов
/ 21 декабря 2012

Мой блог содержит пример кода о том, как запустить службы определения местоположения и ожидать местоположение в рабочем потоке. Вы можете начать поиск местоположения в тот момент, когда приложение запускается, но продолжить работу приложения, пока оно ждет в фоновом режиме. Пользователю может потребоваться что-то сделать до того, как потребуется местоположение, и в это время службы определения местоположения могут вернуть доступное местоположение.

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

0 голосов
/ 16 апреля 2012

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

}

    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...