受欢迎的博客标签

Android|Android Studio编程入门之二(Android 8.0:短信转发权限适配)

Published

create android app project with java Android Studio

create new porject with Android Studio

choice java

一、android 各版本的主要变化

(一)安卓最近几个版本的新特性: 5.0的时候出现了Design风格 6.0出现的危险权限需要申请 7.0出现的目录访问被限制 8.0通知栏的机制   

(二)API 对应关系 Android 8.1  --- Api 27 Android 8.0  --- Api 26  

(三)4.4之后,新增了一个default sms的机制,应用必须是默认的短信程序才可以收发短信

(四)重要提示:从 2021 年 8 月起,新应用需要使用 Android App Bundle 才能在 Google Play 中发布。现在,Play Feature Delivery 和 Play Asset Delivery 均支持大小超过 150 MB 的新应用。

二、短信读取

(一)root后直接读取短信数据库  

public void readSms(View view)

{ String path = "data/data/com.android.providers.telephony/databases/mmssms.db"; try { //修改权限 RootTools.sendShell("chmod 777 " + path, 3000); //读取短信 SQLiteDatabase db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY); Cursor cursor = db.query("sms", new String[]{"address","body"}, null, null, null, null, null); while(cursor.moveToNext()){ System.out.println(cursor.getString(cursor.getColumnIndex("address"))); System.out.println(cursor.getString(cursor.getColumnIndex("body"))); } //恢复权限 RootTools.sendShell("chmod 660 " + path, 3000); } catch (Exception e) { e.printStackTrace(); } }

(二)监听广播:BroadCastReceiver:通过广播接收器来实现监听用监听广播的方法来实现。但是这种方法只对新接收到的短信有效,对收件箱中的未读和已读短信无法响应。而且如果一些安全软件对短信进行拦截后,无法接收到广播。

(三)ContentObserver:监听短信数据库的变化使用ContentObserver观察者来观察短信数据库,但数据发生改变时,回调做后续处理。

短信的数据库表结构:

sms主要结构:  _id:          短信序号,如100

thread_id:对话的序号,如100,与同一个手机号互发的短信,其序号是相同的  address:  发件人地址,即手机号,如+86138138000

person:   发件人,如果发件人在通讯录中则为具体姓名,陌生人为null

date:       日期,long型,如1346988516,可以对日期显示格式进行设置

protocol: 协议0SMS_RPOTO短信,1MMS_PROTO彩信

read:      是否阅读0未读,1已读

status:    短信状态-1接收,0complete,64pending,128failed

type:       短信类型1是接收到的,2是已发出

body:      短信具体内容

service_center:短信服务中心号码编号,如+8613800755500   

要操作数据库,使用ContentResolver,短信的content uri :

全部短信:content://sms/

收件箱:content://sms/inbox

发件箱:content://sms/sent

草稿箱:content://sms/draft  

(四)其他说明由于大部分手机都对Android系统进行了深度定制,有时候会发现明明手机里有的短信会话(比如通知类短信),自己的应用却获取不到。

一般是由于权限问题导致的: 以小米手机为例,MIUI的应用有一个权限是允许获取通知类短信,没有给应用开启这项权限的话,是无法获取到通知类的短信的

三、android 发送短信的方法

(一)方法一:利用Intent调用系统的短信APP,发送短信  

Intent smsIntent = new Intent(Intent.ACTION_VIEW); smsIntent.setData(Uri.parse("smsto:")); smsIntent.setType("vnd.android-dir/mms-sms");//必须指定type smsIntent.putExtra("address", new String("15050524563"));//address字段不能改 smsIntent.putExtra("sms_body", "测试");//sms_body 不能改 startActivity(smsIntent);

(二)方法二:利用SmsManager 调用系统发送短信接口(此方法可以实现短信发送成功后回调)

SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(String destinationAddress, String scAddress, String text,PendingIntent sentIntent, PendingIntent deliveryIntent); /** * 参数说明 * destinationAddress:收信人的手机号码 * scAddress:发信人的手机号码 * text:发送信息的内容 * sentIntent:发送是否成功的回执,用于监听短信是否发送成功。 * DeliveryIntent:接收是否成功的回执,用于监听短信对方是否接收成功。 */

四、默认短信程序背景:

Android4.4以上系统第三方应用无权写短信数据库,对发送者为1开头的特服号吗,内容为验证码那类的通知类短信也没有权限读取。只能监听到发送者号码是普通11手机号码的短信内容。

(一)you must create 4 file:

1.smsReader-->Receive SMS messages 2.mmsReader-->Receive MMS messages3.ComposeSMS-->Handle requests to send messages, with UI4.HeadlessSMSservice-->Provide a headless service to send SMS messages without UI – e.g. for responding to incoming calls   How to save SMS to inbox in android? Replacing the default SMS app Android之发送短信和接收验证码 android 4.4 设置默认短信 和来电短信拒接 Android4.4以上系统选择将第三方短信应用设置为默认短信应用方法 Android设为系统默认的短信应用 Android短信监听实现,及Android4.4之后短信机制变更 Android 4.4 如何开发自己的短信 SMS App.