2013-03-26 207 views
1

使用Criteria.ACCURACY_COARSE我得到的位置,但它不準確。我想使用GPS Criteria.ACCURACY_FINE,但不調用onLocationChanged(Location location)方法。
我做了一些研究,但不知道爲什麼。
在StackOverflow上有很多類似的問題,但不幸的是我找不到解決我的問題的問題。
下面是我的源代碼:從GPS獲取當前位置

private void locationInformationSettings(){ 
    Criteria criteria= new Criteria();; 
    criteria.setAccuracy(Criteria.ACCURACY_FINE); //using Criteria.ACCURACY_COARSE works 
    //criteria.setPowerRequirement(Criteria.POWER_LOW); 

    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    String providername = locationManager.getBestProvider(criteria, true); 

    myLocationListener = new MyLocationListener(); 

    locationManager.requestLocationUpdates(
      providername, //LocationManager.GPS_PROVIDER, 
      Utils.MINIMUM_TIME_BETWEEN_UPDATES, 
      Utils.MINIMUM_DISTANCE_CHANGE_FOR_UPDATES, 
      myLocationListener 
    );  
} 

private class MyLocationListener implements LocationListener { 

    public void onLocationChanged(Location location) { 

     locLongitude = location.getLongitude(); 
     locLatitude = location.getLatitude(); 
     String message = String.format(
       "New Location \n Longitude: %1$s \n Latitude: %2$s", 
       locLongitude, locLatitude); 
     Toast.makeText(RecordActivity.this, message, Toast.LENGTH_LONG).show(); 
     Log.e(TAG, "Location information received:(" + locLongitude + "," + locLatitude +")"); 
     locationManager.removeUpdates(myLocationListener); 
    } 

    public void onStatusChanged(String s, int i, Bundle b) { 
     Toast.makeText(RecordActivity.this, "Provider status changed", 
       Toast.LENGTH_LONG).show(); 
    } 

    public void onProviderDisabled(String s) { 
     Toast.makeText(RecordActivity.this, 
       "Provider disabled by the user. GPS turned off", 
       Toast.LENGTH_LONG).show(); 
    } 

    public void onProviderEnabled(String s) { 
     Toast.makeText(RecordActivity.this, 
       "Provider enabled by the user. GPS turned on", 
       Toast.LENGTH_LONG).show(); 
    } 

} 

清單文件權限:

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

爲什麼使用網絡提供商的作品和GPS提供商不起作用?
我已經檢查了我的設備上的GPS服務設置並測試了Android 4.3和Android 2.3.3。
在此先感謝

+0

而不是條件你爲什麼不要求LocationManager.GPS_PROVIDER位置更新,然後看看它是否先工作。 – 2013-03-26 02:08:51

+0

@HoanNguyen正如你可以在註釋中注意到的那樣,我已經嘗試過了,但它不起作用。 – 2013-03-26 02:11:17

+0

獲取GPS位置不是立竿見影。你應該看到GPS圖標試圖獲得修復頂部托盤.. – 2013-03-26 02:11:37

回答

2

在這裏你去

package com.test.locationmanager; 

import android.app.Activity; 
import android.content.Context; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.location.LocationProvider; 
import android.os.Bundle; 
import android.widget.TextView; 

public class LocationManagerStatus extends Activity { 

private LocationManager locationManager; 
private TextView textView; 
private final LocationListener gpsLocationListener = new LocationListener() { 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     final String tvTxt = textView.getText().toString(); 
     switch (status) { 
     case LocationProvider.AVAILABLE: 
      textView.setText(tvTxt + "GPS available again\n"); 
      break; 
     case LocationProvider.OUT_OF_SERVICE: 
      textView.setText(tvTxt + "GPS out of service\n"); 
      break; 
     case LocationProvider.TEMPORARILY_UNAVAILABLE: 
      textView.setText(tvTxt + "GPS temporarily unavailable\n"); 
      break; 
     } 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     textView.setText(textView.getText().toString() 
       + "GPS Provider Enabled\n"); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     textView.setText(textView.getText().toString() 
       + "GPS Provider Disabled\n"); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     locationManager.removeUpdates(networkLocationListener); 
     textView.setText(textView.getText().toString() 
       + "New GPS location: " 
       + String.format("%9.6f", location.getLatitude()) + ", " 
       + String.format("%9.6f", location.getLongitude()) + "\n"); 
    } 
}; 
private final LocationListener networkLocationListener = new LocationListener() { 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     final String tvTxt = textView.getText().toString(); 
     switch (status) { 
     case LocationProvider.AVAILABLE: 
      textView.setText(tvTxt + "Network location available again\n"); 
      break; 
     case LocationProvider.OUT_OF_SERVICE: 
      textView.setText(tvTxt + "Network location out of service\n"); 
      break; 
     case LocationProvider.TEMPORARILY_UNAVAILABLE: 
      textView.setText(tvTxt 
        + "Network location temporarily unavailable\n"); 
      break; 
     } 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     textView.setText(textView.getText().toString() 
       + "Network Provider Enabled\n"); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     textView.setText(textView.getText().toString() 
       + "Network Provider Disabled\n"); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     textView.setText(textView.getText().toString() 
       + "New network location: " 
       + String.format("%9.6f", location.getLatitude()) + ", " 
       + String.format("%9.6f", location.getLongitude()) + "\n"); 
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    textView = (TextView) findViewById(R.id.textview); 
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    locationManager.requestLocationUpdates(
      LocationManager.NETWORK_PROVIDER, 5000, 0, 
      networkLocationListener); 
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
      3000, 0, gpsLocationListener); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    locationManager.removeUpdates(networkLocationListener); 
    locationManager.removeUpdates(gpsLocationListener); 
} 
} 
0

好了經過近2個月沒有迴應,我決定去下面的工作。
希望它能幫助別人節省一些時間。

public class GpsLocationService extends Service implements LocationListener{ 

    private final String TAG = getClass().getSimpleName(); 

    private LocationManager locationManager; 
    private String provider; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.i(TAG, "onCreate()"); 
     // Get the location manager 
     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     // Define the criteria how to select the locatioin provider -> use 
     // default 
     Criteria criteria = new Criteria(); 
     provider = locationManager.getBestProvider(criteria, false); 
     Location location = locationManager.getLastKnownLocation(provider); 

     // Initialize the location fields 
     if (location != null) { 
      Log.d(TAG, "Provider " + provider + " has been selected."); 
      onLocationChanged(location); 
     } 
     else { 
      Log.d(TAG, "Location not available!"); 
     } 

    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     Log.i(TAG, "GpsLocationService has started!"); 


     locationManager.requestLocationUpdates(provider, 400, 1, this); 

     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() { 
     Log.i(TAG, "GpsLocationService is destroyed!"); 
     super.onDestroy(); 
     locationManager.removeUpdates(this); 
    } 

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



    @Override 
    public void onLocationChanged(Location location) { 
     double lat = location.getLatitude(); 
     double lng = location.getLongitude(); 
     Log.i(TAG, "onLocationChanged() lat = " + lat + " long = " + lng);  
    } 

    @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 

    } 

} 

而在你的manifest文件不要忘記添加以下權限:

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

提到您的服務也:

<service android:name=".GpsLocationService"></service>