在android 4.3如下的SDK中,因爲各個廠商都是單獨作的SDK,基本上開發出來的APP都互相不兼容,如何在android4.3如下及以上版本中作到兼容,將是如下要講到的內容。html
以samsung 4.2.2,htc4.2.2(htc的4.2.2和4.1.2是用一個jar的)和android4.3爲例。java
1、須要引用的包android
samsung 4.2.2須要引用samsung_ble_sdk_200.jar,將samsung_ble_sdk_200.jar放在lib文件夾下,經過Add External JARS方式引入包;而htc4.2.2須要引用com.htc.android.bluetooth.le.jar, com.htc.android.bluetooth.le.jar是不能放在lib文件夾下,不然project將會出錯,一樣以Add External JARS方式引入包。Android4.3及以上的,則只要將project的SDK API版本更換至最高便可,同時要注意AndroidManifest中uses-sdk也要作相應更改,如:正則表達式
1 <uses-sdk 2 android:minSdkVersion="16" 3 android:targetSdkVersion="18" />
2、添加用戶權限app
Project須要藍牙的使用權限,故須要添加uses-permissionide
1 <uses-permission android:name="android.permission.BLUETOOTH" /> 2 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
htc4.2.2(包括4.1.2),須要在application節點內添加post
1 <uses-library 2 android:name="com.htc.android.bluetooth.le" 3 android:required="false" />
android4.3及以上,須要添加ui
1 <uses-feature 2 android:name="android.hardware.bluetooth_le" 3 android:required="true" />
3、應用程序的初始化this
因爲項目須要作兼容性開發,故工程的結構儘可能作到離散化,下降耦合性,方便之後的升級和功能擴展。spa
在進入工程時,MainActivity須要作如下事情:
一、 系統版本的識別
根據官方的API中的說明,能夠獲取到手機硬件信息,
手機型號 Build.MODEL
The end-user-visible name for the end product. |
sdk版本 Build.VERSION.SDK
This constant is deprecated. Use SDK_INT to easily get this as an integer. |
及frimware版本號(系統版本號) Build.VERSION.RELEASE
The user-visible version string. |
因此在java代碼中,能夠獲得手機型號和版本
1 String model = android.os.Build.MODEL;// 獲取手機型號 2 String version = android.os.Build.VERSION.RELEASE; // 獲取手機版本
而後用正則表達式來匹配,例如匹配samsung4.2.2的系統以下:
1 Pattern patternsam = Pattern.compile(".*[G][T].*[4][.][2].*"); // 匹配sam422 2 Matcher matcherSam = patternsam.matcher(model + version); 3 boolean isSam422 = matcherSam.matches();
以此類推,能夠獲得boolean類型變量isHtc422,isos43。因而將這些值用一個全局靜態變量來表示,方便項目在用到藍牙的地方作判斷。
1 if(isHtc422){ 2 ConstantsHelp.PhoneVersion=1; //Htc422 3 }else if(isSam422){ 4 ConstantsHelp.PhoneVersion=2; //Sam422 5 }else if(isos43){ 6 ConstantsHelp.PhoneVersion=3; //os43 7 }else { 8 ConstantsHelp.PhoneVersion=0; //No match 9 }
二、根據系統版本進入不一樣的Activity操做藍牙
在作完系統匹配後,延遲自動進入藍牙操做的界面
1 new Handler().postDelayed(new Runnable() { 2 @Override 3 public void run() { 4 switch (ConstantsHelp.PhoneVersion) { 5 case 1: 6 Intent intent1 = new Intent(MainActivity.this,MainActivity_os422_htc.class); 7 startActivity(intent1); 8 finish(); 9 break; 10 case 2: 11 Intent intent2 = new Intent(MainActivity.this,MainActivity_os422_sam.class); 12 startActivity(intent2); 13 finish(); 14 break; 15 case 3: 16 Intent intent3 = new Intent(MainActivity.this,MainActivity_os43.class); 17 startActivity(intent3); 18 finish(); 19 break; 20 case 0: 21 Toast.makeText(getApplicationContext(), "The app is not supported in your phone", Toast.LENGTH_LONG).show(); 22 finish(); 23 break; 24 default: 25 break; 26 } 27 } 28 }, 50);
MainActivity_os422_htc,MainActivity_os422_sam,MainActivity_os43一樣要在AndroidManifest中註冊,還有相應的Service。
4、主程序的初始化
一、界面初始化
MainActivity_os422_htc,MainActivity_os422_sam,MainActivity_os43雖然是不一樣的Activity,但它們的界面是同樣的,即setContentView(R.layout.activity_main)裏面的View是同樣的。
二、藍牙的初始化
因爲是在不一樣的Activity中,htc422不會進入sam422的Activity,因此相互之間不會有影響,藍牙的初始化和操做能夠跟寫單獨的版本的Project是同樣的。
因爲本人水平有限,歡迎你們給予指導,如要轉載,請註明出處
http://www.cnblogs.com/myulong/p/3595338.html