2012-09-27 5 views
1

위치를 자동으로 업데이트해야하는 간단한 Android 응용 프로그램을 작성 중입니다. 자동 업데이트 위치는 응용 프로그램을 다시 시작할 때 업데이트 될뿐만 아니라 응용 프로그램이 켜져있을 때마다 자동 업데이트해야합니다. 이 응용 프로그램은 자동차 안에 넣어 GPS 시스템과 동일하게 보입니다. 정확한 위치를 얻고 항상 현재 위치를 업데이트합니다. 나는 여기서 똑같은 것을 원한다. 나는이 응용 프로그램을 안드로이드 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(); 
    } 

응용 프로그램을 다시 시작 메신저 (내가 응용 프로그램이 다음 응용 프로그램으로 돌아가 종료) 때 그것은 단지 위치 값을 업데이트 코드. 위치가 뷰 텍스트에서 업데이트됩니다.

나는 또한 노력하고 있습니다. 이렇게.

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

관련 문제