2016-03-31 13 views
1

私はチューナーアプリを持っていて、リスニングマイク用にAudio Recordオブジェクトを使用しています。私はそれがほとんどのデバイスとアンドロイドバージョン(もAndroid 6)のために正常に動作することを理解したいが、私はサムスンS7携帯電話で顧客からのエラー報告を受けた。私はこのエラーを避けるためにここに同様の投稿を見て、それは私の多くを助けた。しかし、今私は他のAndroid 6デバイスで正常に動作している間S7携帯電話だけがこのエラーを与える理由を理解できません。startRecording()がSamsung S7 Phoneの初期化されていないAudioRecordで呼び出されました

P.S.私は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) 
+0

関連コードを投稿してください。そんなあなたの質問に答えることはできません。 –

+0

ねえ、私はコードを追加しました。 – uguboz

+0

logcat出力も投稿してください。 –

答えて

0

最後に、私はそれがS7の携帯電話上でのみクラッシュだけでなく、いくつかの他のAndroid 6.0デバイスされていないことに気づきました。そして私は、私が新しいランタイムアクセス許可の設計を処理することを忘れてしまった私のばかげた間違いが、マシュマロに現れたことに気付きました。これは私がいくつかの他のAndroid 6.0デバイスで動いているのを混乱させる。私はそれらが既にデバイス設定から私のアプリに許可されているものだと思います。

私はMarshmallow用のアプリケーション内で実行時のアクセス許可を実装しました。

+0

これにはどのアクセス許可がありますか?私たちもこの同じ問題を抱えています! – Jeremy

+0

私の場合はRECORD_AUDIOですが、問題はAndroid 6.0以降のデバイスの実行時アクセス許可を実装していないことです – uguboz

関連する問題