我写了这段代码,但是MyLocationListener该类不起作用。当我像“查找我”这样的短信时,代码必须给我大概的位置,但它什么也没做。这是怎么了?
public class SMSReceiver extends BroadcastReceiver {
private LocationManager lm;
private LocationListener locationlistener;
private String senderTel;
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
// get the sms
Bundle bundle = intent.getExtras();
SmsMessage[] msgs = null;
String str = "";
if (bundle != null) {
senderTel = "";
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
if (i == 0) {
senderTel = msgs[i].getOriginatingAddress();
}
str += msgs[i].getMessageBody().toString();
}
if (str.startsWith("Find me")) {
// ---use the LocationManager class to obtain locations data---
lm = (LocationManager) context
.getSystemService(Context.LOCATION_SERVICE);
// ---request location updates---
locationlistener = new MyLocationListener();
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
60000, 1000, locationlistener);
// ---abort the broadcast; SMS messages won’t be broadcasted---
this.abortBroadcast();
}
}
}
private class MyLocationListener implements LocationListener {
@Override
public void onLocationChanged(Location loc) {
// TODO Auto-generated method stub
if (loc != null) {
// ---send a SMS containing the current location---
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(senderTel, null,
"http://maps.google.com/maps?q=" + loc.getLatitude()
+ "," + loc.getLongitude(), null, null);
// ---stop listening for location changes---
lm.removeUpdates(locationlistener);
}
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
}
Run Code Online (Sandbox Code Playgroud)
它很可能无法按预期方式运行,因为您没有以正确的方式进行测试。据我了解,您希望立即从LocationProvider获得位置,但是这不是它的工作原理。
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
60000, 1000, locationlistener);
Run Code Online (Sandbox Code Playgroud)
在上面,您要让LocationProvider更新监听器是否同时满足两个条件:当前更新与上一次更新之间的时间> = 1分钟,并且行进距离> = 1 km。因此LocationProvider将根据这些条件更新侦听器,但是如文档所述:
The location update interval can be controlled using the minTime parameter.
The elapsed time between location updates will never be less than minTime,
although it can be more depending on the Location Provider implementation
and the update interval requested by other applications.
Run Code Online (Sandbox Code Playgroud)
和:
The minDistance parameter can also be used to control the frequency of location
updates. If it is greater than 0 then the location provider will only send your
application an update when the location has changed by at least minDistance meters
Run Code Online (Sandbox Code Playgroud)
此外,您不会立即收到您期望的第一个更新。再次从文档中:
It may take a while to receive the first location update.
Run Code Online (Sandbox Code Playgroud)
Application类中有一个方法,getLastKnownLocation()它提供了可用工具(GPS / Wifi / GSM)提供的最后位置。我相信这就是您想要的。
| 归档时间: |
|
| 查看次数: |
4654 次 |
| 最近记录: |