【安卓笔记】通过发送特定的短信远程控制手机
2014-07-20 19:55
435 查看
实现效果:
1.发送指令#*location*#,可以远程获取到手机的地理位置(经纬度),并以短信的形式返回。
2.发送指令#*locknow*#,可以远程锁屏并设置锁屏密码。
实现原理:
1.注册广播接受者,监听手机收到的短信,并对符合要求的特定短信进行拦截和处理。
2.通过LocationManager获取地理位置。
3.使用DevicePolicyManager实现锁屏、设置锁屏密码等操作。
步骤:
1.创建一个可以获取地理位置的工具类:
package cn.edu.chd.mobilesafe.engine;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
/**
* @author Rowandjj
*
*获取位置服务
*/
public class GPSInfoProvider
{
private static GPSInfoProvider instance = new GPSInfoProvider();
private static Context context;
private static InnerLocationListener mListener = null;
private LocationManager manager = null;
public static GPSInfoProvider getInstance(Context context)
{
GPSInfoProvider.context = context;
return instance;
}
public String getLocation()
{
//构建位置管理对象
manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
manager.requestLocationUpdates(getProvider(manager), 60*1000, 50, getListener());
SharedPreferences sp = context.getSharedPreferences("config",Context.MODE_PRIVATE);
return sp.getString("location","");
}
public void removeListener()
{
if(manager != null)
{
manager.removeUpdates(getListener());
}
}
/**
* 获取位置信息源
*/
private String getProvider(LocationManager manager)
{
Criteria c = new Criteria();
c.setAccuracy(Criteria.ACCURACY_FINE);
c.setAltitudeRequired(false);
c.setCostAllowed(true);
c.setPowerRequirement(Criteria.POWER_MEDIUM);
c.setSpeedRequired(true);
return manager.getBestProvider(c,true);
}
private InnerLocationListener getListener()
{
if(mListener == null)
{
mListener = new InnerLocationListener();
}
return mListener;
}
private class InnerLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location location)
{
//位置发生变化时,记录位置到SharedPreferences中
String lat = ""+location.getLatitude();
String lon = ""+location.getLongitude();
SharedPreferences sp = context.getSharedPreferences("config",Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString("location",lat+"##"+lon);
editor.commit();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
@Override
public void onProviderEnabled(String provider)
{
}
@Override
public void onProviderDisabled(String provider)
{
}
}
}
当地理位置发生改变时,将通过监听器把最新的地理位置信息存到SharedPreferences中,getLocation方法从SharedPreferences中获取位置信息,并返回。
2.写好工具类后,配置权限:
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
3.创建一个设备管理接受者(继承DeviceAdminReceiver):
package cn.edu.chd.mobilesafe.receiver;
import android.app.admin.DeviceAdminReceiver;
public class MyAdmin extends DeviceAdminReceiver
{
}
这其实是一个广播接受者,所以需要在清单文件中配置:
<receiver
android:name="cn.edu.chd.mobilesafe.receiver.MyAdmin"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
激活设备管理者:
/**
*注册设备管理者
*/
private void registerDeviceAdmin()
{
DevicePolicyManager manager = (DevicePolicyManager) this.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName mAdminName = new ComponentName(this,MyAdmin.class);
if(!manager.isAdminActive(mAdminName))//如果未激活,激活之
{
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName);
startActivity(intent);
}
}
4.接下来,注册一个广播接收者,监听系统收到的短信。
package cn.edu.chd.mobilesafe.receiver;
import cn.edu.chd.mobilesafe.engine.GPSInfoProvider;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
/**
* @author Rowandjj
*
*/
public class SmsReceiver extends BroadcastReceiver
{
private static final String TAG = "SmsReceiver";
@Override
public void onReceive(Context context, Intent intent)
{
}
}
5.在清单文件中注册,并配置权限:
<receiver android:name="cn.edu.chd.mobilesafe.receiver.SmsReceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>权限:
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
6.处理onReceive方法的逻辑:
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for(Object pdu : pdus)
{
//从pdu数据中构造短信信息
SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);
String content = sms.getMessageBody();
Log.i(TAG,"短信内容:"+content);
String sender = sms.getOriginatingAddress();
if("#*location*#".equals(content))
{
//终止广播
abortBroadcast();
//获取位置信息
String text = GPSInfoProvider.getInstance(context).getLocation();
GPSInfoProvider.getInstance(context).removeListener();
Log.i(TAG,"LOCATION:"+text);
SmsManager smsmanager = SmsManager.getDefault();
//发送短信
if(!text.equals(""))
{
smsmanager.sendTextMessage(sender, null, text, null, null);
}else
{
smsmanager.sendTextMessage(sender, null,"抱歉,没有收到位置信息.", null, null);
}
}else if("#*locknow*#".equals(content))
{
DevicePolicyManager manager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
//设置锁屏密码
manager.resetPassword("123",0);
//锁屏
manager.lockNow();
//终止广播
abortBroadcast();
}
}
注:如果你是小米手机,可能无法拦截到特定短信。这时你需要去短信界面->设置->高级设置->系统短信优先,取消选择,允许第三方应用先截获短信通知。
1.发送指令#*location*#,可以远程获取到手机的地理位置(经纬度),并以短信的形式返回。
2.发送指令#*locknow*#,可以远程锁屏并设置锁屏密码。
实现原理:
1.注册广播接受者,监听手机收到的短信,并对符合要求的特定短信进行拦截和处理。
2.通过LocationManager获取地理位置。
3.使用DevicePolicyManager实现锁屏、设置锁屏密码等操作。
步骤:
1.创建一个可以获取地理位置的工具类:
package cn.edu.chd.mobilesafe.engine;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
/**
* @author Rowandjj
*
*获取位置服务
*/
public class GPSInfoProvider
{
private static GPSInfoProvider instance = new GPSInfoProvider();
private static Context context;
private static InnerLocationListener mListener = null;
private LocationManager manager = null;
public static GPSInfoProvider getInstance(Context context)
{
GPSInfoProvider.context = context;
return instance;
}
public String getLocation()
{
//构建位置管理对象
manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
manager.requestLocationUpdates(getProvider(manager), 60*1000, 50, getListener());
SharedPreferences sp = context.getSharedPreferences("config",Context.MODE_PRIVATE);
return sp.getString("location","");
}
public void removeListener()
{
if(manager != null)
{
manager.removeUpdates(getListener());
}
}
/**
* 获取位置信息源
*/
private String getProvider(LocationManager manager)
{
Criteria c = new Criteria();
c.setAccuracy(Criteria.ACCURACY_FINE);
c.setAltitudeRequired(false);
c.setCostAllowed(true);
c.setPowerRequirement(Criteria.POWER_MEDIUM);
c.setSpeedRequired(true);
return manager.getBestProvider(c,true);
}
private InnerLocationListener getListener()
{
if(mListener == null)
{
mListener = new InnerLocationListener();
}
return mListener;
}
private class InnerLocationListener implements LocationListener
{
@Override
public void onLocationChanged(Location location)
{
//位置发生变化时,记录位置到SharedPreferences中
String lat = ""+location.getLatitude();
String lon = ""+location.getLongitude();
SharedPreferences sp = context.getSharedPreferences("config",Context.MODE_PRIVATE);
Editor editor = sp.edit();
editor.putString("location",lat+"##"+lon);
editor.commit();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras)
{
}
@Override
public void onProviderEnabled(String provider)
{
}
@Override
public void onProviderDisabled(String provider)
{
}
}
}
当地理位置发生改变时,将通过监听器把最新的地理位置信息存到SharedPreferences中,getLocation方法从SharedPreferences中获取位置信息,并返回。
2.写好工具类后,配置权限:
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
3.创建一个设备管理接受者(继承DeviceAdminReceiver):
package cn.edu.chd.mobilesafe.receiver;
import android.app.admin.DeviceAdminReceiver;
public class MyAdmin extends DeviceAdminReceiver
{
}
这其实是一个广播接受者,所以需要在清单文件中配置:
<receiver
android:name="cn.edu.chd.mobilesafe.receiver.MyAdmin"
android:permission="android.permission.BIND_DEVICE_ADMIN" >
<meta-data
android:name="android.app.device_admin"
android:resource="@xml/device_admin" />
<intent-filter>
<action android:name="android.app.action.DEVICE_ADMIN_ENABLED" />
</intent-filter>
</receiver>
激活设备管理者:
/**
*注册设备管理者
*/
private void registerDeviceAdmin()
{
DevicePolicyManager manager = (DevicePolicyManager) this.getSystemService(Context.DEVICE_POLICY_SERVICE);
ComponentName mAdminName = new ComponentName(this,MyAdmin.class);
if(!manager.isAdminActive(mAdminName))//如果未激活,激活之
{
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName);
startActivity(intent);
}
}
4.接下来,注册一个广播接收者,监听系统收到的短信。
package cn.edu.chd.mobilesafe.receiver;
import cn.edu.chd.mobilesafe.engine.GPSInfoProvider;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsManager;
import android.telephony.SmsMessage;
import android.util.Log;
/**
* @author Rowandjj
*
*/
public class SmsReceiver extends BroadcastReceiver
{
private static final String TAG = "SmsReceiver";
@Override
public void onReceive(Context context, Intent intent)
{
}
}
5.在清单文件中注册,并配置权限:
<receiver android:name="cn.edu.chd.mobilesafe.receiver.SmsReceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>权限:
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
6.处理onReceive方法的逻辑:
Object[] pdus = (Object[]) intent.getExtras().get("pdus");
for(Object pdu : pdus)
{
//从pdu数据中构造短信信息
SmsMessage sms = SmsMessage.createFromPdu((byte[]) pdu);
String content = sms.getMessageBody();
Log.i(TAG,"短信内容:"+content);
String sender = sms.getOriginatingAddress();
if("#*location*#".equals(content))
{
//终止广播
abortBroadcast();
//获取位置信息
String text = GPSInfoProvider.getInstance(context).getLocation();
GPSInfoProvider.getInstance(context).removeListener();
Log.i(TAG,"LOCATION:"+text);
SmsManager smsmanager = SmsManager.getDefault();
//发送短信
if(!text.equals(""))
{
smsmanager.sendTextMessage(sender, null, text, null, null);
}else
{
smsmanager.sendTextMessage(sender, null,"抱歉,没有收到位置信息.", null, null);
}
}else if("#*locknow*#".equals(content))
{
DevicePolicyManager manager = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
//设置锁屏密码
manager.resetPassword("123",0);
//锁屏
manager.lockNow();
//终止广播
abortBroadcast();
}
}
注:如果你是小米手机,可能无法拦截到特定短信。这时你需要去短信界面->设置->高级设置->系统短信优先,取消选择,允许第三方应用先截获短信通知。
相关文章推荐
- 【安卓笔记】通过发送特定的短信远程控制手机
- 安卓手机通过ssh远程登录控制Ubuntu系统
- 利用Android Lost通过互联网或短信远程控制安卓设备
- 利用Android Lost通过互联网或短信远程控制安卓设备
- 用 Java 通过串口发送手机短信(一)环境安装设置
- 用 Java 通过串口发送手机短信(二)简单使用
- 通过SMSLib实现发送手机短信
- 通过Web Service发送手机短信
- 通过ICQ网关发送手机短信的PHP源程序
- 通过Web Service发送手机短信
- 通过串口发送手机短信(C#版)1
- 在电脑上使用AT命令通过手机发送短信
- 通过SMSLib实现发送手机短信
- 通过at发送手机短信
- GPRS 远程控制终端 (通过手机模块远程终端控制)
- 用C#通过Nokia手机发送短信(使用Nokia SDK3.0/原创)
- 通过串口发送手机短信(C#版)
- 通过PC发送手机短信
- 通过免费手机短信来控制电脑---“执行者”介绍
- .net平台手机管理软件开发(12)—— 短信部分 通过RS232发送和接收短信