国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android 獲取短信驗(yàn)證碼并自動(dòng)填充(踩坑小米、榮耀、OPPO、華為)

這篇具有很好參考價(jià)值的文章主要介紹了Android 獲取短信驗(yàn)證碼并自動(dòng)填充(踩坑小米、榮耀、OPPO、華為)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Android 獲取短信驗(yàn)證碼并自動(dòng)填充(踩坑小米、榮耀、OPPO)

前言

最近弄了個(gè)短信自動(dòng)填充功能,一開始覺得很簡(jiǎn)單,不就是動(dòng)態(tài)注冊(cè)個(gè)廣播接收器去監(jiān)聽短信消息不就可以了嗎?結(jié)果沒這么簡(jiǎn)單,問題就出在機(jī)型的適配上。小米的短信權(quán)限、榮耀、OPPO的短信監(jiān)聽都是坑,暫時(shí)就用這三個(gè)手機(jī)測(cè)了,其他的遇到了再補(bǔ)充。

下面簡(jiǎn)單講講:

權(quán)限

申請(qǐng)權(quán)限

短信屬于隱私權(quán)限,Android 6.0后需要?jiǎng)討B(tài)申請(qǐng)權(quán)限。首先在manifest里面注冊(cè)權(quán)限:

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

在需要用的地方,動(dòng)態(tài)申請(qǐng)下:

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

小米短信權(quán)限問題

本來這樣權(quán)限問題就搞定了,但是在小米手機(jī)上就不行。小米手機(jī)會(huì)把短信歸類到通知類權(quán)限里:
Android 獲取短信驗(yàn)證碼并自動(dòng)填充(踩坑小米、榮耀、OPPO、華為)

在 ContextCompat.checkSelfPermission 的時(shí)候會(huì)直接返回true,并且不會(huì)彈出權(quán)限對(duì)話框,而是在實(shí)際使用的時(shí)候才會(huì)咨詢用戶,按理說好像和我們邏輯沒有沖突,但是在使用receiver進(jìn)行監(jiān)聽前,不是得確保有權(quán)限么?實(shí)際效果也是,在沒有權(quán)限時(shí),不能獲取到短信的廣播。

小米短信權(quán)限解決

在網(wǎng)上找了找辦法,好像也沒多少博文,但是大致有了思路:不是用的時(shí)候才申請(qǐng)么?那我就先用一下,再去用receiver監(jiān)聽。下面是方法:

// 讀取一下試試,能讀取到就有權(quán)限
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();
}

這里僅針對(duì)小米手機(jī)啊,對(duì)小米手機(jī)的判斷我只是用 android.os.Build.MANUFACTURER 簡(jiǎn)單判斷了下,如果有更高要求請(qǐng)查找資料。

使用Receiver進(jìn)行監(jiān)聽

編寫SmsReceiver

這里也是網(wǎng)上隨便找了個(gè)代碼,能用,但是在榮耀手機(jī)上卻是偶爾能收到一次,后面幾次就收不到了,打了log也沒進(jìn)入到onReceive中,這就很離奇了,排查了很久。同樣的代碼,在小米手機(jī)上是沒問題的,那就只可能是適配問題了。

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 {

    @Override
    public 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()方法就是從過濾后的意圖中獲取攜帶的數(shù)據(jù),
            // 這里攜帶的是以“pdus”為key、短信內(nèi)容為value的鍵值對(duì)
            // android設(shè)備接收到的SMS是pdu形式的
            Bundle bundle = intent.getExtras();
            SmsMessage msg;
            if (null != bundle){
                //生成一個(gè)數(shù)組,將短信內(nèi)容賦值進(jìn)去
                Object[] smsObg = (Object[]) bundle.get("pdus");
                //遍歷pdus數(shù)組,將每一次訪問得到的數(shù)據(jù)方法object中
                for (Object object:smsObg){
                    //獲取短信
                    msg = SmsMessage.createFromPdu((byte[])object);
                    //獲取短信內(nèi)容
                    String content = msg.getDisplayMessageBody();
                    Log.d("SmsReceiver", "onReceive: content = " + content);
                    //獲取短信發(fā)送方地址
                    String from = msg.getOriginatingAddress();
                    Log.d("SmsReceiver", "onReceive: from = " + from);

                    // TODO ...
                }
            }
        }
    }
}

使用方法:

