前言:最近买了一个小米蓝牙自拍杆去泰山玩儿,用了好好的,突然想看下蓝牙自拍杆原理是什么,百度学习了一下。
1. 蓝牙自拍杆原理
说蓝牙自拍杆原理之前,先科普一下相机拍照的快捷键,音量键作为快捷键是可以设置功能的,比如小米mix2 是可以作为快门、变焦和音量的,如下图所示。这里强调一点,使用蓝牙自拍杆,必须将音量键功能设为快门,这个菜单是和蓝牙自拍杆的拍照功能相对应的。
然后,蓝牙自拍杆其实就是用的音量键作为快门快捷键的特性才产生作用的。比如如果不在拍照界面,点击蓝牙拍照按钮,会把调节音量的进度条调出来。这可以证明蓝牙自拍杆是操作音量键起到效果的。
2. 原理的代码层面分析
第一部分主要从使用角度上分析了蓝牙自拍杆的原理,第二部分再从代码层面上验证或者证明一下。
我写了一个小的demo
package com.example.demo_47_bluetoothzipaigan;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.KeyEvent;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "jiatai";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
Log.d(TAG, "onKeyDown : "+ keyCode);
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:
Log.d(TAG, "KeyEvent.KEYCODE_VOLUME_UP");
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:
Log.d(TAG, "KeyEvent.KEYCODE_VOLUME_DOWN");
return true;
default:
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
//Log.d(TAG, "onKeyUp", new RuntimeException());
Log.d(TAG, "onKeyUp : "+ keyCode);
return super.onKeyUp(keyCode, event);
}
}
这个demo很简单,主要就是监控手机按键的事件下发,看下点击蓝牙自拍杆的拍照按钮后的log打印
而66和24这两个event对应的分别是enter键和音量上键
/** Key code constant: Volume Up key.
* Adjusts the speaker volume up. */
public static final int KEYCODE_VOLUME_UP = 24;
/** Key code constant: Enter key. */
public static final int KEYCODE_ENTER = 66;
从蓝牙界面也可以看出自拍杆其实是作为一个键盘来对待的,这个键盘的按键下发其实就是下发enter key和volume up key,volume up key等效于用户手点音量上键。相机的onKeyUp接收到对应事件进行相应设置的逻辑处理,一般是快门,也就是拍照。
3. 总结
蓝牙自拍杆简单来说功能等效于手动按下音量上键,它们在原理上都是下发了volume up的event给相机进行处理,相机接收到这个event就按照相机的音量键设置来实现对应的功能。所以我们想要蓝牙自拍杆起拍照的作用,必须将音量键设为快门的快捷键。