zoukankan      html  css  js  c++  java
  • 【安卓笔记】通过发送特定的短信远程控制手机

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

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







  • 相关阅读:
    XML to Excel
    C# 位域[flags]
    使用windows7的System帐户
    VS.NET 控件命名规范
    Microsoft Robotics Studio到底能做什么?
    SQLServer系统表及其应用(转)
    利用xslt、xml,ajax实现了一个无限级树型导航
    利用xslt实现一个树形导航
    网页信息抓取如何获取延迟加载的网页数据
    站长盈利盈利方式面面观
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/4246346.html
Copyright © 2011-2022 走看看