2014-01-13 69 views
3

我沒有任何運氣使用下面的代碼從GPS接收任何數據,我不知道我做錯了什麼,它似乎像我的代碼匹配我看到的一切線上。我想最終添加到後臺服務來記錄GPS座標,即使活動不可見或其他應用程序已打開並且速度大於某個確定數量時也是如此,但此時我無法即使得到任何數據顯示。我相對較新的Android,但我無法弄清楚我做錯了什麼?如何使用Android LocationManager和監聽器

public class MainActivity extends Activity { 
TextView textView; 
MyLocationListener myLocationListener; 
LocationManager lm; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    this.textView = (TextView)findViewById(R.id.message); 
    addLocationListener(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

private void addLocationListener() 
{ 
    lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 

    Criteria c = new Criteria(); 
    c.setAccuracy(Criteria.ACCURACY_FINE); 

    final String PROVIDER = lm.getBestProvider(c, true); 

    this.myLocationListener = new MyLocationListener(); 
    this.lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0L, 0.0F, this.myLocationListener); 
    //lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0L, 0.0F, myLocationListener); 
    Log.d("LOC_SERVICE", "Service RUNNING!"); 
} 

public void updateLocation(Location location) 
{ 
    double latitude, longitude; 

    latitude = location.getLatitude(); 
    longitude = location.getLongitude(); 
    int mph = convertSpeed(location.getSpeed()); 
    Log.d("LOC_SERVICE", "mph: "+mph); 
    this.textView.setText(this.textView.getText()+"\n"+"lat: "+latitude+" lng: "+longitude+" mph: "+mph); 
} 


private int convertSpeed(float speed) { 
    int mph =(int)(2.236936D * speed); 
    return mph; 
} 


class MyLocationListener implements LocationListener { 
    @Override 
    public void onLocationChanged(Location location) { 
     Log.d("LOC_SERVICE", "Listener RUNNING!"); 
     updateLocation(location); 
    } 
    @Override 
    public void onProviderDisabled(String provider) {} 
    @Override 
    public void onProviderEnabled(String provider) {} 
    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) {} 
} 
} 
+0

我沒有看到任何錯誤,只是你需要刪除'onDestroy'中的位置監聽器。 – gunar

回答

4

嘗試下面的代碼 -

package com.muslimcompanion.utills; 

import android.app.AlertDialog; 
import android.app.Service; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.provider.Settings; 
import android.util.Log; 

public class GPSTracker extends Service implements LocationListener { 

    private final Context mContext; 

    // flag for GPS status 
    boolean isGPSEnabled = false; 

    // flag for network status 
    boolean isNetworkEnabled = false; 

    // flag for GPS status 
    boolean canGetLocation = false; 

    Location location; // location 
    double latitude; // latitude 
    double longitude; // longitude 

    // The minimum distance to change Updates in meters 
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters 

    // The minimum time between updates in milliseconds 
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute 

    // Declaring a Location Manager 
    protected LocationManager locationManager; 

    public GPSTracker(Context context) { 
     this.mContext = context; 
     getLocation(); 
    } 