// 使用廣播進(jìn)行監(jiān)聽
IntentFilter smsFilter = new IntentFilter();
smsFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
smsFilter.addAction("android.provider.Telephony.SMS_DELIVER");
if (smsReceiver == null) {
    smsReceiver = new SmsReceiver();
}
smsReceiver.setCallbackContext(callbackContext);
context.registerReceiver(smsReceiver, smsFilter);

接觸監(jiān)聽,最好在收到短信的時(shí)候就取消注冊(cè)廣播:

context.unregisterReceiver(smsReceiver);

解決OPPO手機(jī)無法接收短信廣播問題

本來小米榮耀都搞定了,給測(cè)試一測(cè),結(jié)果又不行了。收不到廣播,用下面的ContentObserver還總拿不到對(duì)的數(shù)據(jù)。找了下資料,發(fā)現(xiàn)OPPO手機(jī)需要在短信APP進(jìn)行設(shè)置。

ps. 后面發(fā)現(xiàn)華為、榮耀都是這樣,會(huì)對(duì)驗(yàn)證碼進(jìn)行保護(hù)??梢允褂肅ontentObserver 監(jiān)聽,能觸發(fā)onChange,但是拿不到Uri,不過可以使用查詢,拿到倒敘的第一條數(shù)據(jù),取出其中的date屬性,比對(duì)監(jiān)聽時(shí)的時(shí)間,如果短信兩分鐘有效,那就看看第一條數(shù)據(jù)是不是在兩分鐘內(nèi),如果不是,那就是沒拿到,問題就出在用戶開啟了短信驗(yàn)證碼保護(hù),可以提示用戶自行輸入驗(yàn)證碼(畢竟這個(gè)不是我們的鍋)。

解決方法:
在短信 -> 短信設(shè)置里面 -> 打開禁止后臺(tái)應(yīng)用讀取驗(yàn)證碼

解決榮耀無法連續(xù)監(jiān)聽短信的問題

既然上面的方法沒用了,只能找新的辦法嘍,網(wǎng)上很多提供了兩種辦法,第二種就是通過ContentResolver去監(jiān)聽短信添加的更新動(dòng)作,其實(shí)也和廣播類似,代碼如下:

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,用于注冊(cè)內(nèi)容觀察者
    private static final String[] PROJECTION = new String[]{
            Telephony.Sms._ID,
            Telephony.Sms.ADDRESS,
            Telephony.Sms.BODY,
            Telephony.Sms.DATE
    };

    @Override
    public void onChange(boolean selfChange, Uri uri) {
        super.onChange(selfChange);
        Log.d("ReadSmsObserver", "onChange: ");
        // 當(dāng)收到短信時(shí)調(diào)用一次,當(dāng)短信顯示到屏幕上時(shí)又調(diào)用一次,所以需要return掉一次調(diào)用
        if(uri.toString().equals("content://sms/raw")){
            return;
        }
        // 讀取短信收件箱,只讀取未讀短信,即read=0,并按照默認(rèn)排序
        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()) {
            // 讀取短信發(fā)送人
            String address = cursor.getString(cursor.getColumnIndex(Telephony.Sms.ADDRESS));
            Log.d("ReadSmsObserver", "onChange: address = " + address);
            // 讀取短息內(nèi)容
            String smsBody = cursor.getString(cursor.getColumnIndex(Telephony.Sms.BODY));
            Log.d("ReadSmsObserver", "onChange: smsBody = " + smsBody);
            
            // TODO 傳遞出去,最好切下線程

        }
        // 關(guān)閉cursor的方法
        cursor.close();
    }
}

用的時(shí)候要注冊(cè)和取消注冊(cè):

// 使用ContentResolver進(jìn)行監(jiān)聽
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
    if (smsObserver == null) {
        smsObserver = new ReadSmsObserver(new SmsHandler(), context);
    }
    smsObserver.setCallbackContext(callbackContext);
    context.getContentResolver().registerContentObserver(
        Uri.parse("content://sms/"), true, smsObserver);
}

取消注冊(cè):

context.getContentResolver().unregisterContentObserver(smsObserver);

解決OPPO手機(jī)無法拿到最新短信問題

很神奇啊,每次使用ContentObserver去監(jiān)聽短信變化,明明onChange觸發(fā)了,但是去拿短信就是拿不到最新的,開了上面的設(shè)置也不行,弄了好久。

