Android蓝牙4.0 版本兼容性问题

在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

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         }

 

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


posted @ 2014-03-11 23:32  偶若成风  阅读(6961)  评论(0编辑  收藏  举报