用于音频捕获和回放的Google Glass应用程序

时间:2014-08-13 21:06:50

标签: google-glass audio-recording

我正在为谷歌眼镜开发一个应用程序,其中我希望录制和音频并播放它有一定的延迟。为此,我正在使用AudioRecord类。

问题是,只要在玻璃上打开应用程序,它就会进入布局页面并退出。 我似乎不明白这个问题。

在Android Manifest中是否需要为音频捕获和播放添加任何特定权限?

以下是我的代码:

package com.example.audio;

import android.app.Activity;
import android.media.AudioFormat;
import android.media.AudioManager;
import android.media.AudioRecord;
import android.media.AudioTrack;
import android.media.MediaRecorder;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class ha2 extends Activity{

    private static final String TAG = "MainActivity";
    private AsyncTask lpt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate");
        setContentView(R.layout.activity_main_audio);

        if (null == lpt || lpt.isCancelled()) {
            lpt = new   ListenPlayTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        }
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        if(lpt != null)
            lpt.cancel(true);
        Log.d(TAG, "onDestroy");
        super.onDestroy();
    }


    private class ListenPlayTask extends AsyncTask{

        @Override
        protected Object doInBackground(Object... params) {
            // TODO Auto-generated method stub

            Log.d(TAG,"ListenPlayTask - doInBackground");

            boolean isRecording=true;
            android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO);
            int bufferSize = AudioRecord.getMinBufferSize(11025,    AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT);
            AudioRecord arec = new AudioRecord(MediaRecorder.AudioSource.MIC,11025,AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT,bufferSize);
            AudioTrack atrack = new AudioTrack(AudioManager.STREAM_VOICE_CALL,11025,AudioFormat.CHANNEL_OUT_MONO,AudioFormat.ENCODING_PCM_16BIT,bufferSize,AudioTrack.MODE_STATIC);
            atrack.setPlaybackRate(11025);
            byte[] buffer = new byte[bufferSize];
            arec.startRecording();
            atrack.setStereoVolume(AudioTrack.getMaxVolume(), AudioTrack.getMaxVolume());
            atrack.play();

            while(isRecording){
                arec.read(buffer,0,bufferSize);
                atrack.write(buffer, 0, buffer.length);
                if( isCancelled())
                    break;                          
            }

            Log.d(TAG,"Task Cancelled");
            arec.stop();
            atrack.stop();
            return null;
        }

    }

1 个答案:

答案 0 :(得分:0)

屏幕关闭会关闭活动的问题是什么?如果是这种情况,则应将android:immersive="true"添加到清单中声明的​​<activity>。这可确保当屏幕重新开启时,您将返回到您的活动(请参阅https://developers.google.com/glass/develop/gdk/immersions)。

如果存在导致活动强行关闭的权限问题,您应该能够在logcat中看到打印出的消息。

还要确保getMinBufferSize不返回ERROR_BAD_VALUE。如果返回ERROR_BAD_VALUE,那么您正在尝试分配一个负数大小的数组,这会导致崩溃。 logcat也应该能够指出这是否是问题。