最后想的解決辦法是,兩種方式同時(shí)監(jiān)聽,在onChange觸發(fā)后等待三秒鐘(開始試了1s還不行),看看有沒有onReceive,如果有就直接使用onReceive的短信,如果沒有再驗(yàn)證onChange內(nèi)拿到的短信,看看是不是有效時(shí)間內(nèi)的,連倒敘第一個(gè)都在有效時(shí)間外,那就是沒拿到了,直接舍棄了。

思路是這樣,做起來不麻煩,勇哥handler就可以解決,讀者自行處理吧。

結(jié)語

這些機(jī)型的兼容性搞起來真頭疼,上面兩種方法可以兼容起來使用,收到一條短信后直接取消注冊(cè)就行了。文章來源地址http://www.zghlxwxcb.cn/news/detail-429993.html

到了這里,關(guān)于Android 獲取短信驗(yàn)證碼并自動(dòng)填充(踩坑小米、榮耀、OPPO、華為)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • chatgpt賦能python:Python如何獲取手機(jī)短信驗(yàn)證碼

    在現(xiàn)代社會(huì)里,驗(yàn)證碼已經(jīng)成為了各種網(wǎng)站、APP、銀行等機(jī)構(gòu)對(duì)用戶身份認(rèn)證的必備手段。從有用性角度考慮,我們需要確保驗(yàn)證碼的真實(shí)有效性,從而保護(hù)用戶信息的安全。而為了方便用戶接收驗(yàn)證碼,手機(jī)短信成為一種比較受歡迎的驗(yàn)證碼發(fā)送工具。 但是,一旦手機(jī)接收

    2024年02月11日
    瀏覽(23)
  • vue element-ui實(shí)現(xiàn)獲取短信驗(yàn)證碼 ,60秒倒計(jì)時(shí)及頁面

    vue element-ui實(shí)現(xiàn)獲取短信驗(yàn)證碼 ,60秒倒計(jì)時(shí)及頁面

    cc廢話不多說先上效果圖 ? ?vue頁面布局 css樣式? 邏輯js

    2024年02月08日
    瀏覽(35)
  • 【利用寶塔WebHook插件、SmsForwarder(短信轉(zhuǎn)發(fā)器)、quicker實(shí)現(xiàn)電腦端自動(dòng)輸入手機(jī)短信驗(yàn)證碼登錄】

    【利用寶塔WebHook插件、SmsForwarder(短信轉(zhuǎn)發(fā)器)、quicker實(shí)現(xiàn)電腦端自動(dòng)輸入手機(jī)短信驗(yàn)證碼登錄】

    最近公司各種系統(tǒng)有一些小改動(dòng),閑置幾分鐘就得重新登錄,然后每次登錄得:打開手機(jī)→查看驗(yàn)證碼短信→在電腦上手動(dòng)輸入,實(shí)在是太影響 效率 (心情)。為了更好地 搬磚 (摸魚),利用一些小工具實(shí)現(xiàn)了手機(jī)驗(yàn)證碼轉(zhuǎn)發(fā)并自動(dòng)輸入。 服務(wù)器設(shè)定weebhook——手機(jī)驗(yàn)證碼

    2024年03月27日
    瀏覽(56)
  • Android通訊錄管理(獲取聯(lián)系人、通話記錄、短信消息)(二)(3),開源新作

    Android通訊錄管理(獲取聯(lián)系人、通話記錄、短信消息)(二)(3),開源新作

    android:background=“#000000” ListView android:id=“@+id/call_log_list” android:layout_width=“fill_parent” android:layout_height=“fill_parent” android:layout_alignParentTop=“true” android:cacheColorHint=“#000000” android:fadingEdge=“none” android:scrollingCache=“false” android:visibility=“visible” / /Contact_Demo/res/layout/

    2024年04月14日
    瀏覽(28)
  • 【Android】小米手機(jī) Root全攻略:輕松獲取手機(jī)最高權(quán)限

    【Android】小米手機(jī) Root全攻略:輕松獲取手機(jī)最高權(quán)限

    需求 作為一個(gè)貧窮的米粉,目前為止買的手機(jī)都是小米的,一開始就沖著它的“發(fā)燒”而去,米1、米4、米8、K50,除了米8外,都刷過機(jī),root過。 除了米1忽然有一天罷工之后,不能使用,其他手機(jī)都依然辛苦任職中。 K50 是最近買的,先想到的就是root掉,本來以為網(wǎng)上資料

    2024年02月08日
    瀏覽(24)
  • Android Studio開發(fā)之使用內(nèi)容組件Content獲取通訊信息講解及實(shí)戰(zhàn)(附源碼 包括添加手機(jī)聯(lián)系人和發(fā)短信)

    Android Studio開發(fā)之使用內(nèi)容組件Content獲取通訊信息講解及實(shí)戰(zhàn)(附源碼 包括添加手機(jī)聯(lián)系人和發(fā)短信)

    運(yùn)行有問題或需要源碼請(qǐng)點(diǎn)贊關(guān)注收藏后評(píng)論區(qū)留言 在實(shí)際開發(fā)中,普通App很少會(huì)開放數(shù)據(jù)接口給其他應(yīng)用訪問。內(nèi)容組件能夠派上用場(chǎng)的情況往往是App想要訪問系統(tǒng)應(yīng)用的通訊數(shù)據(jù),比如查看聯(lián)系人,短信,通話記錄等等,以及對(duì)這些通訊數(shù)據(jù)及逆行增刪改查。 首先要給

    2024年02月09日
    瀏覽(56)
  • 【干貨防踩坑/全圖文分步/Gitlab鏡像倉庫自動(dòng)同步】Gitlab CE/EE鏡像倉庫的配置技巧(含ssh/密碼兩驗(yàn)證方法)

    【干貨防踩坑/全圖文分步/Gitlab鏡像倉庫自動(dòng)同步】Gitlab CE/EE鏡像倉庫的配置技巧(含ssh/密碼兩驗(yàn)證方法)

    眾所周知,Gitlab是個(gè)好東西。為什么呢?GitHub沒有的功能,他全有了。更何況還可以私有部署。這兩天自己部署了Gitlab,然后想把自己的項(xiàng)目和Github同步,于是乎有了如下的故事。 我搜索了一下CSDN同類的文章,基本沒有任何的講Gitlab 配置鏡像倉庫的方法 ,于是有感而發(fā),寫

    2024年02月15日
    瀏覽(122)
  • 【python】短信驗(yàn)證之騰訊云短信驗(yàn)證詳細(xì)步驟

    【python】短信驗(yàn)證之騰訊云短信驗(yàn)證詳細(xì)步驟

    注冊(cè)一個(gè)騰訊云賬戶,騰訊云中提供了很多功能:云服務(wù)器、云儲(chǔ)存器、云直播、云短信等很多功能。 注冊(cè)地址:https://cloud.tencent.com/ 根據(jù)提示一步步進(jìn)行注冊(cè)即可, 實(shí)名注冊(cè)時(shí),什么行業(yè)、通訊等信息,按照自己的的實(shí)際情況填寫即可,實(shí)在不知道的可以隨便填。 騰訊云注

    2024年02月05日
    瀏覽(26)
  • selenium破解滑塊驗(yàn)證碼自動(dòng)查詢+獲取后續(xù)表單數(shù)據(jù)

    一、裝載好chromedriver之后,運(yùn)行命令行 \\\"chrome.exe\\\"(路徑) --remote-debugging-port=9222 打開谷歌瀏覽器。 二、使用selenium打開網(wǎng)頁: ?三、獲取輸入框批量輸入數(shù)據(jù),并破解驗(yàn)證碼: 使用 driver.find_element_by_xpath 獲取element時(shí),xpath可通過瀏覽器打開網(wǎng)站,使用檢查功能,找到element所

    2024年02月12日
    瀏覽(97)
  • 集成SpringCloudAlibaba短信服務(wù) 短信驗(yàn)證碼

    1.1 SpringCloudAlibaba短信服務(wù)簡(jiǎn)介 短信服務(wù)(Short Message Service)是阿里云為用戶提供的一種通信服務(wù)的能力。 產(chǎn)品優(yōu)勢(shì):覆蓋全面、高并發(fā)處理、消息堆積處理、開發(fā)管理簡(jiǎn)單、智能監(jiān)控調(diào)度 產(chǎn)品功能:短信通知、短信驗(yàn)證碼、推廣短信、異步通知、數(shù)據(jù)統(tǒng)計(jì) 應(yīng)用場(chǎng)景:短信

    2024年01月17日
    瀏覽(23)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包