Android裝逼技術(shù)之暗碼啟動應(yīng)用-創(chuàng)新互聯(lián)

前言

喜歡的小伙伴歡迎關(guān)注,我會定期分享Android知識點及解析,還會不斷更新的BATJ面試專題,歡迎大家前來探討交流,如有好的文章也歡迎投稿。

企業(yè)建站必須是能夠以充分展現(xiàn)企業(yè)形象為主要目的,是企業(yè)文化與產(chǎn)品對外擴展宣傳的重要窗口,一個合格的網(wǎng)站不僅僅能為公司帶來巨大的互聯(lián)網(wǎng)上的收集和信息發(fā)布平臺,創(chuàng)新互聯(lián)面向各種領(lǐng)域:成都公路鉆孔機成都網(wǎng)站設(shè)計公司營銷型網(wǎng)站建設(shè)解決方案、網(wǎng)站設(shè)計等建站排名服務(wù)。

什么是暗碼?

在撥號盤中輸入*#*#<code>#*#*后,APP 可以監(jiān)控到這些輸入,然后做相應(yīng)的動作,比如啟動應(yīng)用,是不是有點騷。

下面看下這個騷操作是如何實現(xiàn)的。

效果預(yù)覽

源碼

DialtactsActivity#showDialpadFragment

DialtactsActivity 中有個 showDialpadFragment 方法,用來加載顯示撥號盤,因此入口就從 showDialpadFragment 看起,基于 Android P 分析。

private?void?showDialpadFragment(boolean?animate)?{
??//……
??final?FragmentTransaction?ft?=?getFragmentManager().beginTransaction();
??if?(dialpadFragment?==?null)?{
????dialpadFragment?=?new?DialpadFragment();
????ft.add(R.id.dialtacts_container,?dialpadFragment,?TAG_DIALPAD_FRAGMENT);
??}?else?{
????ft.show(dialpadFragment);
??}
??//……
}

具體實現(xiàn)在 DialpapFragment 中,看到 DialpapFragment 實現(xiàn)了 TextWatcher,TextWatcher 有 3 個重要方法,分別為:beforeTextChanged,onTextChanged 和 afterTextChanged,重點看 afterTextChanged 方法。

DialpadFragment#afterTextChanged

public?class?DialpadFragment?extends?Fragment
????????implements?View.OnClickListener,
????????View.OnLongClickListener,
????????View.OnKeyListener,
????????AdapterView.OnItemClickListener,
????????TextWatcher,
????????PopupMenu.OnMenuItemClickListener,
????????DialpadKeyButton.OnPressedListener?{
????//……
????@Override
????public?void?afterTextChanged(Editable?input)?{
????????//?When?DTMF?dialpad?buttons?are?being?pressed,?we?delay?SpecialCharSequenceMgr?sequence,
????????//?since?some?of?SpecialCharSequenceMgr's?behavior?is?too?abrupt?for?the?"touch-down"
????????//?behavior.
????????if?(!digitsFilledByIntent
????????????????&&?SpecialCharSequenceMgr.handleChars(getActivity(),?input.toString(),?digits))?{
????????????//?A?special?sequence?was?entered,?clear?the?digits
????????????digits.getText().clear();
????????}

????????if?(isDigitsEmpty())?{
????????????digitsFilledByIntent?=?false;
????????????digits.setCursorVisible(false);
????????}

????????if?(dialpadQueryListener?!=?null)?{
????????????dialpadQueryListener.onDialpadQueryChanged(digits.getText().toString());
????????}

????????updateDeleteButtonEnabledState();
????}
????//……
}

這里調(diào)用了 SpecialCharSequenceMgr 輔助工具類的 handleChars 方法,看這個方法。

SpecialCharSequenceMgr#handleChars

