应用程序隐蔽入口-使用电话拨打*#7017#开启手机防盗模块
使用这种拨号指令指定具有很强的隐蔽性,通常可用于隐蔽应用的进入。 |
步骤:1、写一个类继承
BroadcastReceiver public class OutCallReceiver extends BroadcastReceiver {} 2、清单文件中配置,配置intent-filter,加上权限1000,比默认的还高,配置action <receiver android:name="cn.zengfansheng.mobilesafe.receiver.OutCallReceiver" >
<intent-filter android:priority="1000" >
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver> 3、增加权限 <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 处理外拨电话权限 4、增加处理代码,使用指令*#7017#可以激活LostFindActivity,而不是拨打电话 /**
* 1、外接电话广播接受者-
* @author hacket
*/
public class OutCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String outNumber = this.getResultData();
Intent intent2 = new Intent(context, LostFindActivity.class); // 注意: 在activity上下文的外部 开启activity 一定要指定activity的任务栈.
// 下面这句:重要,如果该Activity栈存在,那么用这个,如果不存在,那么重新创建一个。
// 广播接受者的context 服务里面的上下文 ,都是外部开启Activity
intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); if ("*#7017#".equals(outNumber)) {
// abortBroadcast();//拦截掉当前的广播.不能用,无效.因为外拨电话是一个特殊的广播 直接指定了广播事件的最终接受者
setResultData(null);
context.startActivity(intent2);
}
}
} |
核心代码: package cn.zengfansheng.mobilesafe.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import cn.zengfansheng.mobilesafe.LostFindActivity;
/**
* 1、外接电话广播接受者-
* @author hacket
*/
public class OutCallReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String outNumber = this.getResultData();
Intent intent2 = new Intent(context, LostFindActivity.class);
// 注意: 在activity上下文的外部 开启activity 一定要指定activity的任务栈.
// 下面这句:重要,如果该Activity栈存在,那么用这个,如果不存在,那么重新创建一个。
// 广播接受者的context 服务里面的上下文 ,都是外部开启Activity
intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if ("*#7017#".equals(outNumber)) {
// abortBroadcast();////拦截掉当前的广播.不能用,无效.因为外拨电话是一个特殊的广播 直接指定了广播事件的最终接受者
setResultData(null);
context.startActivity(intent2);
}
}
} |
问题1:开启了
LostFindActivity,但电话还在拨打状态 问题2:指定 abortBroadcast(); 还是这样 这是因为 因为外拨电话是一个特殊的广播 直接指定了广播事件的最终接受者。abortBroadcast()无效。 问题3: setResultData(null); 这个可以,将数据设置为null,后面的优先级别低的广播接收者,接收到的是一个null,如电话拨号器接到,看到是null,就不会拨打电话。 问题4:对于外部的上下文开启 LostFindActivity, 必须指定下面这句: 如果该LostFindActivity栈存在,那么用这个,如果不存在,那么重新创建一个。 如: 广播接受者的context 服务里面的上下文 ,都是属于外部开启Activity intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); |