2024年ble兼容Android 4 进行的部分优化(2),Android面试知识点梳理

分享读者

作者2013年java转到Android开发,在小厂待过,也去过华为,OPPO等大厂待过,18年四月份进了阿里一直到现在。

被人面试过,也面试过很多人。深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长,而且极易碰到天花板技术停滞不前!

我们整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,阿里,华为,小米,等一线互联网公司主流架构技术。

腾讯T3架构师学习专题资料

如果你觉得自己学习效率低,缺乏正确的指导,可以一起学习交流!

我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • Characteristic 特性。Characteristic可以理解为一个数据类型,它包括1个value和0至多个Descriptor

  • Descriptor 对Characteristic的描述,例如范围、计量单位等,一个Descriptor包含一个Value

其中Service、Characteristic、Descriptor,这三部分是BLE的核心,都由UUID作为唯一标示符。一般来说,Characteristic是手机与BLE终端交换数据的关键,Characteristic有较多的跟权限相关的字段,例如PERMISSION和PROPERTY,而其中最常用的是PROPERTY。

2.   BLE编程


1.      权限配置

由于android4.3及以上才支持BLE,因此需指定编译版本为targetSdkVersion大于等于18。并且需要在AndroidManifest.xml文件中配置如下所示的权限

[html] view plain copy

print ?

  1. uses-permissionandroid:nameuses-permissionandroid:name\=“android.permission.BLUETOOTH”/

  2. uses-permissionandroid:nameuses-permissionandroid:name\=“android.permission.BLUETOOTH\_ADMIN”/

uses-permissionandroid:name=“android.permission.BLUETOOTH”/

uses-permissionandroid:name=“android.permission.BLUETOOTH_ADMIN”/

2.      编程步骤

1.获取BluetoothManager服务及BluetoothAdapter实例

BluetoothManager是系统管理蓝牙的一种服务,获取了BluetoothManager我们就可以通过其getAdapter()获取蓝牙适配器了。

[java] view plain copy

print ?

  1. //1.获取蓝牙管理服务及BluetoothAdapter实例

  2. mBluetoothManager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);

  3. mBluetoothAdapter = mBluetoothManager.getAdapter();

  4. if (mBluetoothAdapter == null){

  5. return;

  6. }

//1.获取蓝牙管理服务及BluetoothAdapter实例

mBluetoothManager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);

mBluetoothAdapter = mBluetoothManager.getAdapter();

if (mBluetoothAdapter == null){

return;

}

2.打开蓝牙

接下来调用BluetoothAdapter的isEnabled()判断蓝牙是否打开,未打开我们可以发送一个action为BluetoothAdapter.ACTION_REQUEST_ENABLE的intent来打开蓝牙。

[java] view plain copy

print ?

  1. //2. 判断蓝牙是否打开,没有打开就打开

  2. if (!mBluetoothAdapter.isEnabled()){

  3. Intent intent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

  4. startActivityForResult(intent,REQUEST_ENABLE_BT);

  5. }

//2. 判断蓝牙是否打开,没有打开就打开

if (!mBluetoothAdapter.isEnabled()){

Intent intent = newIntent(BluetoothAdapter.ACTION_REQUEST_ENABLE);

startActivityForResult(intent,REQUEST_ENABLE_BT);

}

这时界面上回弹出一个对话框提示我们打开蓝牙,打开成功后会回调Activity的onActivityResult(int requestCode, int resultCode, Intent data)方法,我们可以在里面提示一些信息。比如提示蓝牙已经打开等。

[java] view plain copy

print ?

  1. @Override

  2. protected void onActivityResult(int requestCode, int resultCode, Intentdata) {

  3. super.onActivityResult(requestCode, resultCode, data);

  4. if (resultCode != RESULT_OK){

  5. return;

  6. }

  7. if (requestCode == REQUEST_ENABLE_BT){

  8. Toast.makeText(this,“蓝牙已开启”,Toast.LENGTH_LONG).show();

  9. }

  10. }

@Override

protected void onActivityResult(int requestCode, int resultCode, Intentdata) {

super.onActivityResult(requestCode, resultCode, data);

if (resultCode != RESULT_OK){

return;

}

if (requestCode == REQUEST_ENABLE_BT){

Toast.makeText(this,“蓝牙已开启”,Toast.LENGTH_LONG).show();

}

}

3.扫描周围的BLE蓝牙设备

扫描BLE蓝牙设备,对于4.3以上的系统,直接调用startLeScan(BluetoothAdapter.LeScanCallbackcallback)即可扫描出BLE设备,在callback中会回调。但是对于5.0以上的系统,android添加了新的API,原有的startLeScan(BluetoothAdapter.LeScanCallback callback)已经被废弃,在5.0以上的系统中是使用BluetoothLeScanner的startScan(ScanCallbackcallback),回调也是ScanCallback了。

[java] view plain copy

