在android 4.3以下的SDK中,由於各個廠商都是單獨做的SDK,基本上開發出來的APP都互相不兼容,如何在android4.3以下及以上版本中做到兼容,將是以下要講到的內容。
以samsung 4.2.2,htc4.2.2(htc的4.2.2和4.1.2是用一個jar的)和android4.3為例。
一、需要引用的包
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" />
二、添加用戶權限
Project需要藍牙的使用權限,故需要添加uses-permission
1 <uses-permission android:name="android.permission.BLUETOOTH" /> 2 <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
htc4.2.2(包括4.1.2),需要在application節點內添加
1 <uses-library 2 android:name="com.htc.android.bluetooth.le" 3 android:required="false" />
android4.3及以上,需要添加
1 <uses-feature 2 android:name="android.hardware.bluetooth_le" 3 android:required="true" />
三、應用程序的初始化
由於項目需要做兼容性開發,故工程的結構盡量做到離散化,降低耦合性,方便以后的升級和功能擴展。
在進入工程時,MainActivity需要做以下事情:
1、 系統版本的識別
根據官方的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 }
2、根據系統版本進入不同的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。
四、主程序的初始化
1、界面初始化
MainActivity_os422_htc,MainActivity_os422_sam,MainActivity_os43雖然是不同的Activity,但它們的界面是一樣的,即setContentView(R.layout.activity_main)里面的View是一樣的。
2、藍牙的初始化
由於是在不同的Activity中,htc422不會進入sam422的Activity,所以相互之間不會有影響,藍牙的初始化和操作可以跟寫單獨的版本的Project是一樣的。
由於本人水平有限,歡迎大家給予指導,如要轉載,請注明出處
http://www.cnblogs.com/myulong/p/3595338.html