Android藍牙4.0 版本兼容性問題

在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

String

MODEL

The end-user-visible name for the end product.

sdk版本 Build.VERSION.SDK

String

SDK

This constant is deprecated. Use SDK_INT to easily get this as an integer.

frimware版本號(系統版本號) Build.VERSION.RELEASE

String

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
相關文章
相關標籤/搜索