螢幕適配,rom適配和版本適配
1,不同android api版本的相容
2,不同廠商定製系統的相容
3,不同尺寸解析度的相容
4,不同cpu框架的相容
5.網路的制式
6.語言國家
7.硬體裝置
8.執行商
1、螢幕適配。(網上講的最多的就是這個。) 由於Android碎片化嚴重,導致開發中一套程式碼在不同手機上執行起來效果不是很好,相容性不是很好,這就需要對不同解析度,不同螢幕大小的手機做螢幕適配。
具體講解請看連結:https://www.jianshu.com/p/7aa34434ad4d2、版本適配。 不同的系統版本api有所變更,既要適配高版本,也要做到相容低版本。
3、ROM適配。(這個是最難的,工作量也是最大的,如果沒有不同版本手機適配的積累,遇到問題都不知道怎麼解決。)
可以說小米手機對android系統定製得讓人頭痛,好好的應用跑在小米手機上多多少少會點問題。
- 1
- 2
- 簡訊傳送失敗無回撥
在傳送簡訊時候,若系統攔截之後,若使用者點選拒絕傳送簡訊,這個時候發現一直收不到系統傳送簡訊失敗的廣播回撥,就會出現無回撥不知道簡訊是否傳送成功,這對於需要監聽簡訊傳送結果的要求是一個打擊,使用者往往很可能拒絕傳送簡訊。`
解決方案:使用安卓系統的許可權管理進行許可權,既能接受說明發送簡訊意圖也能收到回撥。這個時候系統在有許可權申請之後,不會再預設攔截了。 - 應用安裝完成後開啟應用出現初始化兩次
是指在呼叫系統安裝應用程式完成安裝之後,若使用者直接通過這個程式開啟應用進入之後,使用者按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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 靜態註冊廣播收不到廣播
在註冊系統廣播之後,收到廣播是有條件,並不是每次都能夠收到,在該品牌機型中要求:Receiver註冊不能配置執行在非該應用包名下的程序中,否則收不到廣播,廣播只給不配置android:process的Receiver。同時要求是在當前程序應用沒有退出的前提下,否則也收不到。
暫沒有找到解決方案
華為榮耀
-
Toast不顯示
也是偶然發現在榮耀8機型上後臺應用的toast不會被顯示出來,只能當前在前臺的應用TOAST提示。
解決方案:替換toast顯示,改用其他方式,如dialog或者彈出activity介面。
金立
receiver查詢不到
在錯誤日誌中發現金立某些手機盡然對manfiest中元件receiver配置按Interfiter過濾查詢結果顯示沒有找到改元件,這導致發現好多配置錯誤而導致功能失敗,其實實際是存在。後來發現只要改變一個引數flag,且是被系統不推薦使用的引數配置,就沒有問題了。
解決方案如下查詢receiver是否配置,flag配置成其他的就不行。
List<ResolveInfo> lists = manager.queryBroadcastReceivers(intent,
PackageManager.GET_DISABLED_COMPONENTS);
- 1
- 2
Oppo手機
- 行動網路訪問許可權
在oppo R9s上發現oppo定製Android許可權管理,還增加了對網路訪問的許可權管理,行動網路和wifi訪問還彈出一層使用者授權機制,真是一道障礙,這種情況下,當wifi和行動網路同開時,要走行動網路,而此時行動網路還沒有來得及經使用者授權允許,從導致訪問不成功,oppo手機僅僅在行動網路下,第一次問詢問使用者是否允許,而wifi開著時,則不會。
許可權適配問題
在Android 6.0之後新增了許可權管理,google這樣設計初衷是好的,但是萬惡的廠商總喜歡擅自修改定製系統,導致留下一些頭疼的適配問題給廣大的Android 開發者,下面就講講許可權適配時出現的問題。
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
- 1
這個許可權按照系統許可權組分組在非危險許可權組中,按照Android許可權管理的意思,只要在Manifest中配置下就可以了,然而在實際使用中卻發現在機型中出現了適配問題。
如華為6.0系統手機
java.lang.SecurityException: cn.com.chinatelecom.account.demo was not granted either of these permissions: android.permission.CHANGE_NETWORK_STATE.
- 1
只要在app中build.gradle中把 targetSdkVersion >=23就會出現這樣的問題
targetSdkVersion 23
- 1
若要暫時性的解決這個問題就把targetSdkVersion <=22即可。
但是這個反應了一種不合理,不按常理情況下,就一波草泥馬在心中狂奔。
作為Android開發者,當你需要將產品在某某品牌的某某機型上進行相容性適配的時候,最為基礎的適配方法是通過程式碼層面區分適配機型來為程式進行鍼對性的改變程式執行流向。
1. Build類包含的資訊
Android Build類可以從系統屬性中提取裝置硬體和版本資訊,主要功能:
主要讀取的是手機系統\system\build.prop(Galaxy Nexus為例)
2. Build工作原理
- Build類:記錄一系列靜態屬性
廠商/品牌/機型/主機板型號/CPU指令集···········
Build類的記錄的裝置資訊主要是呼叫SystemProperties類的get()方法,SystemProperties的實現主要由JNI介面實現。
android.os.SystemProperties此類未開放(未提供給SDK API),能夠在frameworks和android自帶的APP裡使用(比如Settings app裡),不能被其他app直接使用,只能通過Build等類來使用.
- SystemProperties:系統屬性
相當於windows的登錄檔,由key和value組成,且都是核心系統的一個基本機制。
Android 的系統屬性包括兩部分:檔案儲存的持久屬性和每次開機匯入的cache屬性。前者主要儲存在下面幾個檔案中(目錄下),後者則通過API方式使用。
/default.prop
/system/build.prop
/system/default.prop
/data/local.prop
/data/property目錄下的所有presist屬性(以presist.開頭)
JNI介面:在android_os_SystemProperties.cpp定義,在frameworks/base/core/jni/AndroidRuntime.cpp中註冊JNI。
3. 部分已知適配問題
由於Android系統的開放性,各大OEM廠商會以Android為基礎為手機開發自己的ROM,上面的程式片段通過判斷廠商和機型的方式來進行程式碼層面的適配,理論上這裡不會有問題發生,但實際上獲取廠商資訊和機型資訊的時候會出現你想像不到情況發生:
情況一:廠商資訊獲取不唯一
摩托羅拉的廠商資訊不僅是”motorola”還有”mot”和”FIH”;
索愛的廠商資訊不僅是”Sony”還有”Sony Ericsson”;
HTC的廠商資訊不僅是”HTC”還有”HUN”;
OPPO的廠商資訊不僅是”OPPO”還有”alps”;
酷派的廠商資訊不僅是”CoolPad”還有”YuLong”;
…..
情況二:機型資訊獲取比較奇葩
紅米model值為數字,model值為“2013022”的奇葩字串。
…..
情況三:廠商資訊或機型資訊獲取為unknown
聯想A60獲取廠商資訊為unknown;造成這種問題的原因是廠商隨意改動framework層導致的。
4. 適配建議
根據以上情況希望可以為Android開發者同學在適配工作中提供一定的借鑑和幫助。
我們給出的第一種解決方案是“規避已知問題”。例如,廠商資訊不唯一時,我們就蒐羅該廠商資訊的所有可能,從而進行準確的判斷,如下:
當獲取機型資訊為unknown時,我們還可以通過手機裝置的其他資訊來判斷手機具體機型,如下:
第二種解決方案,也是最理想的解決方案“裝置資料匹配”。大家都知道,從android.os.build類中,我們可以獲取到很多裝置的資訊,既然一個機型的裝置是一樣的,我們可以統計所有機型的裝置資訊得到一個數據庫,當機型獲取為unknown時,通過已知資訊匹配,得到達到一定匹配率的機型(90%或者更高),就可以認為匹配成功。