面试时被老医生干,问哪些问题能试出一个 Android 应用开发者真正的水平

百度百家--Android程序员
关注Android最佳实践
汤涛,海豚浏览器Android开发,国内最专注Android开发的自媒体人, 为大家提供Android相关的新人成长、技术前沿、经验分享、最佳实践、最好用的工具服务、开源项目等内容。
最近常逛知乎,本文来自我关于《面试时,问哪些问题能试出一个Android应用开发者真正的水平?》的回答。
没有了,亲!
百度新闻客户端
百度新闻客户端
扫描二维码下载
订阅 "百家" 频道
观看更多百家精彩新闻5923人阅读
Android(19)
条形码扫码枪现在随处可见,可以很迅速地扫描出条形码内容,比什么手机相机扫码快了不是一点两点。
为了节约成本,扫码枪可以直接通过蓝牙连接android或其他设备。
那么android设备如何通过蓝牙获取扫描内容的呢?
1. 蓝牙配对,连接设备
打开系统设置,找到蓝牙,打开扫码枪,配对扫码枪设备。输入一个固定的配对码,一般扫码枪说明书里都有写。配对完成后,显示设备已连接。就ok。
2.AndroidManifest中配置权限
android项目中的AndroidManifest.xml文件添加蓝牙权限。
android:name="android.permission.BLUETOOTH" /&
android:name="android.permission.BLUETOOTH_ADMIN" /&
3.检测扫码枪的连接状态
通常来说,扫码枪设备也相当于普通外接输入设备类型,外接键盘。
我这款扫码枪设备返回的是如下蓝牙类型。
BluetoothClass.Device.Major.PERIPHERAL
一般而言,通过如下这种方式就可以获得到我们扫码枪设备的信息。
Set&BluetoothDevice& blueDevices = mBluetoothAdapter.getBondedDevices()
if (blueDevices == null || blueDevices.size() &= 0) {
return false
for (Iterator&BluetoothDevice& iterator = blueDevices.iterator()
BluetoothDevice bluetoothDevice = iterator.next()
if (bluetoothDevice.getBluetoothClass().getMajorDeviceClass() == BluetoothClass.Device.Major.PERIPHERAL) {
//TODO 获取扫码枪设备信息
开发过程中,必然会需要实时判断设备是否正常连接。
mBluetoothAdapter.getBondedDevices()
这个方法仅仅只能够判断设备是否已配对绑定。但是绑定不代表连接,所以只能放弃。
public List getConnectedDevices (int profile)
public int getConnectionState (BluetoothDevice device, int profile)
接着又尝试了这两个方法,方法是可用,但是必须要求设备sdk&18,即android 4.3版本以上才可用。
后来转头一想,既然扫码枪也是输入设备,我们可以不同蓝牙设备状态检测入手,改为从输入设备检测入手。于是,
private void hasScanGun() {
Configuration cfg = getResources().getConfiguration();
return cfg.keyboard != Configuration.KEYBOARD_NOKEYS;
4.获取扫码枪扫描内容
扫描枪,既然是一个外接输入设备,那么很自然的,我们就从KeyEvent入手。
事件解析类
* 扫码枪事件解析类
public class ScanGunKeyEventHelper {
private final static long MESSAGE_DELAY = 500;
private StringBuffer mStringBufferResult = new StringBuffer();
private boolean mC
private OnScanSuccessListener mOnScanSuccessL
private Handler mHandler = new Handler();
private final Runnable mScanningFishedRunnable = new Runnable() {
public void run() {
performScanSuccess();
private void performScanSuccess() {
String barcode = mStringBufferResult.toString();
if (mOnScanSuccessListener != null)
mOnScanSuccessListener.onScanSuccess(barcode);
mStringBufferResult.setLength(0);
public void analysisKeyEvent(KeyEvent event) {
int keyCode = event.getKeyCode();
checkLetterStatus(event);
if (event.getAction() == KeyEvent.ACTION_DOWN) {
char aChar = getInputCode(event);;
if (aChar != 0) {
mStringBufferResult.append(aChar);
if (keyCode == KeyEvent.KEYCODE_ENTER) {
mHandler.removeCallbacks(mScanningFishedRunnable);
mHandler.post(mScanningFishedRunnable);
mHandler.removeCallbacks(mScanningFishedRunnable);
mHandler.postDelayed(mScanningFishedRunnable, MESSAGE_DELAY);
private void checkLetterStatus(KeyEvent event) {
int keyCode = event.getKeyCode();
if (keyCode == KeyEvent.KEYCODE_SHIFT_RIGHT || keyCode == KeyEvent.KEYCODE_SHIFT_LEFT) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
mCaps = true;
mCaps = false;
private char getInputCode(KeyEvent event) {
int keyCode = event.getKeyCode();
if (keyCode &= KeyEvent.KEYCODE_A && keyCode &= KeyEvent.KEYCODE_Z) {
aChar = (char) ((mCaps ? 'A' : 'a') + keyCode - KeyEvent.KEYCODE_A);
} else if (keyCode &= KeyEvent.KEYCODE_0 && keyCode &= KeyEvent.KEYCODE_9) {
aChar = (char) ('0' + keyCode - KeyEvent.KEYCODE_0);
switch (keyCode) {
case KeyEvent.KEYCODE_PERIOD:
aChar = '.';
case KeyEvent.KEYCODE_MINUS:
aChar = mCaps ? '_' : '-';
case KeyEvent.KEYCODE_SLASH:
aChar = '/';
case KeyEvent.KEYCODE_BACKSLASH:
aChar = mCaps ? '|' : '\\';
aChar = 0;
public interface OnScanSuccessListener {
public void onScanSuccess(String barcode);
public void setOnBarCodeCatchListener(OnScanSuccessListener onScanSuccessListener) {
mOnScanSuccessListener = onScanSuccessL
public void onDestroy() {
mHandler.removeCallbacks(mScanningFishedRunnable);
mOnScanSuccessListener = null;
Activity中重写dispatchKeyEvent方法,截取Key事件。
* Activity截获按键事件.发给ScanGunKeyEventHelper
public boolean dispatchKeyEvent(KeyEvent event) {
if (isScanGunEvent(event)) {
mScanGunKeyEventHelper.analysisKeyEvent(event);
return true;
return super.dispatchKeyEvent(event);
* 显示扫描内容
* barcode 条形码
public void onScanSuccess(String barcode) {
详细代码参看:
1.部分机型无法判断外接键盘信息,如三星。
private void hasScanGun() {
Configuration cfg = getResources().getConfiguration();
return cfg.keyboard != Configuration.KEYBOARD_NOKEYS;
三星手机cfg.keyboard返回值等于Configuration.KEYBOARD_NOKEYS。
因此为了更好的兼容,可以采用如下方法,
* 判断是否已经连接扫码枪
protected boolean hasScanGun() {
Set&BluetoothDevice& blueDevices = mBluetoothAdapter.getBondedDevices();
if (blueDevices == null || blueDevices.size() &= 0) {
return false;
for (Iterator&BluetoothDevice& iterator = blueDevices.iterator(); iterator.hasNext(); ) {
BluetoothDevice bluetoothDevice = iterator.next();
if (bluetoothDevice.getBluetoothClass().getMajorDeviceClass() == BluetoothClass.Device.Major.PERIPHERAL) {
return isInputDeviceUsed(bluetoothDevice.getName());
return false;
private boolean isInputDeviceUsed(String deviceName) {
int[] deviceIds = InputDevice.getDeviceIds();
for (int id : deviceIds) {
if (InputDevice.getDevice(id).getName().equals(deviceName)) {
return true;
return false;
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:36166次
排名:千里之外
原创:26篇
评论:10条
(1)(1)(3)(4)(5)(3)(4)(9)(2)(1)}

我要回帖

更多关于 面试时自我介绍 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信