【问题标题】:Android Wear audioAndroid Wear 音频
【发布时间】:2015-07-18 00:09:42
【问题描述】:

我对 Android 还很陌生,但我了解开发和 Java 语言。 我继承了一个需要现在包含 android 可穿戴伴侣的应用程序。 我设法制作了简单的应用程序来启动,用手机应用程序来回发送消息。

我现在面临的问题是如何将音频从可穿戴麦克风传回应用程序进行处理。我设法制作了一个 4 秒的计时器来创建音频的缓冲区,我在这里的另一个问题上找到了它,但现在我被困住了如何将这些数据传递回应用程序,以及如何告诉应用程序处理这些数据和没有其他的。

我正在研究 MessageApi,但它太大而无法发送。 我在想也许是 ChannelApi,但我找不到任何如何使用它的信息。

任何建议都会有所帮助。

【问题讨论】:

    标签: android wear-os


    【解决方案1】:

    使用 ChannelApi 是正确的解决方案。您需要通过类似以下的代码打开从可穿戴应用到手机应用的通道:

    Wearable.ChannelApi.openChannel(
            mGoogleApiClient, node.getId(), "/mypath").setResultCallback(
            new ResultCallback<ChannelApi.OpenChannelResult>() {
                @Override
                public void onResult(ChannelApi.OpenChannelResult openChannelResult) {
                    if (openChannelResult.getStatus().isSuccess()) {
                        mChannel = openChannelResult.getChannel();
                        mChannel.getOutputStream(mGoogleApiClient).setResultCallback(
    
                                new ResultCallback<Channel.GetOutputStreamResult>() {
                                    @Override
                                    public void onResult(Channel.GetOutputStreamResult getOutputStreamResult) {
                                        if (getOutputStreamResult.getStatus().isSuccess()) {
                                            mOutputStream = getOutputStreamResult.getOutputStream();
                                        } else {
                                            // handle failure, and close channel
                                        }
                                    }
                                });
                    }
                }
            });
    

    然后,您可以在可穿戴设备端写入一个 OutputStream。在电话端,您可以通过Wearable.ChannelApi.addListener 添加ChannelApi.ChannelListener() 侦听器来收听频道开放。该接口有许多回调供您使用; onChannelOpened(Channel channel) 方法通知您一个通道已打开并传递给您一个通道对象,您可以从中获取一个 InputStream

    channel.getInputStream(mGoogleApiClient).setResultCallback(
            new ResultCallback<Channel.GetInputStreamResult>() {
                @Override
                public void onResult(Channel.GetInputStreamResult getInputStreamResult) {
                    if (getInputStreamResult.getStatus().isSuccess()) {
                        InputStream is = getInputStreamResult.getInputStream();
                    } else {
                        // handle errors
                    }
                }
            });
    

    该侦听器中还有许多其他方法可用于在通道关闭时通知您等(请参阅 JavaDocs)。现在您的可穿戴应用程序可以写入该通道,而手机应用程序将在通道的另一端接收字节。

    注意。 由于多个“节点”可能相互连接,因此最好使用CapabilityApis 来识别能够处理您的音频文件的节点,即您的手机.换句话说,您在手机端的应用将自己注册为能够处理您的音频流,然后您的可穿戴应用会在连接的节点中搜索提供该功能的节点,以定位它正在打开的通道。

    【讨论】:

    • 感谢 Ali,这正是我想要的。
    • 阿里再问你一个问题,如何将麦克风的音频添加到通道中?我有创建缓冲区的代码,byte[] buffer = new byte[minBufSize];录音机 = 新 AudioRecord(MediaRecorder.AudioSource.MIC,sampleRate,channelConfig,audioFormat,1024);录音机.startRecording(); while(status == true) { minBufSize = recorder.read(buffer, 0, buffer.length);这是从麦克风读取的正确方法,以及如何将此缓冲区添加到通道?
    • 一种方法是让一个线程从麦克风写入手表上的临时缓冲区,另一个线程读取该缓冲区并使用 ChannelApis 将其发送到手机。如果您不需要此过程接近实时,则可以将音频样本写入临时文件,然后将该文件发送到您的移动设备。
    • 发送传感器数据最好使用 Wea​​rable.MessageApi 方法 (sendMessage()),因为它的延迟最低且数据量不大。此外,请确保您不要过于频繁地尝试从穿戴设备上的传感器获取更新;这可以很快杀死电池; 50hz 的采样率太高了,我什至认为磨损上的陀螺仪不会尊重这个频率。
    • ChannelApi 有更高的延迟。如果这对您来说不是问题,您可以尝试看看这是否能满足您的需求。
    猜你喜欢
    • 2015-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多