Android Обновить текущее местоположение - PullRequest
1 голос
/ 15 февраля 2012

В моем приложении я хочу получать 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);  
                }  
            }  
        }  
    }  

}  

и: package 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".

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

1 Ответ

0 голосов
/ 15 февраля 2012

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

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

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

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

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

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

...