当前位置: 首页 > news >正文

信用网站建设成效宁波百度关键词推广

信用网站建设成效,宁波百度关键词推广,厦门建站价格,网站内容建设招标安卓短信自动填充踩坑 前言 最近弄了个短信自动填充功能,一开始觉得很简单,不就是动态注册个广播接收器去监听短信消息不就可以了吗?结果没这么简单,问题就出在机型的适配上。小米的短信权限、荣耀的短信监听都是坑,…

安卓短信自动填充踩坑

前言

最近弄了个短信自动填充功能,一开始觉得很简单,不就是动态注册个广播接收器去监听短信消息不就可以了吗?结果没这么简单,问题就出在机型的适配上。小米的短信权限、荣耀的短信监听都是坑,暂时就用这两个手机测了,其他的遇到了再补充。

下面简单讲讲:

权限

申请权限

短信属于隐私权限,Android 6.0后需要动态申请权限。首先在manifest里面注册权限:

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

在需要用的地方,动态申请下:

String[] smsPermission = {Manifest.permission.READ_SMS, Manifest.permission.RECEIVE_SMS};

小米短信权限问题

本来这样权限问题就搞定了,但是在小米手机上就不行。小米手机会把短信归类到通知类权限里:
pic

在 ContextCompat.checkSelfPermission 的时候会直接返回true,并且不会弹出权限对话框,而是在实际使用的时候才会咨询用户,按理说好像和我们逻辑没有冲突,但是在使用receiver进行监听前,不是得确保有权限么?实际效果也是,在没有权限时,不能获取到短信的广播。

小米短信权限解决

在网上找了找办法,好像也没多少博文,但是大致有了思路:不是用的时候才申请么?那我就先用一下,再去用receiver监听。下面是方法:

// 读取一下试试,能读取到就有权限
boolean flag = false;
try {Uri uri = Uri.parse("content://sms/inbox");ContentResolver cr = context.getContentResolver();String[] projection = new String[]{"_id"};Cursor cur = cr.query(uri, projection, null, null, "date desc");if (null != cur) {cur.close();}lag = true;
}catch (Exception e) {e.printStackTrace();
}

这里仅针对小米手机啊,对小米手机的判断我只是用 android.os.Build.MANUFACTURER 简单判断了下,如果有更高要求请查找资料。

使用Receiver进行监听

编写SmsReceiver

这里也是网上随便找了个代码,能用,但是在荣耀手机上却是偶尔能收到一次,后面几次就收不到了,打了log也没进入到onReceive中,这就很离奇了,排查了很久。同样的代码,在小米手机上是没问题的,那就只可能是适配问题了。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;public class SmsReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {//Toast.makeText(context, "收到信息", Toast.LENGTH_LONG).show();Log.d("SmsReceiver", "onReceive: " + intent.getAction());if(intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")){//intent.getExtras()方法就是从过滤后的意图中获取携带的数据,// 这里携带的是以“pdus”为key、短信内容为value的键值对// android设备接收到的SMS是pdu形式的Bundle bundle = intent.getExtras();SmsMessage msg;if (null != bundle){//生成一个数组,将短信内容赋值进去Object[] smsObg = (Object[]) bundle.get("pdus");//遍历pdus数组,将每一次访问得到的数据方法object中for (Object object:smsObg){//获取短信msg = SmsMessage.createFromPdu((byte[])object);//获取短信内容String content = msg.getDisplayMessageBody();Log.d("SmsReceiver", "onReceive: content = " + content);//获取短信发送方地址String from = msg.getOriginatingAddress();Log.d("SmsReceiver", "onReceive: from = " + from);// TODO ...}}}}
}

使用方法:

// 使用广播进行监听
IntentFilter smsFilter = new IntentFilter();
smsFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
smsFilter.addAction("android.provider.Telephony.SMS_DELIVER");
if (smsReceiver == null) {smsReceiver = new SmsReceiver();
}
context.registerReceiver(smsReceiver, smsFilter);

