毕业设计网
JSP,JAVA | python | nodejs | android,安卓 | PHP | 微信小程序 |

安卓Android防盗程序简单实现

学习要点总结:

1、 关于SharedPreferences
在android平台下用于保存数据有三种方式,1、SQLite 2、

SharedPreferences 3、File
SharedPreferences是将数据保存在一个xml文件中,并且是以Map的形式保

存,一个Key对应一个Value   但获取某一个Key的时候,都会有一个默认值

,这个默认值是在xml不存在这个key值的时候使用
a) 获得SharedPreferences :
获得SharedPreferences是通过上下文(Context)中的getSharedPreferences

方法获得。
    SharedPreferences  sp = this.getSharedPreferences("data",

MODE_WORLD_READABLE);
   第一个参数是指定xml文件的名字,当不存在的时候就会创建它。第二个

参数是获得这个SharedPreferences的模式,一共有四种模式:MODE_APPEND

、MODE_PRIVATE、  MODE_WORLD_READABLE 、MODE_WORLD_WRITEABLE
b) 从SharedPreferences中取值
通过sp.getXXX的方式可以获得对应key的值,在getXXX的时候,需要指定一

个默认的值,当key值不存在的时候使用
c) 往SharedPreferences中设值
需要用到Editor
 Editor editor = sp.edit();
获得了Editor之后,才能对SharedPreferences进行写
editor.putXXX(“key”,value)
最后需要注意的一点是别忘了commit
e) Xml文件存放的位置位于data/data/包名/shared_prefs/xxx.xml
2、 关于AlertDialog
创建AlertDialog需要用到AlertDialog.Builder这个对象,对这个Builder

做相应的设置,可以使AlertDialog有不同的展现
 AlertDialog.Builder builder = new AlertDialog.Builder(this)
 builder.setTitle(“”);
a) 创建普通的AlertDialog
builder.setNegativeButton("xxx", new

DialogInterface.OnClickListener() {
   public void onClick(DialogInterface dialog, int which)
   }
  });
一共有三种Button:NegativeButton,PositiveButton,NeutralButton
这三种Button默认的实现了点击之后消失AlertDialog
b) 创建自定义布局的AlertDialog
创建自定义布局的AlertDialog,需要一个布局文件,我们所需要做的就是

将这个布局文件变成一个View对象,再将这个View对象设置到Builder里面


将布局文件变成一个View对象,需要用到LayoutInflater这个对象中的

inflate方法
LayoutInflater inflater = LayoutInflater.from(this);
 View view = inflater.inflate(R.layout.showpassworddialog, null);
之后再builder.setView(view)就可以将自定义的布局文件放到Dialog里面

去了
在这个自定义的布局文件中,我们也是可以取到里面定义的控件,通过

view.findViewById() 就可以找到自定义布局文件中的相应控件,之后就可

以设置或者做事件的监听

AlertDialog dialog = builder.create();
dialog.show();
3、 TelephonyManager
获取SIM卡信息。在SIM卡中并没有保存用户的手机,区分每一张SIM是通过

IMSI码。在运营商的数据库中存在手机号码和IMSI码的映射,所以手机是通

过发送IMSI码到运营商的一端,获得自己的手机号码。
TelephonyManager tm = (TelephonyManager) this.getSystemService

(Context.TELEPHONY_SERVICE);

 //获取手机号码    一般是为空的,因为运营商没有基本没有把本机电话

保存在SIM卡中   标识每一张SIM卡是通过IMSI码(tm.getSubscriberId()).
     //在运营商的数据库表中有IMSI码与电话号码的映射。所以,手机是

通过发送IMSI码到运营商一端,才获得自己的手机号码
     String phonenumber = tm.getLine1Number();
     //获得每一张电话卡的唯一标识   IMIS码
     String subscriberid = tm.getSubscriberId();

        //获取手机的IMEI号码   国际移动设备识别码是区别移动设备的

标志
     String deviceId = tm.getDeviceId();
     //获取国际的国家编码  中国:cn
     String networkiso = tm.getNetworkCountryIso();
     //获取网络的MCC+MNC编码   中国电信天翼460003   中国移动46000
     String networkoper = tm.getNetworkOperator();
     //获取网络的MCC+MNC编码对应的名称   中国电信:China Telecom 

中国移动:China Mobile
     String networkoper_name = tm.getNetworkOperatorName();
     //获取SIM的串号   串号是标识物理设备的
     String simnumber = tm.getSimSerialNumber();
 
     //获取网络的类型
     int phonetype = tm.getPhoneType();
     String phonetype_str = "null";
     switch(phonetype){
       case TelephonyManager.PHONE_TYPE_GSM:
        phonetype_str ="GSM网络";
        break;
       case TelephonyManager.PHONE_TYPE_CDMA:
        phonetype_str ="CDMA网络";
           break;
       case TelephonyManager.PHONE_TYPE_NONE:
        phonetype_str ="未识别网络";
           break;
     }
    
     int simstate = tm.getSimState();
     String simstatestr = "null";
     switch(simstate ){
       case TelephonyManager.SIM_STATE_UNKNOWN:
        simstatestr = "未知状态";
        break;
       case TelephonyManager.SIM_STATE_ABSENT:
        simstatestr = "未插卡";
        break;
       case TelephonyManager.SIM_STATE_PIN_REQUIRED:
        simstatestr = "需要PIN密码解锁";
           break;
       case TelephonyManager.SIM_STATE_PUK_REQUIRED:
        simstatestr = "需要PUK密码解锁";
           break;
       case TelephonyManager.SIM_STATE_READY:
        simstatestr = "就绪";
           break;
       case TelephonyManager.SIM_STATE_NETWORK_LOCKED:
        simstatestr = "SIM已经被锁住";
           break;
     }

   读取这些数据需要权限
