【安卓笔记】通过发送特定的短信远程控制手机
2015-01-24 19:44
459 查看
实现效果:
1.发送指令#*location*#,能够远程获取到手机的地理位置(经纬度),并以短信的形式返回。
2.发送指令#*locknow*#,能够远程锁屏并设置锁屏password。
实现原理:
1.注冊广播接受者,监听手机收到的短信,并对符合要求的特定短信进行拦截和处理。
2.通过LocationManager获取地理位置。
3.使用DevicePolicyManager实现锁屏、设置锁屏password等操作。
步骤:
1.创建一个能够获取地理位置的工具类:
当地理位置发生改变时,将通过监听器把最新的地理位置信息存到SharedPreferences中,getLocation方法从SharedPreferences中获取位置信息,并返回。
2.写好工具类后,配置权限:
3.创建一个设备管理接受者(继承DeviceAdminReceiver):
这事实上是一个广播接受者,所以须要在清单文件里配置:
激活设备管理者:
4.接下来,注冊一个广播接收者,监听系统收到的短信。
5.在清单文件里注冊,并配置权限:
6.处理onReceive方法的逻辑:
注:假设你是小米手机,可能无法拦截到特定短信。这时你须要去短信界面->设置->高级设置->系统短信优先,取消选择,同意第三方应用先截获短信通知。
1.发送指令#*location*#,能够远程获取到手机的地理位置(经纬度),并以短信的形式返回。
2.发送指令#*locknow*#,能够远程锁屏并设置锁屏password。
实现原理:
1.注冊广播接受者,监听手机收到的短信,并对符合要求的特定短信进行拦截和处理。
2.通过LocationManager获取地理位置。
3.使用DevicePolicyManager实现锁屏、设置锁屏password等操作。
步骤:
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); //设置锁屏password 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发送和接收短信