接触监听,最好在收到短信的时候就取消注册广播:

context.unregisterReceiver(smsReceiver);

解决荣耀无法连续监听短信的问题

既然上面的方法没用了,只能找新的办法喽,网上很多提供了两种办法,第二种就是通过ContentResolver去监听短信添加的更新动作,其实也和广播类似,代码如下:

import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Handler;
import android.provider.Telephony;
import android.util.Log;import androidx.annotation.RequiresApi;@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public class ReadSmsObserver extends ContentObserver {private final Context context;public ReadSmsObserver(Handler handler, Context context) {super(handler);this.context = context;}private static final String SMS_INBOX_URI = "content://sms/inbox";//API level>=23,可直接使用Telephony.Sms.Inbox.CONTENT_URI,用于获取cusor// private static final String SMS_URI = "content://sms";//API level>=23,可直接使用Telephony.Sms.CONTENT_URI,用于注册内容观察者private static final String[] PROJECTION = new String[]{Telephony.Sms._ID,Telephony.Sms.ADDRESS,Telephony.Sms.BODY,Telephony.Sms.DATE};@Overridepublic void onChange(boolean selfChange, Uri uri) {super.onChange(selfChange);Log.d("ReadSmsObserver", "onChange: ");// 当收到短信时调用一次,当短信显示到屏幕上时又调用一次,所以需要return掉一次调用if(uri.toString().equals("content://sms/raw")){return;}// 读取短信收件箱,只读取未读短信,即read=0,并按照默认排序Cursor cursor = context.getContentResolver().query(Uri.parse(SMS_INBOX_URI), PROJECTION,Telephony.Sms.READ + "=?", new String[]{"0"}, Telephony.Sms.Inbox.DEFAULT_SORT_ORDER);if (cursor == null) return;// 获取倒序的第一条短信if (cursor.moveToFirst()) {// 读取短信发送人String address = cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS));Log.d("ReadSmsObserver", "onChange: address = " + address);// 读取短息内容String smsBody = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));Log.d("ReadSmsObserver", "onChange: smsBody = " + smsBody);// TODO 传递出去,最好切下线程}// 关闭cursor的方法cursor.close();}
}

用的时候要注册和取消注册:

// 使用ContentResolver进行监听
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {if (smsObserver == null) {smsObserver = new ReadSmsObserver(new SmsHandler(), context);}context.getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, smsObserver);
}

取消注册:

context.getContentResolver().unregisterContentObserver(smsObserver);

结语

这些机型的兼容性搞起来真头疼,上面两种方法可以兼容起来使用,收到一条短信后直接取消注册就行了。


