功能实现
- 开机自检本机的配置信息
- 能保存一个安全号码
- 能保存本机的SIM信息
- 能选择是否开启防盗功能
- 当检测到SIM卡更换时,能将更换后的SIM卡号发送到安全号码上
- 能通过接受安全号码的短信进行锁屏,解锁手机屏幕
- 软件开机自启动
- 软件以后台服务形式运行
代码块
BootBroadcastReceiver
package com.example.anti;
import android.Manifest;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.widget.Toast;
public class BootBroadcastReceiver extends BroadcastReceiver {
public BootBroadcastReceiver(){
}
String ACTION = "android.intent.action.BOOT_COMPLETED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ACTION)){
Intent sayHelloIntent=new Intent(context,MainActivity.class);
sayHelloIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// context.startActivity(sayHelloIntent);
SharedPreferences sp = context.getSharedPreferences("Test", Context.MODE_PRIVATE);
String safenumber = sp.getString("SP_SAFE_KEY", "");
TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
String nowsim = tm.getSimSerialNumber();
String nownum=tm.getLine1Number();
String savedsim = sp.getString("SP_MYNUMBER_KEY", "");
if (nowsim.equals(savedsim)) {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(safenumber, null, nownum, null, null);
}
Toast.makeText(context,"重启成功",Toast.LENGTH_SHORT).show();
}
}
}
MainActivity
package com.example.anti;
import android.Manifest;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.telephony.PhoneStateListener;
import android.telephony.SmsManager;
import android.telephony.TelephonyManager;
import android.view.View;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private Switch switch1;
TelephonyManager tm;
private EditText editText;
private TextView textView;
String model = android.os.Build.MODEL;
String brand = android.os.Build.BRAND;
String device = android.os.Build.DEVICE;
String message;
StringBuffer sb;
StringBuffer sa;
ComponentName mAdminName;
DevicePolicyManager mDPM;
public static final String SP_SAFE_KEY = "SP_SAFE_KEY";
public static final String SP_MYNUMBER_KEY = "SP_MYNUMBER_KEY";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
switch1 = findViewById(R.id.switch1);
editText = findViewById(R.id.editText);
textView = findViewById(R.id.textView);
mAdminName = new ComponentName(this, MyAdmin.class);
mDPM = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
//如果设备管理器尚未激活,这里会启动一个激活设备管理器的Intent,具体的表现就是第一次打开程序时,手机会弹出激活设备管理器的提示,激活即可。
if (!mDPM.isAdminActive(mAdminName)) {
showAdminManagement(mAdminName);
}
readPrivateFileClick();
readSafeClick();
switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked == true) {
Intent intent = new Intent(MainActivity.this, MyService.class);
startService(intent);
testTelephoneManager();
writePrivateFileClick();
Toast.makeText(MainActivity.this, "开启防盗", Toast.LENGTH_SHORT).show();
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
textView.setText("唯一的设备ID=" + tm.getDeviceId() + "\n" +
"手机号=" + tm.getLine1Number() + "\n" +
"获取ISO标准的国家码·即国际长途区号=" + tm.getNetworkCountryIso() + "\n" +
"当前使用的网络类型=" + tm.getNetworkType() + "\n" +
"手机类型=" + tm.getPhoneType() + "\n" +
"SIM的状态信息=" + tm.getSimState() + "\n" +
"SIM卡的序列号=" + tm.getSimSerialNumber() + "\n" +
"服务商名称=" + tm.getSimOperatorName() + "\n" +
"型号=" + model + "\n" +
"品牌=" + brand + "\n" +
"设备名=" + device
);
// message=tm.getLine1Number();
// smsManager();
} else {
Toast.makeText(MainActivity.this, "关闭防盗", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MainActivity.this, MyService.class);
stopService(intent);
textView.setText("");
}
}
});
}
// public void smsManager() {
// //获取短信管理器
// SmsManager smsManager = SmsManager.getDefault();
// if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
// // TODO: Consider calling
// // ActivityCompat#requestPermissions
// // here to request the missing permissions, and then overriding
// // public void onRequestPermissionsResult(int requestCode, String[] permissions,
// // int[] grantResults)
// // to handle the case where the user grants the permission. See the documentation
// // for ActivityCompat#requestPermissions for more details.
// return;
// }
// String oldnumber=sb.toString();
// String newnumber=tm.getSimSerialNumber();
// message = tm.getLine1Number();
// String safe=sa.toString();
// if (!oldnumber.equals(newnumber)){
// //拆分长短信
// ArrayList<String> list = smsManager.divideMessage(message);
//// System.out.println("list size:" + list.size());
// int size = list.size();
// for (int i = 0; i < size; i++) {
// //参数:收件人号码,信息中心,短信内容,信息中心的交互,信息中心的交互
// smsManager.sendTextMessage(safe, null, list.get(i), null, null);
// }
// }
// }
//电话服务管理器的API方法
public void testTelephoneManager() {
tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
System.out.println("电话状态=" + tm.getCallState());
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
//测试来电显示:直接发送一个广播
sendBroadcast(new Intent(this, PhoneListenerReceiver.class));
// tm.listen(new MyPhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE);
}
/**
* 电话服务的监听器
*/
private static class MyPhoneStateListener extends PhoneStateListener {
@Override
public void onCallStateChanged(int state, String phoneNumber) {
super.onCallStateChanged(state, phoneNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
System.out.println("正在响铃");
break;
case TelephonyManager.CALL_STATE_IDLE:
System.out.println("挂机状态");
break;
case TelephonyManager.CALL_STATE_OFFHOOK:
System.out.println("正在接听电话...");
break;
}
}
}
//存入SIM卡序列号
public void writePrivateFileClick() {
try {
OutputStream out = openFileOutput("ska.txt", Context.MODE_PRIVATE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
String info = tm.getSimSerialNumber();
byte[] bytes=info.getBytes();
out.write(bytes,0,bytes.length);//写入
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//读取SIM卡序列号
public void readPrivateFileClick(){
try {
InputStream in=openFileInput("ska.txt");
byte[] bytes=new byte[1024];
sb=new StringBuffer();
int len=-1;
while((len=in.read(bytes))!=-1){
sb.append(new String(bytes,0,len));
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//存入安全号码
public void readClick(View v){
try {
OutputStream out = openFileOutput("safe.txt", Context.MODE_PRIVATE);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_SMS) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_NUMBERS) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
String info =editText.getText().toString();
byte[] bytes=info.getBytes();
out.write(bytes,0,bytes.length);//写入
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
String safe=editText.getText().toString();
SPUtils.putValue(MainActivity.this, SP_SAFE_KEY, safe);//存入安全号码
SPUtils.putValue(MainActivity.this, SP_MYNUMBER_KEY, sb.toString());//存入SIM卡序列号
}
//读取安全号码
public void readSafeClick(){
try {
InputStream in=openFileInput("safe.txt");
byte[] bytes=new byte[1024];
sa=new StringBuffer();
int len=-1;
while((len=in.read(bytes))!=-1){
sa.append(new String(bytes,0,len));
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
//锁屏功能
public void lock(View v){
if (mDPM.isAdminActive(mAdminName)) {
mDPM.lockNow();
}
}
private void showAdminManagement(ComponentName mAdminName) {
Intent intent = new Intent(DevicePolicyManager.ACTION_ADD_DEVICE_ADMIN);
intent.putExtra(DevicePolicyManager.EXTRA_DEVICE_ADMIN, mAdminName);
intent.putExtra(DevicePolicyManager.EXTRA_ADD_EXPLANATION, "activity device");
startActivityForResult(intent,1);
}
}
MyAdmin
package com.example.anti;
import android.app.admin.DeviceAdminReceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MyAdmin extends DeviceAdminReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
throw new UnsupportedOperationException("Not yet implemented");
}
}
MyService
package com.example.anti;
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.util.Log;
/**
* start service
* 1、服务同时只会创建一次,可以通过外部调用stopService或调用stopSelf来终止服务;
* 2、当执行一个已启动的服务,会直接调用onStartCommand方法来执行核心业务
* 3、默认情况下服务与主线程在同一个线程中执行,如果服务执行一个比较耗时的操作,我们必须使用子线程来完成工作
* 避免阻塞主线程
*4、使用started service启动的一个服务,在没有关闭之前会一直在后台运行
*/
public class MyService extends Service {
private static final String TAG = "MessageListenerService";
private SmsMessageReceiver messageReceiver;
public MyService() {
}
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "*********onBind()**********");
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "*********onCreate()**********");
messageReceiver = new SmsMessageReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(messageReceiver, intentFilter);
}
//在该方法中实现服务的核心业务
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//使用线程完成长时间的工作
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("onStartCommand");
}
}).start();
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "*********onDestroy()**********");
//取消注册监听广播
unregisterReceiver(messageReceiver);
}
}
PhoneListenerReceiver
package com.example.anti;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.WindowManager;
import android.widget.TextView;
public class PhoneListenerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//获取电话管理器对象,并注册监听器
TelephonyManager tm= (TelephonyManager) context.getApplicationContext().getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(new MyPhoneStateListener(context), PhoneStateListener.LISTEN_CALL_STATE);
System.out.println("PhoneListenerReceiver started");
}
static WindowManager wm=null;
private class MyPhoneStateListener extends PhoneStateListener{
private Context context;
TextView textView=null;
public MyPhoneStateListener(Context context){
this.context=context;
}
@Override
public void onCallStateChanged(int state, String phoneNumber) {
super.onCallStateChanged(state, phoneNumber);
//响铃状态
if(state==TelephonyManager.CALL_STATE_RINGING) {
wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
//设置一个浮动器
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
//设置为不能触摸和没有焦点
params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
params.width = WindowManager.LayoutParams.WRAP_CONTENT;
params.height = WindowManager.LayoutParams.WRAP_CONTENT;
textView = new TextView(context);
textView.setText("当前来电号码为:" + phoneNumber);
wm.addView(textView, params);//添加浮动视图
//挂机状态
}else if (state==TelephonyManager.CALL_STATE_IDLE){
if(wm!=null){
wm.removeView(textView);
wm=null;
}
}
}
}
}
SmsMessageReceiver
package com.example.anti;
import android.Manifest;
import android.app.KeyguardManager;
import android.app.admin.DevicePolicyManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.PowerManager;
import android.support.v4.app.ActivityCompat;
import android.telephony.SmsMessage;
import android.telephony.TelephonyManager;
public class SmsMessageReceiver extends BroadcastReceiver {
TelephonyManager tm;
PowerManager pm;
PowerManager.WakeLock wakeLock = null;
DevicePolicyManager mDPM;
ComponentName mAdminName;
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.SCREEN_DIM_WAKE_LOCK, "myapp:mywakelocktag");
Bundle bundle = intent.getExtras();
Object messages[] = (Object[]) bundle.get("pdus");
SmsMessage smsMessage[] = new SmsMessage[messages.length];
for (int i = 0; i < messages.length; i++) {
smsMessage[i] = SmsMessage.createFromPdu((byte[]) messages[i]);
}
//获取短信的发送者
String sender = smsMessage[0].getOriginatingAddress();//
//获取短信内容
String messageBody = smsMessage[0].getMessageBody();
// 锁屏
SharedPreferences sp = context.getSharedPreferences("Test", Context.MODE_PRIVATE);
String safenumber = sp.getString("SP_SAFE_KEY", "");
System.out.println("短信发送者"+sender);
System.out.println("短信内容"+messageBody);
mAdminName = new ComponentName(context, MyAdmin.class);
mDPM = (DevicePolicyManager) context.getSystemService(Context.DEVICE_POLICY_SERVICE);
if(sender.equals(safenumber)){
if (messageBody.equals("lock")){
if (mDPM.isAdminActive(mAdminName)) {
mDPM.lockNow();
mDPM.resetPassword("123456789",0);
}
}if (messageBody.equals("unlock")){
// 获取电源管理器对象
// 获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是调试用的Tag
// 点亮屏幕
wakeLock.acquire();
// 释放
wakeLock.release();
}
}
}
}
SPUtils
package com.example.anti;
import android.content.Context;
import android.content.SharedPreferences;
import java.util.Map;
public class SPUtils {
private final static String spName = "Test";
public static void putValue(Context context, String key, Object value) {
SharedPreferences sp = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
SharedPreferences.Editor edit = sp.edit();
if (value instanceof Boolean) {
edit.putBoolean(key, (Boolean) value);
} else if (value instanceof Float) {
edit.putFloat(key, (Float) value);
} else if (value instanceof Integer) {
edit.putInt(key, (Integer) value);
} else if (value instanceof Long) {
edit.putLong(key, (Long) value);
} else if (value instanceof String) {
edit.putString(key, (String) value);
}
edit.apply();
}
public static Object getValue(Context context, String key, Object defValue) {
SharedPreferences sp = context.getSharedPreferences(spName, Context.MODE_PRIVATE);
if (defValue instanceof Boolean) {
return sp.getBoolean(key, (Boolean) defValue);
} else if (defValue instanceof Float) {
return sp.getFloat(key, (Float) defValue);
} else if (defValue instanceof Integer) {
return sp.getInt(key, (Integer) defValue);
} else if (defValue instanceof Long) {
return sp.getLong(key, (Long) defValue);
} else if (defValue instanceof String) {
return sp.getString(key, (String) defValue);
}
return null;
}
public static void clearSP(Context context) {
context.getSharedPreferences(spName, Context.MODE_PRIVATE)
.edit()
.clear()
.apply();
}
public static void removeSP(Context context, String Key) {
context.getSharedPreferences(spName, Context.MODE_PRIVATE)
.edit()
.remove(Key)
.apply();
}
public static Map<String, ?> getAllSP(Context context) {
return context.getSharedPreferences(spName, Context.MODE_PRIVATE).getAll();
}
}
my_admin
<?xml version="1.0" encoding="utf-8"?>
<device-admin xmlns:android="http://schemas.android.com/apk/res/android">
<uses-policies>
<force-lock />
<reset-password/>
</uses-policies>
</device-admin>
清单文件
功能完成的不是很好,在自己手机上运行,锁屏功能没有效果,模拟器能够运行,不知道是Android版本问题还手机品牌限制。大部分功能都能正常运行。