1
我想编程一个GPS定位器,它每15秒更新一次位置。然而,更新的方法(onLocationChanged)不会被调用... 它只设置一次TextView中的位置,当按下按钮时,显示的时间有时也是几分钟之前...GPS位置不会更新
什么时候确切地获得onLocationChanged调用?每10秒(或更快)强制强制还是仅当位置更改时强制?
我的代码(仅适用于GPS的代码,也有代码来检查,如果谷歌Play服务激活):
/* IMPORT FILES */
public class MainActivity extends ActionBarActivity implements
GooglePlayServicesClient.ConnectionCallbacks,
GooglePlayServicesClient.OnConnectionFailedListener,
LocationListener {
///////////////////////////////////////////////////////////////////
/*
* Attributes
*/
private static LocationClient mLocationClient;
private static boolean LocEnabled = false;
private static boolean LocConnected = false;
private static LocationRequest LocRequest;
///////////////////////////////////////////////////////////////////
/*
* Location Update Settings
*/
// Milliseconds per second
private static final int MILLISECONDS_PER_SECOND = 1000;
// Update frequency in seconds
public static final int UPDATE_INTERVAL_IN_SECONDS = 15;
// Update frequency in milliseconds
private static final long UPDATE_INTERVAL = MILLISECONDS_PER_SECOND * UPDATE_INTERVAL_IN_SECONDS;
// The fastest update frequency, in seconds
private static final int FASTEST_INTERVAL_IN_SECONDS = 1;
// A fast frequency ceiling in milliseconds
private static final long FASTEST_INTERVAL = MILLISECONDS_PER_SECOND * FASTEST_INTERVAL_IN_SECONDS;
///////////////////////////////////////////////////////////////////
/*
* Local Vars
*/
SharedPreferences Prefs;
Editor Editor;
boolean UpdatesRequested;
//VIEW Elements
static Button btn_refresh_loc;
static TextView txt_position;
static View rootView;
//Position elements
static Position myPosition = new Position("Meine Position");
static Location lastLocation;
///////////////////////////////////////////////////////////////////
/*
* METHODS TO CHECK FOR GOOGLE PLAY SERVICES */
///////////////////////////////////////////////////////////////////
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
getSupportFragmentManager().beginTransaction()
.add(R.id.container, new MainFragment())
.commit();
}
//check for G-Play Services
if(servicesConnected())
{
Toast.makeText(getApplicationContext(), "Google Play Services available", Toast.LENGTH_SHORT).show();
Log.i("G Play Services", "Google Play Services available");
}
else
{
Toast.makeText(getApplicationContext(), "Google Play Services not available", Toast.LENGTH_SHORT).show();
Log.e("G Play Services", "Google Play Services NOT AVAILABLE");
finish();
}
//check for Location Service activated
if(checkLocEnabled())
{
Toast.makeText(getApplicationContext(), "Location Service enabled", Toast.LENGTH_SHORT).show();
Log.i("LOC", "Location Service enabled");
LocEnabled = true;
}
else
{
Toast.makeText(getApplicationContext(), "Location Service disabled", Toast.LENGTH_SHORT).show();
Log.e("LOC", "Location Service DISABLED");
showGPSsettings();
}
// Open the shared preferences
Prefs = getSharedPreferences("SharedPreferences", Context.MODE_PRIVATE);
// Get a SharedPreferences editor
Editor = Prefs.edit();
mLocationClient = new LocationClient(this,this,this);
UpdatesRequested = true; //start loc client without updates
//set loc update parameter
LocRequest = LocationRequest.create();
LocRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
LocRequest.setInterval(UPDATE_INTERVAL);
LocRequest.setFastestInterval(FASTEST_INTERVAL);
}
@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;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
public static class MainFragment extends Fragment {
public MainFragment() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_main, container, false);
//View inits
btn_refresh_loc = (Button) rootView.findViewById(R.id.btn_refresh_loc);
txt_position = (TextView) rootView.findViewById(R.id.txt_location);
//ClickListeners
btn_refresh_loc.setOnClickListener(new OnClickListener()
{
@SuppressLint("SimpleDateFormat")
public void onClick(View v)
{
Log.i("BTN","Get Location");
if(!LocEnabled)
{
// Reconnect the client.
mLocationClient.disconnect();
mLocationClient.connect();
}
if(LocConnected)
{
lastLocation = mLocationClient.getLastLocation();
myPosition.setPos(lastLocation);
String date = new java.text.SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new java.util.Date (lastLocation.getTime()));
// Report to the UI that the location was updated
txt_position.setText("Lat: " + myPosition.getLat() + " Lng: " + myPosition.getLng() + "\n" + date);
Log.i("LOC","Lat: " + myPosition.getLat() + " Lng: " + myPosition.getLng() + "\n" + date);
}
}
});
return rootView;
}
}
@Override
protected void onStart() {
super.onStart();
// Connect the client.
mLocationClient.connect();
}
@Override
protected void onPause() {
// Save the current setting for updates
Editor.putBoolean("KEY_UPDATES_ON", UpdatesRequested);
Editor.commit();
super.onPause();
}
@Override
protected void onResume() {
/*
* Get any previous setting for location updates
* Gets "false" if an error occurs
*/
if (Prefs.contains("KEY_UPDATES_ON")) {
UpdatesRequested =
Prefs.getBoolean("KEY_UPDATES_ON", false);
// Otherwise, turn off location updates
} else {
Editor.putBoolean("KEY_UPDATES_ON", false);
Editor.commit();
}
super.onResume();
}
@Override
protected void onStop() {
/*if (mLocationClient.isConnected()) {
removeLocationUpdates(this);
}*/
// Disconnecting the client invalidates it.
mLocationClient.disconnect();
LocConnected = false;
super.onStop();
}
///////////////////////////////////////////////////////////////////
/*
* Location Services
*/
/*
* Called by Location Services when the request to connect the
* client finishes successfully. At this point, you can
* request the current location or start periodic updates
*/
@Override
public void onConnected(Bundle dataBundle) {
// Display the connection status
Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
LocConnected = true;
if (UpdatesRequested) {
mLocationClient.requestLocationUpdates(LocRequest, this);
}
}
/*
* Called by Location Services if the connection to the
* location client drops because of an error.
*/
@Override
public void onDisconnected() {
// Display the connection status
Toast.makeText(this, "Disconnected. Please re-connect.",
Toast.LENGTH_SHORT).show();
LocConnected = false;
}
/*
* Called by Location Services if the attempt to
* Location Services fails.
*/
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
/*
* Google Play services can resolve some errors it detects.
* If the error has a resolution, try sending an Intent to
* start a Google Play services activity that can resolve
* error.
*/
if (connectionResult.hasResolution()) {
try {
// Start an Activity that tries to resolve the error
connectionResult.startResolutionForResult(
this,
CONNECTION_FAILURE_RESOLUTION_REQUEST);
/*
* Thrown if Google Play services canceled the original
* PendingIntent
*/
} catch (IntentSender.SendIntentException e) {
// Log the error
e.printStackTrace();
}
} else {
/*
* If no resolution is available, display a dialog to the
* user with the error.
*/
Toast.makeText(getApplicationContext(), "ERROR: Location Connection failed", Toast.LENGTH_SHORT).show();
Log.e("Location", "Connection failed - " + connectionResult.getErrorCode());
}
LocConnected = false;
}
/*
* Define the callback method that receives location updates(non-Javadoc)
* @see com.google.android.gms.location.LocationListener#onLocationChanged(android.location.Location)
*/
@SuppressLint("SimpleDateFormat")
@Override
public void onLocationChanged(Location location) {
String date = new java.text.SimpleDateFormat("dd.MM.yyyy HH:mm:ss").format(new java.util.Date (location.getTime()));
// Report to the UI that the location was updated
txt_position.setText("# Lat: " + location.getLatitude() + " Lng: " + location.getLongitude() + "\n" + date);
Log.i("LOC","# Lat: " + location.getLatitude() + " Lng: " + location.getLongitude() + "\n" + date);
}
}
的代码部分来自于谷歌开发者复制的培训地点
按照这个http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/ – Rohit
我不知道错误是什么,但现在它工作。谢谢! –
welcum .......... – Rohit