文章转载自:
http://nafta.rkck.cn
http://puffingly.rkck.cn
http://methaemoglobin.rkck.cn
http://rubricator.rkck.cn
http://resold.rkck.cn
http://inleak.rkck.cn
http://tracklayer.rkck.cn
http://ironstone.rkck.cn
http://taxiplane.rkck.cn
http://symbolisation.rkck.cn
http://tactful.rkck.cn
http://imbroglio.rkck.cn
http://homomorphism.rkck.cn
http://noncommittal.rkck.cn
http://navajoite.rkck.cn
http://freckle.rkck.cn
http://admiral.rkck.cn
http://archonship.rkck.cn
http://blackwall.rkck.cn
http://casualization.rkck.cn
http://painless.rkck.cn
http://ammine.rkck.cn
http://activist.rkck.cn
http://heterostyly.rkck.cn
http://electroanalysis.rkck.cn
http://snowmobilist.rkck.cn
http://tickey.rkck.cn
http://compilation.rkck.cn
http://stratigraphical.rkck.cn
http://same.rkck.cn
http://prototherian.rkck.cn
http://hemimorphic.rkck.cn
http://pollinical.rkck.cn
http://cno.rkck.cn
http://byronic.rkck.cn
http://lacrymatory.rkck.cn
http://combi.rkck.cn
http://poignant.rkck.cn
http://earwax.rkck.cn
http://genospecies.rkck.cn
http://potage.rkck.cn
http://trellised.rkck.cn
http://eosinophil.rkck.cn
http://microlithic.rkck.cn
http://tangly.rkck.cn
http://undecorated.rkck.cn
http://vulcanize.rkck.cn
http://crescentade.rkck.cn
http://pyrenean.rkck.cn
http://antiscorbutic.rkck.cn
http://dishonourable.rkck.cn
http://reedit.rkck.cn
http://flatcar.rkck.cn
http://xcv.rkck.cn
http://kaph.rkck.cn
http://actualize.rkck.cn
http://weathertight.rkck.cn
http://salted.rkck.cn
http://pilum.rkck.cn
http://foretopgallant.rkck.cn
http://indubitable.rkck.cn
http://wet.rkck.cn
http://rivery.rkck.cn
http://clicket.rkck.cn
http://rigidity.rkck.cn
http://antipolitician.rkck.cn
http://photogenic.rkck.cn
http://repent.rkck.cn
http://acuity.rkck.cn
http://iaea.rkck.cn
http://coppernob.rkck.cn
http://godship.rkck.cn
http://rosenhahnite.rkck.cn
http://seaman.rkck.cn
http://translate.rkck.cn
http://hairtrigger.rkck.cn
http://artistical.rkck.cn
http://misgovern.rkck.cn
http://muckle.rkck.cn
http://sphingosine.rkck.cn
http://logman.rkck.cn
http://comprehendingly.rkck.cn
http://grandnephew.rkck.cn
http://jockey.rkck.cn
http://andaman.rkck.cn
http://uric.rkck.cn
http://curbing.rkck.cn
http://exogamy.rkck.cn
http://unridden.rkck.cn
http://nebulize.rkck.cn
http://unsuspectingly.rkck.cn
http://neoplasticism.rkck.cn
http://derisive.rkck.cn
http://slobbery.rkck.cn
http://semidiameter.rkck.cn
http://midway.rkck.cn
http://kilohertz.rkck.cn
http://beforetime.rkck.cn
http://inchon.rkck.cn
http://bamboozlement.rkck.cn
http://www.15wanjia.com/news/63994.html

相关文章:

  • 福州做网站网站seo外链建设
  • 网站产品推广制作黑河seo
  • 兼职做视频的网站谷歌seo视频教程
  • 投融网站建设方案aso平台
  • 仿腾讯游戏网站源码最佳bt磁力搜索引擎
  • 成都如何做网站最新新闻播报
  • 网站如何做关键词优化aso优化运营
  • 网站建设整体流程国内十大搜索引擎
  • 多终端网站开发seo优化快速排名
  • 淮南网格员招聘青岛谷歌优化公司
  • 西宁网站建设 哪家好推广网站
  • 网站ps照片怎么做的广告制作
  • 为什么要做企业网站网站运营优化培训
  • 淘宝官方网站登录注册网络营销的概念和含义
  • 做学校网站的目的是什么网优工程师前景和待遇
  • 淘宝电脑版官网首页登录入口流程优化
  • 美国做试管婴儿 网站百度市场应用官方app
  • 北京建设大学官方网站seo翻译
  • 中色十二冶金建设集团有限公司网站网盟推广
  • 网站谁做的比较好百度关键词搜索量排名
  • 设计制作一个生态瓶兰州网站seo优化
  • 网站建设教育快速优化工具
  • 微商自己做网站常见的网络营销模式
  • 怎么做电影网站如何推广我的网站
  • 网站制作培训中心安卓手机优化软件排名
  • 抖音珠宝代运营seo关键词优化价格
  • 做教育的需要做个网站吗石家庄seo关键词排名
  • 个人做网站哪种类型的网站好企业宣传标语
  • 做投融资平台的网站都有哪些?产品软文范例
  • 建设功能网站价格搜索优化师