onLocationChanged wird nie aufgerufen, mithilfe requestLocationUpdates mit GPS-Anbieter
Bin ich eine Anwendung entwickeln, mithilfe von service, um Nutzer zu verfolgen Standorten und senden Sie die Daten an den server im hintergrund. Es ist die GPS-gestützte app. Wenn mein Programm namens requestLocationUpdates mit GPS-Anbieter, die onLocationChanged wird nie aufgerufen. Jedoch, die requestLocationUpdates funktioniert mit den Netzwerk-Anbieter auf meine app. Bitte werfen Sie einen Blick auf meinen code.
Android-version: 4.1.2
Gerät: Galaxy nexus S
Tracker.java
private void init() {
locationListener = new MyLocationListener();
mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
NOTIFICATION = R.string.local_service_started;
arrivedStatus = false;
activity = TrackerActivity.getAppActivity();
}
@Override
public void onCreate() {
super.onCreate();
init();
Log.i(tag, "Start Tracking");
showStartNotification();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.i("LocalService", "Received start id " + startId + ": " + intent);
tripID = intent.getExtras().getInt("tripID") + "";
locationInterval = intent.getExtras().getInt("locationInterval")
* MILLISECONDS_PER_SECOND;
//lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
// locationInterval, 0, locationListener);
getLocation();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("STOP_SERVICE", "Service has stopped");
mNM.cancel(R.string.local_service_started);
lm.removeUpdates(locationListener);
stopSelf();
}
private void getLocation() {
lm = (LocationManager) getApplicationContext().getSystemService(
Context.LOCATION_SERVICE);
//getting GPS status
isGPSEnabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
//getting network status
isNetworkEnabled = lm
.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!isGPSEnabled && !isNetworkEnabled) {
//no network provider is enabled
Log.e(tag, "Non providers are enabled");
} else {
if (isGPSEnabled) {
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
locationInterval, 0, locationListener);
Log.d(tag, "GPS Enabled");
}
if (isNetworkEnabled) {
if (lm == null) {
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
locationInterval, 0, locationListener);
Log.d(tag, "Network Enabled");
}
}
}
}
@Override
public IBinder onBind(Intent intent) {
//TODO Auto-generated method stub
return null;
}
@SuppressWarnings("deprecation")
private void showStartNotification() {
//In this sample, we'll use the same text for the ticker and the
//expanded notification
CharSequence text = getText(R.string.local_service_started);
//Set the icon, scrolling text and timestamp
Notification notification = new Notification(R.drawable.cameral, text,
System.currentTimeMillis());
//The PendingIntent to launch our activity if the user selects this
//notification+
PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
new Intent(this, TrackerActivity.class), 0);
//Set the info for the views that show in the notification panel.
notification.setLatestEventInfo(this,
getText(R.string.local_service_label), text, contentIntent);
//Send the notification.
mNM.notify(NOTIFICATION, notification);
}
/**
* private void showStopSpecification() { CharSequence text =
* getText(R.string.local_service_cancel); Notification notification = new
* Notification(R.drawable.btn_save_dialog, text,
* System.currentTimeMillis()); mNM.notify(NOTIFICATION, notification); }
*/
private void checkResult(JSONObject json) {
try {
if (json.getString(KEY_SUCCESS) != null) {
String res = json.getString(KEY_SUCCESS);
if (Integer.parseInt(res) == 1) {
Log.v(tag, "Store data successfully");
activity.findViewById(R.id.tracker_info)
.setBackgroundResource(R.color.blue4);
if (json.getInt(ARRIVED_STATUS) == 1) {
setArrivedStatus(true);
} else {
setArrivedStatus(false);
}
} else if (json.getString(KEY_ERROR).equals("1")) {
//Error in login
String error_msg = json.getString(KEY_ERROR_MSG);
Log.e(tag, error_msg);
setArrivedStatus(false);
} else {
Log.e(tag, "Something is wrong");
setArrivedStatus(false);
}
} else {
Log.e(tag, "Something is wrong");
setArrivedStatus(false);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
public void setArrivedStatus(boolean status) {
arrivedStatus = status;
}
public boolean getArrivedStatus() {
return arrivedStatus;
}
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location location) {
//TODO Auto-generated method stub
currentLat = location.getLatitude() + "";
currentLng = location.getLongitude() + "";
Log.v(tag, LOCATION_CHANGED + " lat=" + currentLat + ", lon="
+ currentLng);
try {
JSONObject json = new LogInfo().execute(
new String[] { tripID, currentLat, currentLng }).get();
checkResult(json);
if (getArrivedStatus() == true) {
Log.v(tag, "User has arrived safely");
onDestroy();
}
} catch (InterruptedException e) {
//TODO Auto-generated catch block
e.printStackTrace();
} catch (ExecutionException 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
}
}
}
Ich auch schon Hinzugefügt, die Erlaubnis zu meinem Manifest
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Danke
Du musst angemeldet sein, um einen Kommentar abzugeben.
wenn Sie diese Funktion aufrufen, sehen Sie das GPS-Symbol in der Benachrichtigungsleiste des Gerätes? wenn dem so ist, bedeutet es, dass es versucht, sich einen Ort und du bist gerade in einem Ort ohne GPS-Empfang.
in jedem Fall können Sie verwenden den Google-Weg, um den Ort, hier: https://developers.google.com/events/io/sessions/324498944
auch, was ist der Klasse "Tracker"? ist es ein Dienst? wenn dem so ist, sollten Sie nicht zulassen, Sie haben einen Verweis auf eine Tätigkeit, da kann es zu memory-leaks. verwenden Sie stattdessen die richtige Bindung .
sollten Sie auch vermeiden, den Aufruf "onDestroy" , da ruft es nicht wirklich in der Nähe Ihren Dienst. stattdessen rufen Sie "stopSelf", und stellen Sie sicher, dass keine Aktivität gebunden ist.
wenn Sie wollen, ich habe gefragt, diese Frage (immer eine Lage über einen Dienstleister) eine lange Zeit vor, hier.