个人作业——防盗软件

功能实现

  1. 开机自检本机的配置信息
  2. 能保存一个安全号码
  3. 能保存本机的SIM信息
  4. 能选择是否开启防盗功能
  5. 当检测到SIM卡更换时,能将更换后的SIM卡号发送到安全号码上
  6. 能通过接受安全号码的短信进行锁屏,解锁手机屏幕
  7. 软件开机自启动
  8. 软件以后台服务形式运行

在这里插入图片描述
在这里插入图片描述
代码块
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版本问题还手机品牌限制。大部分功能都能正常运行。

猜你喜欢

转载自blog.csdn.net/chen_xiaoke/article/details/89491839
今日推荐