【问题标题】:startRecording() called on an uninitialized AudioRecord on Samsung S7 PhonesstartRecording() 在三星 S7 手机上调用未初始化的 AudioRecord
【发布时间】:2016-03-31 21:50:45
【问题描述】:

我有一个调谐器应用程序并使用 Audio Record 对象来收听麦克风。我想了解它适用于大多数设备和 Android 版本(甚至是 Android 6),但我收到了三星 S7 手机客户的错误报告。我在这里查看了类似的帖子以避免此错误,这对我有很大帮助。但现在我不明白为什么只有 S7 手机在其他 Android 6 设备上正常工作时会出现此错误。

附:我没有 S7 手机,所以我没有机会尝试一些东西。我只是想知道是否有人有类似的问题以及 S7 手机可能有什么问题。有什么想法吗?

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

        initAudioRecord(44100, 2048);
        .....

    }

    public void initAudioRecord(int sampleRateInHz, int bufferSizeInBytes) {

            AudioRecord audioRecord = AudioRecordInstance(sampleRateInHz, bufferSizeInBytes);


            if (audioRecord.getState() != AudioRecord.STATE_UNINITIALIZED) {
                if (audioRecord.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) {
                    audioRecord.stop();
                }
                audioRecord.release();
                audioRecord = AudioRecordInstance(sampleRateInHz, bufferSizeInBytes); 

            }

            audioRecord.startRecording();     

    }

    public AudioRecord AudioRecordInstance(int sampleRateInHz, int bufferSizeInBytes){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
            return new AudioRecord.Builder()
                    .setAudioSource(MediaRecorder.AudioSource.MIC)
                    .setAudioFormat(new AudioFormat.Builder()
                            .setEncoding(AudioFormat.ENCODING_PCM_16BIT)
                            .setSampleRate(sampleRateInHz)
                            .setChannelMask(AudioFormat.CHANNEL_IN_MONO)
                            .build())
                    .setBufferSizeInBytes(2*bufferSizeInBytes)
                    .build();
        }else{
            return new AudioRecord(
                    MediaRecorder.AudioSource.MIC,
                    sampleRateInHz,
                    AudioFormat.CHANNEL_IN_MONO,
                    AudioFormat.ENCODING_PCM_16BIT,
                    bufferSizeInBytes * 2);
        }
    }
}

LogCat:

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tuner/com.tuner.TunerActivity}: java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
    at android.app.ActivityThread.access$1100(ActivityThread.java:221)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:158)
    at android.app.ActivityThread.main(ActivityThread.java:7224)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

【问题讨论】:

  • 请贴出相关代码。不能这样回答你的问题。
  • 嘿,我添加了代码。
  • 请也发布 logcat 输出。

标签: android android-studio audiorecord tuner


【解决方案1】:

最后我注意到它不仅在 S7 手机上崩溃,而且在其他一些 Android 6.0 设备上也崩溃。我意识到我的愚蠢错误是我忘了处理新的运行时权限设计带来了棉花糖。这让我感到困惑,它正在其他一些 Android 6.0 设备上运行。我猜那些是已经从设备设置中为我的应用授予权限的那些。

所以我在我的应用程序中为 Marshmallow 实现了运行时权限,现在它可以工作了。

【讨论】:

  • 您在哪些权限下注意到这一点?我们也遇到了同样的问题!
  • RECORD_AUDIO 在我的情况下,但问题在于没有为 Android 6.0+ 设备实现运行时权限
猜你喜欢
  • 2018-09-14
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 2011-06-18
  • 1970-01-01
相关资源
最近更新 更多