2015-12-01 6 views
-1

Одно из моих приложений для Android должно получить позиции gps, если приложение находится в состоянии уничтожения. Мое приложение получает позиции gps в настоящее время, когда оно находится в running(active) и pause(background) режимах. Но когда я уничтожил свое приложение, служба работает, но LocationListeneronLocationChanged(Location location) не звонит. Как я могу решать такие проблемы ?.Нужно получить позиции gps, если приложение убивает или уничтожает в android

public class LocationFinder extends Service { 
public static double lat, lng; 
LocationManager locationManager; 

public void onDestroy() { 
    super.onDestroy(); 
} 

@Override 
public void onCreate() { 
    super.onCreate(); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    super.onStartCommand(intent, flags, startId); 



    Log.v("location", "===>location ed onStartCommand " + lat + "==>" 
      + lng); 

    new Handler(Looper.getMainLooper()).post(new Runnable() { 

     @Override 
     public void run() { 
      getLocation(); 

     } 
    }); 

    return START_STICKY; 
} 

final LocationListener locationListener = new LocationListener() { 

// this method is not called when we destroyed the app. i want to call this method even app is in destoyed. 
    public void onLocationChanged(Location location) { 

     updateWithNewLocation(location); 


     Toast.makeText(
       getApplicationContext(), 
       "Location Finder : onLocation Changed " 
         + location.getLatitude() + " " 
         + location.getLongitude(), Toast.LENGTH_LONG) 
       .show(); 

    } 

    public void onProviderDisabled(String provider) { 
     updateWithNewLocation(null); 

    } 

    public void onProviderEnabled(String provider) { 
    } 

    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
}; 

public Location getLocation() { 
    Variables.writeLog("Enter into getLocation : \n", false); 
    String context = Context.LOCATION_SERVICE; 
    locationManager = (LocationManager) getSystemService(context); 
    Location location = null; 
    Criteria criteria = new Criteria(); 
    criteria.setAccuracy(Criteria.ACCURACY_COARSE); 
    criteria.setAltitudeRequired(false); 
    criteria.setBearingRequired(false); 
    criteria.setCostAllowed(true); 
    criteria.setPowerRequirement(Criteria.POWER_LOW); 
    Log.v("Location", "Before"); 
    if (locationManager != null) { 
     String provider = locationManager.getBestProvider(criteria, true); 
     boolean isGPSEnabled = locationManager 
       .isProviderEnabled(LocationManager.GPS_PROVIDER); 
     if (provider != null) { 

      if (isGPSEnabled) { 
       locationManager.requestLocationUpdates(
         LocationManager.GPS_PROVIDER, 10, 0, 
         locationListener); 
       if (locationManager != null) { 
        location = locationManager 
          .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
        locationManager.requestLocationUpdates(
          LocationManager.GPS_PROVIDER, 10, 0, 
          locationListener); 
        if (location != null) { 
         updateWithNewLocation(location); 
        } else { 
         location = locationManager 
           .getLastKnownLocation(provider); 
         updateWithNewLocation(location); 
         locationManager.requestLocationUpdates(provider, 
           10, 0, locationListener); 
        } 
       } else { 
        location = locationManager 
          .getLastKnownLocation(provider); 
        updateWithNewLocation(location); 
        locationManager.requestLocationUpdates(provider, 10, 0, 
          locationListener); 
       } 
      } else { 
       location = locationManager.getLastKnownLocation(provider); 
       updateWithNewLocation(location); 
       locationManager.requestLocationUpdates(provider, 10, 0, 
         locationListener); 
      } 
     } else { 
      if (locationManager 
        .isProviderEnabled(LocationManager.GPS_PROVIDER)) { 
       locationManager.requestLocationUpdates(
         LocationManager.GPS_PROVIDER, 10, 0, 
         locationListener); 
      } else if (locationManager 
        .isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { 
       locationManager.requestLocationUpdates(
         LocationManager.NETWORK_PROVIDER, 10, 0, 
         locationListener); 

      } else if (locationManager 
        .isProviderEnabled(LocationManager.PASSIVE_PROVIDER)) { 
       locationManager.requestLocationUpdates(
         LocationManager.PASSIVE_PROVIDER, 10, 0, 
         locationListener); 
      } 
     } 
    } 
    return location; 
} 

private void updateWithNewLocation(Location location) { 

    if (location != null) { 
     Log.v("location", "===>location ed " + lat); 

     lat = location.getLatitude(); 
     lng = location.getLongitude(); 

     Variables.writeLog("Lat :" + lat + " lng : " + lng, false); 

    } 
} 

@Override 
public IBinder onBind(Intent intent) { 
    // TODO Auto-generated method stub 
    return null; 
} 

}

+3

Оставьте свой код. – Jas

+0

@ Кристи вы решили свою проблему? – Tony

+0

Где код? –

ответ

0

Эй, вы должны создать справочную службу, которая будет работать в фоновом режиме и сделать эту работу для вас проверить эти ссылки link 1 link 2

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

+0

Моя проблема не решена, я получаю позиции через сервис. У меня мало сомнений в том, что метод onLocationChanged (Location location) вызывает или нет, когда приложение было уничтожено. – kristy

+0

Вам просто нужно получить широту и долготу местоположения пользователя? – Tony

0

Вам необходимо запустить фоновое обслуживание, которое будет получать местоположения с использованием gps.

public class AndroidLocationServices extends Service { 

WakeLock wakeLock; 

private LocationManager locationManager; 

public AndroidLocationServices() { 
    // TODO Auto-generated constructor stub 
} 

@Override 
public IBinder onBind(Intent arg0) { 
    // TODO Auto-generated method stub 
    return null; 
} 

@Override 
public void onCreate() { 
    // TODO Auto-generated method stub 
    super.onCreate(); 

    PowerManager pm = (PowerManager) getSystemService(this.POWER_SERVICE); 

    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "DoNotSleep"); 

