总结

                       总结

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)       往

d)      ShaSharedPreferences中设值

需要用到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.Builderbuilder = new AlertDialog.Builder(this)

 builder.setTitle(“”);

a)      创建普通的AlertDialog

builder.setNegativeButton("xxx", newDialogInterface.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码到运营商一端,才获得自己的手机号码

    Stringphonenumber = tm.getLine1Number();

     //获得每一张电话卡的唯一标识   IMIS码

    Stringsubscriberid = tm.getSubscriberId();

 

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

    StringdeviceId = tm.getDeviceId();

    //获取国际的国家编码  中国:cn

    Stringnetworkiso = tm.getNetworkCountryIso();

    //获取网络的MCC+MNC编码   中国电信天翼460003   中国移动46000

    Stringnetworkoper = tm.getNetworkOperator();

    //获取网络的MCC+MNC编码对应的名称   中国电信:China Telecom  中国移动:China Mobile 

    Stringnetworkoper_name = tm.getNetworkOperatorName();

    //获取SIM的串号   串号是标识物理设备的

    Stringsimnumber = tm.getSimSerialNumber();

 

    //获取网络的类型

    int phonetype =tm.getPhoneType();

    Stringphonetype_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();

    Stringsimstatestr = "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-permissionandroid: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-permissionandroid: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 = newSmsMessage[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,发送的短信内容包含位置信息

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
http://blog.csdn.net/xiaoxiao108/archive/2011/05/01/6381414.aspx 前段时间母亲手机遭贼了,以防万一,如果自己手机丢了,肯定会更郁闷,记得很多手机有防盗功能,如果更换了sim卡就会,手机就会自动把新的 sim卡手机号,gps坐标,什么的发送到绑定的手机上。网上查了下资料,这类这类软件也挺多的。看了看功能也不是很复杂,就自己写了个玩玩 。 开发环境 vs2008 wm6 .net cf 3.5 编译运行代码时,电脑必须安装 Windows Mobile 6 Professional SDK Refresh.msi 实现方法很简单 1.每一个sim都有唯一的一个IMSI编号,可以根据IMSI编号来判断手机是否更换sim卡 2.如果检测到IMSI不是自己的sim卡的,可以确定其他人可能在用你的手机。 3.每次开机程序自动运行,检测到别人如果使用你的手机,自动把他的通话记录,跟gps坐标发送到绑定好的手机号上。 4.知道用你手机人的手机号,最近通话记录,gps坐标后,再自己想办法找到这人吧。 具体代码 1.取sim卡IMSI编号 使用 TapiLib.dll类库中的ControlTapi.GetIMSINumber()取到sim卡imsi编号 2.判断是不是自己的sim卡 string simStr=ControlTapi.GetIMSINumber(); if (simStr.Length != 0) { if (simStr != SIM) { 其中SIM为事先取好的自己手机卡的IMSI编号 3.取最近通话记录代码 [StructLayout(LayoutKind.Sequential)] public struct CALLLOGENTRY { public UInt32 cbSize; public UInt64 ftStartTime; public UInt64 ftEndTime; public short iom; public bool fOutgoing; public bool fConnected; public bool fEnded; public bool fRoam; public short cidt; public IntPtr pszNumber; public IntPtr pszName; public IntPtr pszNameType; public IntPtr pszNote; }; [DllImport("phone.dll", EntryPoint = "PhoneOpenCallLog", SetLastError = true)] //首先要PhoneOpenCallLog打开通话记录句柄 private static extern int PhoneOpenCallLog(ref IntPtr pHandle); [DllImport("phone.dll", EntryPoint = "PhoneCloseCallLog", SetLastError = true)] //要调用PhoneCloseCallLog关闭句柄 private static extern int PhoneCloseCallLog(IntPtr pHandle); [DllImport("phone.dll", EntryPoint = "PhoneGetCallLogEntry", SetLastError = true)] private static extern int PhoneGetCallLogEntry(IntPtr pHandke, ref CALLLOGENTRY pEntry); //用PhoneGetCallLogEntry方法会返回一个通话记录结构,在该结构中,包含号码、姓名、通话开始时间、通话结束时间等信息。 private string GetLog() { string CallInfo = ""; try { IntPtr handle = IntPtr.Zero; //句柄 CALLLOGENTRY entry = new CALLLOGENTRY(); PhoneOpenCallLog(ref handle); //首先要PhoneOpenCallLog打开通话记录句柄 entry.cbSize = (uint)Marshal.SizeOf(entry); //返回类的非托管大小 if (handle != IntPtr.Zero) { while (PhoneGetCallLogEntry(handle, ref entry) == 0) //获取通话记录 { //Marshal.PtrToStringUni 复制指定数目的字符 string phoneNumber = Marshal.PtrToStringUni(entry.pszNumber); //号码 string name = Marshal.PtrToStringUni(entry.pszName); //姓名 if (phoneNumber == null) { phoneNumber = string.Empty; } if (name == null) { name = string.Empty; } string temp = (phoneNumber.Trim() + name.Trim()); CallInfo = CallInfo + temp; } PhoneCloseCallLog(handle); if (CallInfo.Length < 140) { return CallInfo; } else { return CallInfo.Substring(0,140); } } else { int error = Marshal.GetLastWin32Error(); return ""; } } catch (Exception ep) { //MessageBox.Show(ep.ToString()); return ""; } finally { } } 4.取gps坐标代码 GpsDeviceState device = null; GpsPosition position = null; Gps gps = new Gps(); void gps_DeviceStateChanged(object sender, DeviceStateChangedEventArgs args) { device = args.DeviceState; } protected void gps_LocationChanged(object sender, LocationChangedEventArgs args) { position = args.Position; str = ""; if (position != null) { //维度 if (position.LatitudeValid) { str += position.Latitude; } //经度 if (position.LongitudeValid) { str += " " + position.Longitude; 5.发送短信代码 SmsMessage msg = new SmsMessage(PHONE, str); msg.Send(); 6.打包为开机启动程序 打包cab文件时,只需把快捷方式添加到Startup文件夹下面就ok。 不足之处。 1.gps代码根据sdk中修改的,只是卫星定位的,根据基站定位的代码不知如何实现,只有当使用手机的人走到卫星信号好的地方时才能把坐标发 出去 2.发送的gps坐标 ,只是一个大体的位置,几百米以内的范围,有些浮动 3.如果手机被恢复出厂设置,或者被刷机,程序肯定不能运行了 即使gps信号不好的情况下只是得到使用手机人的电话号码,跟通话记录,用处也是挺大的。代码只是写着玩的,提供下参考思路代码 如果你发现有什么不合理的,需要改进的地方,或者你有什么更好的实现方法联系[email protected] 朱晓 (泰山学院)。相互交流 谢谢 http://blog.csdn.net/xiaoxiao108/archive/2011/05/01/6381414.aspx

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值