Android Обновить текущее местоположение

В моем приложении я хочу получать SMS и после этого я хочу получить местоположение телефона, и когда у меня есть местоположение, я хочу отправить его по SMS...

на данный момент есть то, что у меня есть:

package com.receiver;  
import android.content.BroadcastReceiver;  
import android.content.ComponentName;  
import android.content.Context;  
import android.content.Intent;  
import android.os.Bundle;  
import android.telephony.SmsMessage;  
import android.util.Log;  
import android.widget.Toast;

public class SMSReceiver extends BroadcastReceiver{  

   private final String ACTION_RECEIVE_SMS  = "android.provider.Telephony.SMS_RECEIVED";  
   private String numero;  
   private String msg;  

   @Override  
    public void onReceive(Context context, Intent intent){  
    Log.i("ReceiveBootCompleted","****** Boot terminer ********************");  
    Log.i("ReceiveBootCompleted"," ***** lancement du service Test **************");  
    context.startService(new Intent().setComponent(new ComponentName(context.getPackageName(), SMSReceiver.class.getName())));  

   if (intent.getAction().equals(ACTION_RECEIVE_SMS)){  
        Bundle bundle = intent.getExtras();  
        if (bundle != null){  
            Object[] pdus = (Object[]) bundle.get("pdus");  
            final SmsMessage[] messages = new SmsMessage[pdus.length];  
            for (int i = 0; i < pdus.length; i++){  
            messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);  
            }  
            if (messages.length > -1){  
                final String messageBody = messages[0].getMessageBody();  
                final String phoneNumber = >messages[0].getDisplayOriginatingAddress();  
                if(messageBody.equals("mollo")){  
                    app.smartfinder.SmartFinderActivity.send_message(phoneNumber);  
                }  
            }  
        }  
    }  

}  

и: пакет app.smartfinder;

import java.io.IOException;  
import java.util.List;  
import android.app.Activity;  
import android.content.Intent;  
import android.location.Address;  
import android.location.Geocoder;  
import android.location.Location;  
import android.location.LocationListener;  
import android.location.LocationManager;  
import android.os.Bundle;  
import android.text.Html;  
import android.text.method.LinkMovementMethod;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.Window;  
import android.widget.TextView;  
import android.widget.Toast;  
public class SmartFinderActivity extends Activity implements LocationListener {  
    LocationManager lm;  
    private Location location;  
    private double lat = 0;  
    private double lng = 0;  
    TextView position;  
    /** Called when the activity is first created. */  
    @Override  
    public void onCreate(Bundle savedInstanceState){  

   requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.main);  

   lm = (LocationManager) this.getSystemService(LOCATION_SERVICE);  
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, this);  
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 0, this);  
        position = (TextView)findViewById(R.id.var_current_pos);  
    }  

   public void onClick_conf(View view){  
        Toast.makeText(SmartFinderActivity.this, "config", Toast.LENGTH_LONG).show();  
        Intent settingsActivity = new Intent(getBaseContext(),               Preferences.class);  
        startActivity(settingsActivity);  
    }  
   public void onClick_hist (View view){  
        Toast.makeText(SmartFinderActivity.this, "history", Toast.LENGTH_LONG).show();  
    }  

   public void onLocationChanged(Location location) {  

    lat = location.getLatitude();  
       lng = location.getLongitude();  
        afficherAdresse();  

   position.setOnClickListener(new OnClickListener() { public void onClick(View v) {  
                Intent intent_map = new Intent(getBaseContext(), Map.class);  
                intent_map.putExtra("lat", lat);  
                intent_map.putExtra("lng", lng);  
                startActivity(intent_map);  
            }  
        });  
    lm.removeUpdates(this);  
    }  
   public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub  
    }  
   public void onProviderEnabled(String provider) {  
        // TODO Auto-generated method stub  
    }  
   public void onStatusChanged(String provider, int status, Bundle extras) {  
         // TODO Auto-generated method stub  
    }  

   public void afficherAdresse() {  
        Geocoder geo = new Geocoder(SmartFinderActivity.this);  
        try {  
            List<Address> adresses = geo.getFromLocation(lat,lng,1);  

   if(adresses != null && adresses.size() == 1){  
                Address adresse = adresses.get(0);  
                //if geocoder find a adresse, we can use it  
                position.setText( adresse.getAddressLine(0) + " " + adresse.getPostalCode() + " " + adresse.getLocality());  
            }  
            else {  
                //else: no adress  
                position.setText("L'adresse n'a pu être déterminée");  
            }  
        } catch (IOException e) {  
            e.printStackTrace();  
            position.setText("L'adresse n'a pu être déterminée");  
        }  
    }  

   public static void send_message(String phoneNumber) {  

   // `refresh Location : that's the problem ! ` 

   // send method : not difficult  

 }  
 }  

Моя проблема в том, что я хочу обновить свою позицию, когда вызывается метод «send_message».

спасибо за помощь


person pierro    schedule 15.02.2012    source источник


Ответы (1)


Я думаю, что вы спрашиваете, как получить ваше текущее местоположение, когда вы получаете SMS-сообщение, чтобы вы могли отправить обратно текущее местоположение в другом SMS-сообщении. Я думаю, что вы предполагаете, что можете просто позвонить, чтобы получить отчет о своем текущем местоположении.

GPS так не работает. Он должен работать некоторое время, чтобы получить достаточно сообщений от достаточного количества спутников, чтобы иметь возможность определить положение и точность для этого положения. Таким образом, нет единого вызова функции, чтобы просто мгновенно получить местоположение устройства.

Вместо этого необходимо запустить фоновую задачу (я использую асинхронную задачу) для прослушивания обновлений позиции и перехода к текущему местоположению. Моя задача отключает прослушивание (и оборудование GPS), когда оно имеет достаточно хорошее решение для экономии заряда батареи.

См. предыдущий связанный ответ для получения дополнительной информации.

Текущую позицию можно запросить у диспетчера местоположения. Однако это последняя позиция, которую он зафиксировал. Если какое-то время ни одно приложение не использовало аппаратное обеспечение GPS, то эта фиксация положения может быть очень старой и, следовательно, совсем неточной. На работе мое здание экранирует сигналы GPS (металлическая оболочка), поэтому мой телефон в настоящее время считает, что он находится в моем доме за много миль, где я в последний раз использовал приложение с поддержкой GPS.

Поскольку для доставки SMS требуется переменное время, я думаю, что, вероятно, будет правильным потратить несколько дополнительных секунд, чтобы запустить сбор данных GPS, и дождаться достаточно хорошего исправления, прежде чем отвечать. SMS не является средством мгновенной доставки, поэтому дополнительные несколько секунд задержки при получении хорошего исправления не сильно увеличат время доставки ваших SMS-сообщений туда и обратно.

person Colin    schedule 15.02.2012