    public Location getLocation() { 
     try { 
      locationManager = (LocationManager) mContext 
        .getSystemService(LOCATION_SERVICE); 

      // getting GPS status 
      isGPSEnabled = locationManager 
        .isProviderEnabled(LocationManager.GPS_PROVIDER); 

      // getting network status 
      isNetworkEnabled = locationManager 
        .isProviderEnabled(LocationManager.NETWORK_PROVIDER); 

      if (!isGPSEnabled && !isNetworkEnabled) { 
       // no network provider is enabled 
      } else { 
       this.canGetLocation = true; 
       // First get location from Network Provider 
       if (isNetworkEnabled) { 
        locationManager.requestLocationUpdates(
          LocationManager.NETWORK_PROVIDER, 
          MIN_TIME_BW_UPDATES, 
          MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
        Log.d("Network", "Network"); 
        if (locationManager != null) { 
         location = locationManager 
           .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
         if (location != null) { 
          latitude = location.getLatitude(); 
          longitude = location.getLongitude(); 
         } 
        } 
       } 
       // if GPS Enabled get lat/long using GPS Services 
       if (isGPSEnabled) { 
        if (location == null) { 
         locationManager.requestLocationUpdates(
           LocationManager.GPS_PROVIDER, 
           MIN_TIME_BW_UPDATES, 
           MIN_DISTANCE_CHANGE_FOR_UPDATES, this); 
         Log.d("GPS Enabled", "GPS Enabled"); 
         if (locationManager != null) { 
          location = locationManager 
            .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
          if (location != null) { 
           latitude = location.getLatitude(); 
           longitude = location.getLongitude(); 
          } 
         } 
        } 
       } 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return location; 
    } 


    public void stopUsingGPS(){ 
     if(locationManager != null){ 
      locationManager.removeUpdates(GPSTracker.this); 
     }  
    } 


    public double getLatitude(){ 
     if(location != null){ 
      latitude = location.getLatitude(); 
     } 

     // return latitude 
     return latitude; 
    } 


    public double getLongitude(){ 
     if(location != null){ 
      longitude = location.getLongitude(); 
     } 

     // return longitude 
     return longitude; 
    } 


    public boolean canGetLocation() { 
     return this.canGetLocation; 
    } 


    public void showSettingsAlert(){ 
     AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext); 

     // Setting Dialog Title 
     alertDialog.setTitle("GPS is settings"); 

     // Setting Dialog Message 
     alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?"); 

     // On pressing Settings button 
     alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog,int which) { 
       Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
       mContext.startActivity(intent); 
       dialog.cancel(); 
      } 
     }); 


     alertDialog.setCancelable(false); 
     alertDialog.show(); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

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

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

} 

現在把這些線到你的活動 -

GPSTracker gps = new GPSTracker(this); 
int status = 0; 
if(gps.canGetLocation()) 

{ 
    status = GooglePlayServicesUtil 
      .isGooglePlayServicesAvailable(getApplicationContext()); 

    if (status == ConnectionResult.SUCCESS) { 
     current_lattitude = gps.getLatitude(); 
     current_longitude = gps.getLongitude(); 
     _appPrefs.saveSmsBody("" + current_lattitude); 
     _appPrefs.saveSmsBody("" + current_longitude); 
     Log.d("dashlatlongon", "" + current_lattitude + "-" 
       + current_longitude); 

     if (current_lattitude == 0.0 && current_longitude == 0.0) { 
      current_lattitude = 22.22; 
      current_longitude = 22.22; 

     } 

    } else { 
     current_lattitude = 22.22; 
     current_longitude = 22.22; 
    } 

} 
else 
{ 
    gps.showSettingsAlert(); 
} 
+0

你說要添加到活動中的第二部分,在哪裏是最好的位置,我讀了我知道onCreate(),onStart()和onResume()之間的區別,但我並不真正瞭解代碼的最佳位置在onCreate()和onStart()之間的位置,它們看起來像是幾乎相互稱呼,這是否真的有所作爲? – kortex

+0

是的,它會有所作爲,你希望如何執行它以達到你的要求。 – Poison

+0

如果你把它放在Create()方法上,它可能會更好。如果你解決了你的問題,那就讓它變好,以便下一個用戶可以得到解決謝謝。 – Poison

2

首先,您需要使用權限:內

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 

接下來你onCreate()方法使用下面的代碼來ge無法訪問GPS。

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

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

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
      2000, 1, this); 

} 

現在,如果GPS沒有啓用,那麼你需要參考下面的代碼。有關詳細說明,可以參考如何獲得current location in android教程。

Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS); 
     startActivity(intent); 

在這裏,我們使用意圖將用戶重定向到位置設置頁面,以便他可以在位置設置下啓用GPS。