1. 程式人生 > >Android 機型適配問題整理

Android 機型適配問題整理

Androi問題機型適配問題都是老生常談的話題了,其一出生就註定了成為開發人員心中的疼,隨著安卓手機品牌發展眾多,一款產品應用釋出沒有經歷過充分的機型適配就上線,接下來的一幕就是開發人員收到了滿屏的錯誤日誌發來,這個是某某統計軟體蒐集到的應用崩潰日誌,趕緊適配,開發人員當場就會懵逼。下面就自己這幾年應用開發經驗遇到過的機型適配問題做個羅列,也歡迎讀者提供所遇到的機型適配問題以及解決方案。

小米手機適配

可以說小米手機對android系統定製得讓人頭痛,好好的應用跑在小米手機上多多少少會點問題。
  • 簡訊傳送失敗無回撥
    在傳送簡訊時候,若系統攔截之後,若使用者點選拒絕傳送簡訊,這個時候發現一直收不到系統傳送簡訊失敗的廣播回撥,就會出現無回撥不知道簡訊是否傳送成功,這對於需要監聽簡訊傳送結果的要求是一個打擊,使用者往往很可能拒絕傳送簡訊。`
    解決方案:使用安卓系統的許可權管理進行許可權,既能接受說明發送簡訊意圖也能收到回撥。這個時候系統在有許可權申請之後,不會再預設攔截了。
  • 應用安裝完成後開啟應用出現初始化兩次
    是指在呼叫系統安裝應用程式完成安裝之後,若使用者直接通過這個程式開啟應用進入之後,使用者按home鍵退出回到桌面應用程式列表,又點選該應用的icon重新進入該應用,卻發現應用是重新開啟,而不是繼續上次離開的介面,按道理應用不應該重新初始化,後面經搜尋發現這是個系統bug。
    解決方案:在啟動Activity onCreate方法中進行判斷是否重複啟動
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //防止重複建立的問題,第一次安裝完成啟動,和home鍵退出點選launcher icon啟動會重複
if (!isTaskRoot() && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER) && getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN)) { finish(); return; } }
  • 靜態註冊廣播收不到廣播
    1) 在註冊系統廣播之後,收到廣播是有條件,並不是每次都能夠收到,在該品牌機型中要求:Receiver註冊不能配置執行在非該應用包名下的程序中,否則收不到廣播,廣播只給不配置android:process的Receiver。
    2)要求是在當前程序應用沒有退出的前提下,必須應用在前臺,一旦退到後臺之後,就收不到。
    暫沒有找到解決方案

華為機型

  • Toast不顯示 (榮耀手機)

    也是偶然發現在榮耀8機型上後臺應用的toast不會被顯示出來,只能當前在前臺的應用TOAST提示。
    解決方案:替換toast顯示,改用其他方式,如dialog或者彈出activity介面。

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

這個許可權是普通許可權,在華為6.0手機上,一旦targerSdk》23就沒有許可權,也不能申請。只能把targetSdk降低到23以下,目前在華為p8電信版手機發現

  • 空字串AES解密崩潰
    在華為c8817d手機上出現了這個問題,雖然不怎麼規範,卻反應了這個問題。

金立

receiver查詢不到

在錯誤日誌中發現金立某些手機盡然對manfiest中元件receiver配置按Interfiter過濾查詢結果顯示沒有找到改元件,這導致發現好多配置錯誤而導致功能失敗,其實實際是存在。後來發現只要改變一個引數flag,且是被系統不推薦使用的引數配置,就沒有問題了。

解決方案如下查詢receiver是否配置,flag配置成其他的就不行。

List<ResolveInfo> lists = manager.queryBroadcastReceivers(intent,
                PackageManager.GET_DISABLED_COMPONENTS);

Oppo手機

  • 行動網路訪問許可權
    在oppo R9s上發現oppo定製Android許可權管理,還增加了對網路訪問的許可權管理,行動網路和wifi訪問還彈出一層使用者授權機制,真是一道障礙,這種情況下,當wifi和行動網路同開時,要走行動網路,而此時行動網路還沒有來得及經使用者授權允許,從導致訪問不成功,oppo手機僅僅在行動網路下,第一次問詢問使用者是否允許,而wifi開著時,則不會。

許可權適配問題

在Android 6.0之後新增了許可權管理,google這樣設計初衷是好的,但是萬惡的廠商總喜歡擅自修改定製系統,導致留下一些頭疼的適配問題給廣大的Android 開發者,下面就講講許可權適配時出現的問題。

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

這個許可權按照系統許可權組分組在非危險許可權組中,按照Android許可權管理的意思,只要在Manifest中配置下就可以了,然而在實際使用中卻發現在機型中出現了適配問題。

如華為6.0系統手機

java.lang.SecurityException: cn.com.chinatelecom.account.demo was not granted  either of these permissions: android.permission.CHANGE_NETWORK_STATE.

只要在app中build.gradle中把 targetSdkVersion >=23就會出現這樣的問題

  targetSdkVersion 23

若要暫時性的解決這個問題就把targetSdkVersion <=22即可。
但是這個反應了一種不合理,不按常理情況下,就一波草泥馬在心中狂奔。

螢幕手勢Touch事件

最近在做監聽Touch事件時候,在onInterceptTouchEvent攔截事件時候,攔截Move事件,開發時在華為手機上沒有什麼問題,而在vivo和魅族手機上,卻發現點選螢幕時,手勢down之後,不移動在這兩個手機上卻發出了move事件,並且列印的getY值是一樣的,這導致了出現了攔截這次點選事件,但是點選事件收不到。而回頭到華為手機上時,只有down事件,一旦移動才會有move事件發生,這才是正確的事件分發。
解決辦法:故為了相容,才在move中判斷下move下移動距離必須大於0才攔截
吐槽下,華為手機相對還是做的不錯,差距在這一點就看出來了。
未完待續。。。