【安卓笔记】通过发送特定的短信远程控制手机

实现效果:
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();
			}
		}

注:假设你是小米手机,可能无法拦截到特定短信。这时你须要去短信界面->设置->高级设置->系统短信优先,取消选择,同意第三方应用先截获短信通知。







郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。