public?static?boolean?handleChars(Context?context,?String?input,?EditText?textField)?{
??//?get?rid?of?the?separators?so?that?the?string?gets?parsed?correctly
??String?dialString?=?PhoneNumberUtils.stripSeparators(input);
??if?(handleDeviceIdDisplay(context,?dialString)
??????||?handleRegulatoryInfoDisplay(context,?dialString)
??????||?handlePinEntry(context,?dialString)
??????||?handleAdnEntry(context,?dialString,?textField)
??????||?handleSecretCode(context,?dialString))?{
????return?true;
??}
??if?(MotorolaUtils.handleSpecialCharSequence(context,?input))?{
????return?true;
??}
??return?false;
}

handleChars 方法中,會對各種特殊的 secret code 進行匹配處理,這里我們看 handleSecretCode。

SpecialCharSequenceMgr#handleSecretCode

static?boolean?handleSecretCode(Context?context,?String?input)?{
??//?Secret?code?specific?to?OEMs?should?be?handled?first.
??if?(TranssionUtils.isTranssionSecretCode(input))?{
????TranssionUtils.handleTranssionSecretCode(context,?input);
????return?true;
??}
??//?Secret?codes?are?accessed?by?dialing?*#*#<code>#*#*?or?"*#<code_starting_with_number>#"
??if?(input.length()?>?8?&&?input.startsWith("*#*#")?&&?input.endsWith("#*#*"))?{
????String?secretCode?=?input.substring(4,?input.length()?-?4);
????TelephonyManagerCompat.handleSecretCode(context,?secretCode);
????return?true;
??}
??return?false;
}

再看下 TelephonyManagerCompat.handleSecretCode 方法。

TelephonyManagerCompat#handleSecretCode

public?static?void?handleSecretCode(Context?context,?String?secretCode)?{
??//?Must?use?system?service?on?O+?to?avoid?using?broadcasts,?which?are?not?allowed?on?O+.
??if?(BuildCompat.isAtLeastO())?{
????if?(!TelecomUtil.isDefaultDialer(context))?{
??????LogUtil.e(
??????????"TelephonyManagerCompat.handleSecretCode",
??????????"not?default?dialer,?cannot?send?special?code");
??????return;
????}
????context.getSystemService(TelephonyManager.class).sendDialerSpecialCode(secretCode);
??}?else?{
????//?System?service?call?is?not?supported?pre-O,?so?must?use?a?broadcast?for?N-.
????Intent?intent?=
????????new?Intent(SECRET_CODE_ACTION,?Uri.parse("android_secret_code://"?+?secretCode));
????context.sendBroadcast(intent);
??}
}

可以看到在撥號中接收到*#*#<code>#*#* 這樣的指令時,程序會對外發(fā)送廣播,這就意味著我們能夠接收這個廣播然后可以做我們想做的事情。

接下來我們看看這個接受廣播代碼是怎么寫。

應(yīng)用

首先在 AndroidManifest 文件中注冊廣播接收器。

<receiver
????android:name=".SecretCodeReceiver">
????<intent-filter>
????????<action?android:name="android.provider.Telephony.SECRET_CODE"?/>
????????<data?android:scheme="android_secret_code"?android:host="1010"??/>
????</intent-filter>
</receiver>

接收廣播,啟動應(yīng)用。

public?class?SecretCodeReceiver?extends?BroadcastReceiver?{
????@Override
????public?void?onReceive(Context?context,?Intent?intent)?{
????????if?(intent?!=?null?&&?SECRET_CODE_ACTION.equals(intent.getAction())){
????????????Intent?i?=?new?Intent(Intent.ACTION_MAIN);
????????????i.setClass(context,?MainActivity.class);
????????????i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
????????????context.startActivity(i);
????????}
????}
}

這樣只要在撥號中輸入*#*#1010#*#*就能啟動相應(yīng)的應(yīng)用程序,OK,收功。

覺得文章不錯的小伙伴幫忙點點贊加關(guān)注哦 ,有什么問題的話也歡迎大家前來探討交流。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。

文章標題:Android裝逼技術(shù)之暗碼啟動應(yīng)用-創(chuàng)新互聯(lián)
網(wǎng)頁地址:http://muchs.cn/article40/dgideo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、營銷型網(wǎng)站建設(shè)定制網(wǎng)站、靜態(tài)網(wǎng)站、網(wǎng)站設(shè)計品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化