我正在为谷歌眼镜开发一个应用程序,其中我希望录制和音频并播放它有一定的延迟。为此,我正在使用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;
}
}
答案 0 :(得分:0)
屏幕关闭会关闭活动的问题是什么?如果是这种情况,则应将android:immersive="true"
添加到清单中声明的<activity>
。这可确保当屏幕重新开启时,您将返回到您的活动(请参阅https://developers.google.com/glass/develop/gdk/immersions)。
如果存在导致活动强行关闭的权限问题,您应该能够在logcat中看到打印出的消息。
还要确保getMinBufferSize不返回ERROR_BAD_VALUE。如果返回ERROR_BAD_VALUE,那么您正在尝试分配一个负数大小的数组,这会导致崩溃。 logcat也应该能够指出这是否是问题。