android刷新当前位置

时间:2012-02-15 19:33:06

标签: android sms position refresh

在我的应用程序中,我希望收到短信和afert,我想获取手机的位置,当我有位置时,我想通过短信发送...

到现在为止,我有了:

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”时,我想刷新我的位置。

谢谢你的帮助

1 个答案:

答案 0 :(得分:0)

我认为您在收到短信时询问如何获取当前位置,以便您可以在另一条短信中发回当前位置。我认为您假设您可以打电话让您当前的位置报告回来。

GPS无法正常工作。它需要运行一段时间才能从足够的卫星获得足够的信息,以便能够确定该位置的位置和精度。因此,没有单一的函数调用可以立即获取设备位置。

相反,有必要运行后台任务(我使用异步任务)来监听位置更新和迭代到当前位置。当它具有足够好的修复功能以节省电池寿命时,我的任务将关闭聆听(和GPS硬件)。

有关详细信息,请参阅a previous related answer

可以向位置管理器询问当前位置。然而,这是它记录的最后一个位置。如果没有应用程序使用GPS硬件一段时间,那么该位置修复可能非常陈旧,因此根本不准确。在工作中,我的建筑物屏蔽了GPS信号(金属覆层),因此我的手机目前认为它位于我家的许多英里之外,这是我上次使用支持GPS的应用程序。

由于SMS需要一个可变的时间来传递,我认为在响应之前花几秒钟来关闭GPS收集并等待足够好的修复可能是正确的。短信不是即时发送的车辆,因此获得良好修复的额外几秒延迟不会增加短信的往返时间。