print ?

  1. /**

  2. * 扫描Bluetooth LE

  3. * @param enable

  4. */

  5. private void scanBleDevice(boolean enable){

  6. //android 5.0 以前

  7. if (Build.VERSION.SDK_INT < 21){

  8. if (enable){

  9. mHandler.postDelayed(new Runnable() {

  10. @Override

  11. public void run() {

  12. mScaning = false;

  13. mBluetoothAdapter.stopLeScan(mLeScanCallback);

  14. }

  15. },SCAN_SECOND);

  16. mScaning = true;

  17. mBluetoothAdapter.startLeScan(mLeScanCallback);

  18. } else {

  19. mScaning = false;

  20. mBluetoothAdapter.stopLeScan(mLeScanCallback);

  21. }

  22. } else {

  23. scanner = mBluetoothAdapter.getBluetoothLeScanner();

  24. scanner.startScan(mScanCallback);

  25. mHandler.postDelayed(new Runnable() {

  26. @Override

  27. public void run() {

  28. scanner.stopScan(mScanCallback);

  29. }

  30. },SCAN_SECOND);

  31. }

  32. }

/**

  • 扫描Bluetooth LE

  • @param enable

*/

private void scanBleDevice(boolean enable){

//android 5.0 以前

if (Build.VERSION.SDK_INT < 21){

if (enable){

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

mScaning = false;

mBluetoothAdapter.stopLeScan(mLeScanCallback);

}

},SCAN_SECOND);

mScaning = true;

mBluetoothAdapter.startLeScan(mLeScanCallback);

} else {

mScaning = false;

mBluetoothAdapter.stopLeScan(mLeScanCallback);

}

} else {

scanner = mBluetoothAdapter.getBluetoothLeScanner();

scanner.startScan(mScanCallback);

mHandler.postDelayed(new Runnable() {

@Override

public void run() {

scanner.stopScan(mScanCallback);

}

},SCAN_SECOND);

}

}

扫描的回调如下:

[java] view plain copy

print ?

  1. //sacn扫描回调 5.0以上用

  2. private ScanCallback mScanCallback = new ScanCallback() {

  3. @Override

  4. public void onScanResult(int callbackType, ScanResult result) {

  5. BluetoothDevice device =result.getDevice();

  6. if (device != null){

  7. //过滤掉其他设备

  8. if (device.getName() != null&& device.getName().startsWith(“WINPOS”)){

  9. BLEDevice bleDevice = newBLEDevice(device.getName(),device.getAddress());

  10. if(!mBLEDeviceList.contains(bleDevice)){

  11. mBLEDeviceList.add(bleDevice);

  12. showBluetoothLeDevice(bleDevice);

  13. }

  14. }

  15. }

  16. }

  17. @Override

  18. public void onBatchScanResults(List results) {

  19. Log.d(TAG,”onBatchScanResults”);

  20. }

  21. @Override

  22. public void onScanFailed(int errorCode) {

  23. Log.d(TAG,”onScanFailed”);

  24. }

  25. };

  26. //4.3以上

  27. private BluetoothAdapter.LeScanCallback mLeScanCallback = newBluetoothAdapter.LeScanCallback() {

  28. @Override

  29. public void onLeScan(final BluetoothDevice bluetoothDevice, int i,byte[] bytes) {

  30. if (bluetoothDevice != null){

  31. //过滤掉其他设备

  32. if (bluetoothDevice.getName()!= null && bluetoothDevice.getName().startsWith(“WINPOS”)){

  33. BLEDevice bleDevice = newBLEDevice(bluetoothDevice.getName(),bluetoothDevice.getAddress());

  34. if(!mBLEDeviceList.contains(bleDevice)){

  35. mBLEDeviceList.add(bleDevice);

  36. showBluetoothLeDevice(bleDevice);

  37. }

  38. }

  39. }

  40. }

  41. };

//sacn扫描回调 5.0以上用

private ScanCallback mScanCallback = new ScanCallback() {

@Override

public void onScanResult(int callbackType, ScanResult result) {

BluetoothDevice device =result.getDevice();

if (device != null){

//过滤掉其他设备

if (device.getName() != null&& device.getName().startsWith(“WINPOS”)){

BLEDevice bleDevice = newBLEDevice(device.getName(),device.getAddress());

if(!mBLEDeviceList.contains(bleDevice)){

mBLEDeviceList.add(bleDevice);

showBluetoothLeDevice(bleDevice);

}

}

}

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

mBLEDeviceList.add(bleDevice);

showBluetoothLeDevice(bleDevice);

}

}

}

尾声

一转眼时间真的过的飞快。我们各奔东西,也各自踏上了自己的旅途,但是即使多年不见,也因为这份情谊我们依旧如从前那般“亲密”。不忘初心方得始终。加油吧,程序员们,在我看来35岁,40岁从来不是危机,只要永远不要忘记自己为何踏上征程!

为了让更多在学习中或者最近要准备面试的朋友们看到这篇文章,希望你们能多多评论,点赞+转发!

再次感谢所有给我提供过题目的朋友们,感谢一路有你!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值