<uses-permission

android:name="android.permission.READ_PHONE_STATE"></uses-

permission>
4、广播的使用
在android系统中,广播运用的很广泛。许多系统的事件都喜欢把它封装成

广播。比如手机的电量改变,手机开机完毕,手机接收到短信等等。那么广

播到底是什么呢?广播通俗的理解应该是android系统在整个手机内部发送

的一个消息。比如手机开机完毕,当手机开机完成之后,就会在整个手机的

内部发送一个“启动完毕”的消息。如果有一个广播接收着,它感兴趣的消

息是“启动完毕”,这时候,这个广播接收者就会有所操作,比如启动某个

程序,这样就可以实现开机启动程序的功能了。
系统中提供了许许多多的广播,也可以用户自定义广播。
广播接收者,对感兴趣的消息进行捕捉,一旦有这个消息出现,就进行相应

的操作。
广播接收者比较重要的地方分为两点,1、 广播接收者的注册   2、

<intent-filter>
1、 广播接收者的注册
a) 代码中注册       临时有效
i. 注册
ii. 注销
b) Manifest文件中注册     永久有效,直到这个程序被卸载
2、 <intent-filter>
a) 指定这个广播接收者所感兴趣的广播,通过<action>标签指定

开机完毕时发送的广播:
<receiver android:name=".BootCompleteReceiver">
  <intent-filter>
  <action android:name="android.intent.action.BOOT_COMPLETED"/>
  </intent-filter>
</receiver>

接收短信时发送的广播
<receiver android:name=".ReceiveSMSReceiver">
<intent-filter>
 <action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
在接收某些广播的时候需要权限,例如接收短信的广播就需要
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
 <uses-permission android:name="android.permission.READ_SMS"/>

4、 SmsManager
1、发送短信
SmsManager smsManager = SmsManager.getDefault();
   // 按照一条短信,最大容量拆分成多条短信
   List<String> divideContents = smsManager.divideMessage("手机

IMSI码为" + safedSubscriberid + " 已被更换SIM卡,更换的SIM卡IMSI码

为:" + subscriberid);
   for (String text : divideContents) {
       smsManager.sendTextMessage(savedNumber, null, text, null,

null);
   }
-- destinationAddress:目标电话号码
-- scAddress:短信中心号码,测试可以不填
-- text: 短信内容
-- sentIntent:发送 -->中国移动 --> 中国移动发送失败 --> 返回发送

成功或失败信号 --> 后续处理   即,这个意图包装了短信发送状态的信息
-- deliveryIntent: 发送 -->中国移动 --> 中国移动发送成功 --> 返回

对方是否收到这个信息 --> 后续处理  即:这个意图包装了短信是否被对

方收到的状态信息(供应商已经发送成功,但是对方没有收到)。
 声明短信发送权限
     * AndroidManifest.xml
       <uses-permission

android:name="android.permission.SEND_SMS"/>
3、 读取短信内容

接收短信时发送的广播
<receiver android:name=".ReceiveSMSReceiver">
<intent-filter>
 <action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
在接收某些广播的时候需要权限,例如接收短信的广播就需要
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
 <uses-permission android:name="android.permission.READ_SMS"/>

当短信到来的时候,系统会将短信的内容封装成pdu的格式,然后放到

intent里面。所以要获得短信的内容,就通过intent,将puds拿出来就可以

了,它返回的是Object数组
Object[] messages = (Object[]) intent.getSerializableExtra

("pdus");
         创建一个二维字节数组
  byte[][] pduObjs = new byte[messages.length][];
  for (int i = 0; i < messages.length; i++)  {
   pduObjs[i] = (byte[]) messages[i];
  }
  byte[][] pdus = new byte[pduObjs.length][];
  int pduCount = pdus.length;
  SmsMessage[] msgs = new SmsMessage[pduCount];
  for (int i = 0; i < pduCount; i++){
   pdus[i] = pduObjs[i];
   msgs[i] = SmsMessage.createFromPdu(pdus[i]);
  }
  return msgs;
 }
一条短信就是一个SmsMessage ,这个SmsMessage可以通过一个byte[]来创建

 

 

 

 

 

 

 


小结:
广播接收者,对接收短信进行监听,当手机接收到一条短信的时候,系统会

发出一条广播,被广播接收者接收。别忘了要将这个广播接收者注册
在onReceive方法中有一个参数intent,当拦截这条短信的时候,所有的短

信信息都会封装在这个intent中,我们可以通过这个intent来获取短信信息

短信封装的形式pdu
Object[] object = (Object[]) intent.getSerializableExtra("pdus");

一条短信就是一个SmsMessage对象,一个SmsMessage对象通过一个byte[]来

创建,一个byte[]数组就是一个object对象

Object[]
Object[0]:   存在的形式  byte[]                          一条短信
Object[1]
Object[2]
Object[3]

所以Object[]   对应着一个byte[][]的二维数组
byte[][] pdus = new byte[object.length][];
pdus[i] = (byte[]) object[i];
SmsMessage message = SmsMessage.createFromPdu(pdus[i]);

获得来短信号码:
String oriAddress = msgs[i].getDisplayOriginatingAddress();
获得来短信的内容:
String body = msgs[i].getDisplayMessageBody();

完善:
将接收短信和发送短信改成后台操作,不在机子上有相关的显示
通过gps,发送的短信内容包含位置信息安卓程序

以上是一部分介绍,如需要完整的资料或者如不符合您的要求,请联系技术人员qq:242219979咨询

上一篇:安卓Android软件管理器
下一篇:Android安卓网络手机相册管理系统


版权所有 毕业设计网联系qq:242219979 © 2007-2022