2012-09-27 168 views
1

我正在构建一个简单的android应用程序,它要求我自动更新位置。自动更新位置不仅会在恢复应用程序时更新,而且在应用程序开启时必须自动更新。这个应用程序看起来就像是放在车内的GPS系统一样。它会得到确切的位置并始终更新当前位置。我想在这里同样的事情。我在android 2.2上构建这个应用程序。自动更新位置而不重新启动应用程序

这里是我的代码:

package com.example.map; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.content.Context; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MapActivity extends Activity implements LocationListener{ 
    private TextView latituteField, longitudeField, accuracyField, altitudeField, bearingField; 
    private LocationManager locationManager; 
    private String provider; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_map); 

    latituteField = (TextView) findViewById(R.id.TextView02); 
    longitudeField = (TextView) findViewById(R.id.TextView04); 
    accuracyField = (TextView) findViewById(R.id.textView1); 
    altitudeField = (TextView) findViewById(R.id.textView2); 
    bearingField = (TextView) findViewById(R.id.textView4); 

    // 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) { 
     System.out.println("Provider " + provider + " has been selected."); 
     onLocationChanged(location); 
    } else { 
     latituteField.setText("Location not available"); 
     longitudeField.setText("Location not available"); 
    } 
    } 

    /* Request updates at startup */ 
    @Override 
    protected void onResume() { 
    super.onResume(); 
    locationManager.requestLocationUpdates(provider, 400, 1, this); 
    } 

    /* Remove the locationlistener updates when Activity is paused */ 
    @Override 
    protected void onPause() { 
    super.onPause(); 
    locationManager.removeUpdates(this); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
    int lat = (int) (location.getLatitude()); 
    int lng = (int) (location.getLongitude()); 
    int acc = (int) (location.getAccuracy()); 
    int alt = (int) (location.getAltitude()); 
    int bearing = (int) (location.getBearing()); 
    latituteField.setText(String.valueOf(lat)); 
    longitudeField.setText(String.valueOf(lng)); 
    accuracyField.setText(String.valueOf(acc)); 
    altitudeField.setText(String.valueOf(alt)); 
    bearingField.setText(String.valueOf(bearing)); 

    } 

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

    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    Toast.makeText(this, "Enabled new provider " + provider, 
     Toast.LENGTH_SHORT).show(); 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    Toast.makeText(this, "Disabled provider " + provider, 
     Toast.LENGTH_SHORT).show(); 
    } 

这个代码仅当IM恢复应用程序(我退出,那么应用程序返回到应用程序)更新位置值。该位置将在视图上更新。

我也试着去做。喜欢这个。

if(location != null){ 
    do{ 
     System.out.println("Provider " + provider + " has been selected."); 
     onLocationChanged(location); 
     locationManager.requestLocationUpdates(provider, 0, 0, this); 
    }while(location != null); 
    } 
    else{ 
     latituteField.setText("Location not available"); 
     longitudeField.setText("Location not available"); 
    } 

即时将这添加到清单。

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

但是,此代码会使应用程序在真实手机中崩溃。无论如何要完成这件事?

*注意:我测试了我的真实手机中的所有应用程序并尝试实现当前位置。 textview会在不暂停或退出应用程序的情况下获取位置的新值时进行更改。

+0

你在清单中拥有什么权限? –

+0

@tedHopp看看我的帖子。我已经编辑了我使用的权限的帖子 –

+0

logcat在真实手机上崩溃时说什么? –

回答

1

你必须把你的位置代码ScheduledExecutor服务里面:

http://developer.android.com/reference/java/util/concurrent/ScheduledExecutorService.html

那一个重复现实化功能在后台例如每30秒或任何时候,你指定。

例子:

scheduleTaskExecutor= Executors.newScheduledThreadPool(5); 

    // This schedule a task to run every 10 seconds: 

    scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() { 
     public void run() { 


      try {     


       //add your code you would like to be executed every 10 seconds. 



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


     } 
    }, 0, 10, TimeUnit.SECONDS); 

,你可能还需要添加一个权限的粗略位置。

+0

谢谢!有用。现在我需要调整时间来更新每1秒。这不可能吗?我必须尝试。希望它有效。再次感谢。 –

+0

不知道是否每秒都会有意义,因为运行代码需要一定的时间,并且执行代码的频率越高,需要更多的电池。根据你想要对你的应用做什么,你应该指定最长的时间。 – SunnySonic

相关问题