SharedPreferences,AlertDialog,TelephonyManager,广播的使用,SmsManager

本文主要是介绍SharedPreferences,AlertDialog,TelephonyManager,广播的使用,SmsManager,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

关于SharedPreferences

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

SharedPreferences是将数据保存在一个xml文件中,并且是以Map的形式保存,一个Key对应一个Value 但获取某一个Key的时候,都会有一个默认值,这个默认值是在xml不存在这个key值的时候使用

  1. 获得SharedPreferences :

    获得SharedPreferences是通过上下文(Context)中的getSharedPreferences方法获得。

SharedPreferences sp = this.getSharedPreferences("data", MODE_WORLD_READABLE);

第一个参数是指定xml文件的名字,当不存在的时候就会创建它。第二个参数是获得这个SharedPreferences的模式,一共有四种模式:MODE_APPEND 、MODE_PRIVATE、 MODE_WORLD_READABLE 、MODE_WORLD_WRITEABLE

  1. 从SharedPreferences中取值

    通过sp.getXXX的方式可以获得对应key的值,在getXXX的时候,需要指定一个默认的值,当key值不存在的时候使用

  2. ShaSharedPreferences中设值

    需要用到Editor

    Editor editor = sp.edit();

    获得了Editor之后,才能对SharedPreferences进行写

    editor.putXXX("key",value)

    最后需要注意的一点是别忘了commit

  3. Xml文件存放的位置位于data/data/包名/shared_prefs/xxx.xml

 

关于AlertDialog

创建AlertDialog需要用到AlertDialog.Builder这个对象,对这个Builder做相应的设置,可以使AlertDialog有不同的展现

AlertDialog.Builder builder = new AlertDialog.Builder(this)

builder.setTitle("");

  1. 创建普通的AlertDialog

    builder.setNegativeButton("xxx"new DialogInterface.OnClickListener() {

                public void onClick(DialogInterface dialog, int which)

                }

            });

    一共有三种Button:NegativeButton,PositiveButton,NeutralButton(三个which值不同)

这三种Button默认的实现了点击之后消失AlertDialog

  1. 创建自定义布局的AlertDialog

创建自定义布局的AlertDialog,需要一个布局文件,我们所需要做的就是将这个布局文件变成一个View对象,再将这个View对象设置到Builder里面去

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

LayoutInflater inflater = LayoutInflater.from(this);

View view = inflater.inflate(R.layout.showpassworddialognull);

之后再builder.setView(view)就可以将自定义的布局文件放到Dialog里面去了

在这个自定义的布局文件中,我们也是可以取到里面定义的控件,通过view.findViewById() 就可以找到自定义布局文件中的相应控件,之后就可以设置或者做事件的监听

AlertDialog dialog = builder.create();

dialog.show();

 

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;

    }

读取这些数据需要权限

READ_PHONE_STATE">

 

广播的使用

在android系统中,广播运用的很广泛。许多系统的事件都喜欢把它封装成广播。比如手机的电量改变,手机开机完毕,手机接收到短信等等。那么广播到底是什么呢?广播通俗的理解应该是android系统在整个手机内部发送的一个消息。比如手机开机完毕,当手机开机完成之后,就会在整个手机的内部发送一个"启动完毕"的消息。如果有一个广播接收着,它感兴趣的消息是"启动完毕",这时候,这个广播接收者就会有所操作,比如启动某个程序,这样就可以实现开机启动程序的功能了。

系统中提供了许许多多的广播,也可以用户自定义广播。

广播接收者,对感兴趣的消息进行捕捉,一旦有这个消息出现,就进行相应的操作。

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

  1. 广播接收者的注册
    1. 代码中注册         临时有效
      1. 注册
      2. 注销
    2. Manifest文件中注册 永久有效,直到这个程序被卸载
    1. 指定这个广播接收者所感兴趣的广播,通过标签指定

开机完毕时发送的广播:

<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"/>

 

SmsManager

1、发送短信

SmsManager smsManager = SmsManager.getDefault();

// 按照一条短信,最大容量拆分成多条短信

List divideContents = smsManager.divideMessage("手机IMSI码为" + safedSubscriberid + " 已被更换SIM卡,更换的SIM卡IMSI码为:" + subscriberid);

            for (String text : divideContents) {

             smsManager.sendTextMessage(savedNumber, null, text, nullnull);

            }

-- destinationAddress:目标电话号码

-- scAddress:短信中心号码,测试可以不填

-- text: 短信内容

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

-- deliveryIntent: 发送 -->中国移动 --> 中国移动发送成功 --> 返回对方是否收到这个信息 --> 后续处理 即:这个意图包装了短信是否被对方收到的状态信息(供应商已经发送成功,但是对方没有收到)。

    声明短信发送权限

AndroidManifest.xml

 

  1. 读取短信内容

接收短信时发送的广播

<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,发送的短信内容包含位置信息

这篇关于SharedPreferences,AlertDialog,TelephonyManager,广播的使用,SmsManager的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703458

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念