    // Toast.makeText(getApplicationContext(), "Service Created", 
    // Toast.LENGTH_SHORT).show(); 

    Log.e("Google", "Service Created"); 

} 

@Override 
@Deprecated 
public void onStart(Intent intent, int startId) { 
    // TODO Auto-generated method stub 
    super.onStart(intent, startId); 

    new ToggleGPS(getApplicationContext()).turnGPSOn(); 

    // Toast.makeText(getApplicationContext(), "Service Started", 
    // Toast.LENGTH_SHORT).show(); 
    Log.e("Google", "Service Started"); 

    locationManager = (LocationManager) getApplicationContext() 
      .getSystemService(Context.LOCATION_SERVICE); 

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
      5000, 5, listener); 

} 

private LocationListener listener = new LocationListener() { 

    @Override 
    public void onLocationChanged(Location location) { 
     // TODO Auto-generated method stub 

     Log.e("Google", "Location Changed"); 

     if (location == null) 
      return; 

     if (isConnectingToInternet(getApplicationContext())) { 
      JSONArray jsonArray = new JSONArray(); 
      JSONObject jsonObject = new JSONObject(); 

      try { 
       Log.e("latitude", location.getLatitude() + ""); 
       Log.e("longitude", location.getLongitude() + ""); 

       jsonObject.put("latitude", location.getLatitude()); 
       jsonObject.put("longitude", location.getLongitude()); 

       jsonArray.put(jsonObject); 

       Log.e("request", jsonArray.toString()); 

       new LocationWebService().execute(new String[] { 
         Constants.TRACK_URL, jsonArray.toString() }); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 
}; 

@Override 
public void onDestroy() { 
    // TODO Auto-generated method stub 
    super.onDestroy(); 

    new ToggleGPS(getApplicationContext()).turnGPSOff(); 
    wakeLock.release(); 

} 

public static boolean isConnectingToInternet(Context _context) { 
    ConnectivityManager connectivity = (ConnectivityManager) _context 
      .getSystemService(Context.CONNECTIVITY_SERVICE); 
    if (connectivity != null) { 
     NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
     if (info != null) 
      for (int i = 0; i < info.length; i++) 
       if (info[i].getState() == NetworkInfo.State.CONNECTED) { 
        return true; 
       } 

    } 
    return false; 
} 

}

Я нашел этот код в GitHub. он работает, я использовал его в своей пристройке. GITHUB LINK

+0

Разве это не так, как я сказал ??? – Tony

+0

Вы не упомянули, что у вас есть служба, которая использует диспетчер местоположений для получения координат gps в фоновом режиме, вот почему я ответил на это. Во всяком случае было бы лучше, если бы вы опубликовали свой код –

+0

Если вы прочтете его вопрос, вы увидите, что он уже достиг персонала службы служб местоположения, но он хочет знать, как заставить его работать в фоновом режиме. PLZ попытается поставить его на дорогу и не делать дать полный код – Tony