在广播接收者中,检测接受到的信息,然后添加相应的逻辑,跳转到服务,在服务中启动定位服务,定位服务的过程中获取到经纬度,同时把数据保存,再关闭服务以节约手机电量。然后在广播接收者中获取到保存的数据就是上一次发送的位置信息。
权限添加
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/>
注册服务
<service android:name="com.ldw.safe.service.LocationService"></service>
SmsReceiver.java
package com.ldw.safe.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.media.MediaPlayer;
import android.telephony.SmsMessage;
import com.ldw.safe.R;
import com.ldw.safe.service.LocationService;
/*
* 拦截短信
*/
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Object[] objects = (Object[]) intent.getExtras().get("pdus");
for(Object object : objects){
SmsMessage message = SmsMessage.createFromPdu((byte[])object);
//获取到短信的来源号码
String originalAddress = message.getOriginatingAddress();
//获取到短信的内容
String messageBody = message.getMessageBody();
System.out.println(originalAddress + ":" + messageBody);
//如果收到的信息是#*alarm*#,就让系统短信app接受不到内容
if ("#*alarm*#".equals(messageBody)) {
// 播放报警音乐, 即使手机调为静音,也能播放音乐, 因为使用的是媒体声音的通道,和铃声无关
MediaPlayer player = MediaPlayer.create(context, R.raw.ylzs);
//音量调到最大值
player.setVolume(1f, 1f);
//单曲循环、
player.setLooping(true);
//播放报警音乐
player.start();
//中断短信
abortBroadcast();
}else if("#*location*#".equals(messageBody)){
//获取经纬度坐标
//开启定位服务
context.startService(new Intent(context, LocationService.class));
//获取到位置信息
SharedPreferences mPref = context.getSharedPreferences("config", Context.MODE_PRIVATE);
String location = mPref.getString("location", "waiting...");
System.out.println("location:" + location);
//中断短信
abortBroadcast();
}else if("#*wipedata*#".equals(messageBody)){
}else if("#*lockscreen*#".equals(messageBody)){
}
}
}
}
提供位置服务
LocationService.java
package com.ldw.safe.service;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.widget.TextView;
/*
* 获取经纬度坐标
*/
public class LocationService extends Service {
private TextView tvLocation;
private LocationManager lm;
private MyLocationListener listener;
public SharedPreferences mPref;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate(){
super.onCreate();
mPref = getSharedPreferences("config", MODE_PRIVATE);
lm = (LocationManager) getSystemService(LOCATION_SERVICE);
//获取所有的位置提供者(定位方法)
//List<String> allProviders = lm.getAllProviders();
//System.out.println(allProviders);
//创建Criteria
Criteria criteria = new Criteria();
//是否允许付费
criteria.setCostAllowed(true);
criteria.setAccuracy(criteria.ACCURACY_FINE);
//获取最佳的定位方法
String bestProvider = lm.getBestProvider(criteria, true);
listener = new MyLocationListener();
//第一个参数是提供位置的方式,第二个参数是最短的更新位置的时间,第三个参数是最短的更新位置的距离
//0表示随时更新
lm.requestLocationUpdates(bestProvider, 0, 0, listener);
}
class MyLocationListener implements LocationListener{
//位置发生回掉的函数
@Override
public void onLocationChanged(Location location) {
String latitude = "经度" + location.getLatitude();
String longitude = "维度" + location.getLongitude();
//保存获取的经纬度
mPref.edit().putString("location", "latitude:" + latitude + "longitude:" +longitude).commit();
//获取到经纬度就关闭掉服务,节约用电
stopSelf();
}
//位置提供者状态发生变化的回掉
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
//用户把位置提供者打开的时候的回掉
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
}
@Override
public void onDestroy(){
super.onDestroy();
//activity销毁时,关闭定位
lm.removeUpdates(listener);
}
}