【安卓笔记】通过发送特定的短信远程控制手机
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) { } } }
<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(); } }
注:假设你是小米手机,可能无法拦截到特定短信。这时你须要去短信界面->设置->高级设置->系统短信优先,取消选择,同意第三方应用先截获短信通知。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。