(四十七) 蓝牙自拍杆原理学习

前言:最近买了一个小米蓝牙自拍杆去泰山玩儿,用了好好的,突然想看下蓝牙自拍杆原理是什么,百度学习了一下。

 

demo: https://github.com/happyjiatai/demo_csdn/tree/master/demo_47_bluetoothzipaigan

 

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就按照相机的音量键设置来实现对应的功能。所以我们想要蓝牙自拍杆起拍照的作用,必须将音量键设为快门的快捷键。

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
前言: 之前DIY了无线语音控制(链接:https://www.cirmall.com/circuit/6200/detail?3),采用语音识别方式来控制灯泡灯的开关,总感觉实用价值不大,这回来个实用的——自拍器。 你是否也曾遇到这样的情况:三五好友想要来个合影,用手或自拍杆太短,定时拍摄又很难掌握时机,找人帮忙又太麻烦。那么现在使用无线的自拍器就完美解决了这个问题,当然市面上的蓝牙自拍器也能实现这样的功能,但我们用复杂的方法实现简单的功能,就是这么任性。 手机语音控制控制自拍器概述: 该无线语音自拍器基于SensorTile物联网开发套件来实现语音控制手机进行自拍。在语音识别的模式下,可以通过“拍照”口令打开自拍;通过“茄子”口令开启拍照并保存;通过“关闭”口令关闭相机。同时大幅提升了语音识别的速度。 如视频演示: 整体设计思路讲解: 整个工程的整体思路是通过讯飞在线语音识别功能识别SensorTile传输过来的音频数据,然后根据返回来的信息做出相应的回应,有了前面的铺垫,这次最大的难点就是相机功能的实现了,这里有两种思路,一种是调用系统自带的相机程序,另一种是完全自己写一个相机功能。 首先分析下调用系统自带的方法,毫无疑问调用系统自带的相机是最简单的方式,同时拍照的效果也是最好的,但是当我调用了系统函数打开了系统的相机后,却无法通过指令控制拍照,系统的相机功能本身属于一个独立的应用了,除非它有全局可用的拍照接口,否则无法在一个应用中直接控制另一个应用,很遗憾我没有找到相关函数,唯一有点靠谱的就是通过模拟按键中的拍照键来实现拍照,可是没有成功。 市面上的蓝牙自拍器的原理是将蓝牙设备识别成了一个音频设备,然后通过耳机的音量键来控制拍照,可是我们的SensorTile并不是一个音频设备,如果有哪位网友了解过蓝牙自拍杆,请不吝赐教。 调用系统相机的方案受打击后,便开始了第二种方案,自己设计一个相机应用,这里主要还是参考官网的教程,主要参考Camera和Camera API的介绍,我通过提炼教程中的方法写出了一篇日志“Android官方相机教程简单的Demo”可以参考,同时也参考官网给出的例程,不过官网的例程是使用的新类“camera2”,推陈出新嘛。 主要的步骤如下: 1. 新建一个相机功能文件CameraActivity.java,在manifest中将该类设置为横屏。 2. 使用Camera.open(1)函数获取相机的实例,其中参数1代表前置摄像头。 3. 使用SurfaceHolder.Callback方法建立一个可以预览图像的类CameraPreview。 4. 在主布局文件中放置一个FrameLayout用来存放预览图像。 5. 在onCreat中用addView来指定显示区域。 6. 使用getOutputMediaFile来指定保存路径与保存名字。 7. 使用mCamera.takePicture函数来拍照。 需要注意:在拍完照后会停止预览,需要调用mCamera.startPreview来重新开启预览。 此外,本次在语音识别速度上有提高,之前的语音识别到最后的控制之间时间过长,这个实际上是由于每次语音输入完之后,默认需要有一个1.8秒的停顿,才算一句话的结束,然后又由于默认是有标点的识别的,标点的识别是在整句话识别完后间隔一段时间然后才识别出来,这样也耗了些时间,因此在ASR的初始化中添加关闭标点显示同时将停顿时间设为零,代码如下: 结果证明可以大幅的提高语音识别的速度,在IAT中也将停顿时间设为零,但是保留标点符号的显示,同样也可以大幅的提高语音转写速度。 在程序的UI界面上也做了优化,灯泡自适应屏幕大小,同时对横屏和竖屏采取了两种不同的布局设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值