【问题标题】:Why is the callback always null?为什么回调总是为空?
【发布时间】:2019-10-16 16:49:40
【问题描述】:

我想在录制时(在 AsyncTask 中)获取音频缓冲区,并在视图打开时将其可视化,但是,如果这是正确的方法,我不是。在下面的实现中,回调始终为空,不知道哪里出错了。

这是活动片段:

public class MainPageFragment extends Fragment implements Observer {

    private AudioRecordingDbmHandler visualizerHandler;
    private GLAudioVisualizationView visualizerView;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater,
                             @Nullable ViewGroup container,
                             @Nullable Bundle savedInstanceState) {

        ViewGroup rootView = (ViewGroup) inflater.inflate(
                R.layout.fragment_main_page, container, false);

        visualizerView = new GLAudioVisualizationView.Builder(getContext())

        rootView.setBackgroundColor(Util.getDarkerColor(color));
        rootView.addView(visualizerView, 0);

        return rootView;
    }


    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        audioRecord = new AudioRecord();
        visualizerHandler = new AudioRecordingDbmHandler();
        audioRecord.callback(visualizerHandler);
        audioRecord.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
        visualizerView.linkTo(visualizerHandler);

    }

    public static class AudioRecordingDbmHandler extends DbmHandler<byte[]> implements AudioRecord.RecordingCallback {
        @Override
        protected void onDataReceivedImpl(byte[] bytes, int layersCount, float[] dBmArray, float[] ampsArray) {...}

        public void stop() {
            calmDownAndStopRendering();
        }

        @Override
        public void onDataReady(byte[] data) {
            onDataReceived(data);
        }
    }

}

这是录音:

public class AudioRecord extends AsyncTask <Void, double[], Void> {

    public interface RecordingCallback {
        void onDataReady(byte[] data);
    }

    private RecordingCallback recordingCallback = null;

    public AudioRecord callback(RecordingCallback recordingCallback) {
        this.recordingCallback = recordingCallback;
        return this;
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO);
        ...
        byteBuffer = new byte[bufferSize];
        ...
        record.startRecording();

        while (true) {

            bytesRead = record.read(byteBuffer, 0, bufferSize);

            try {
                if (recordingCallback != null) {
                    recordingCallback.onDataReady(byteBuffer);       
                }
            } finally {
                recordingBufferLock.unlock();
            }
        }
        record.stop();
        record.release();
        return null;
    }
}

还尝试使用导致相同问题的 onProgressUpdate。很高兴能在这里得到一些帮助。

【问题讨论】:

  • 图片不完整。 DbmHandler 实现 AudioRecord.RecordingCallback 了吗?
  • 是的,您可以将代码向右滚动,如果不清楚,请见谅
  • 这部分? implements DetectionMode.RecordingCallback.此回调与 AudioRecord.RecordingCallback 不同。正在编译吗?
  • 对不起,我在发帖时犯了一些错误,应该是implements AudioRecord.RecordingCallback。是的,它符合要求,只是回调始终为空

标签: android android-asynctask audiorecord continuous


【解决方案1】:

改变这个:

public AudioRecord callback(RecordingCallback recordingCallback) {
    this.recordingCallback = recordingCallback;
    return this;
}

到这里:

public void setCallback(RecordingCallback recordingCallback) {
    this.recordingCallback = recordingCallback;
}

我不确定它是否会起作用,但是由于您像 setter 一样使用回调方法,因此您不需要返回 this。

如果对您没有帮助,请随意投反对票:)

【讨论】:

    猜你喜欢
    • 2019-12-05
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多