2012-02-05 21 views
5

Tôi có phương pháp cố gắng tạo một AudioRecord. Các điện thoại khác nhau hỗ trợ các mức giá mẫu khác nhau, cấu hình kênh và định dạng âm thanh. Vì vậy, phương pháp cố gắng tạo ra một AudioRecord cho mỗi người trong số họ và trả lại cái đầu tiên hoạt động.Câu lệnh "return" của tôi không hoạt động ngay cả khi không có các chi nhánh mã khác

private AudioRecord getAudioRecord() { 
    for (int rate: sampleRates) { 
     for (int audioFormat: audioFormats) { 
      for (int channelConfig: channelConfigs) { 
       String description = rate + "Hz, bits: " + audioFormat 
         + ", channel: " + channelConfig; 

       Log.d(TAG, "Trying: " + description); 

       int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); 
       if (bufferSize == AudioRecord.ERROR 
         || bufferSize == AudioRecord.ERROR_BAD_VALUE) { 
        Log.d(TAG, "Failed: This rate/channel config/format is not supported"); 
        continue; 
       } 

       AudioRecord recorder = new AudioRecord(AudioSource.MIC, rate, channelConfig, audioFormat, bufferSize); 
       if (recorder.getState() == AudioRecord.STATE_UNINITIALIZED) { 
        Log.d(TAG, "Failed: Recorder is uninitialized"); 
        continue; 
       } 

       Log.d(TAG, "Success: " + description); 
       return recorder; 
      } 
     } 
    } 

    Log.e(TAG, "Failed all rates. Does the device have a microphone?"); 
    return null; 
} 

Vấn đề là return recorder không bao giờ xảy ra!

Dưới đây là đầu ra của tôi logcat:

Logcat output

Trên dòng tô đậm (8000/3/12) không có lỗi, nhưng cũng không thành công.

Nếu tôi sử dụng số continue như đã nêu trong các nhận xét bên dưới, nó vẫn không trả lại!

private AudioRecord getAudioRecord() { 
    for (int rate: sampleRates) { 
     for (int audioFormat: audioFormats) { 
      for (int channelConfig: channelConfigs) { 
       String description = rate + "Hz, bits: " + audioFormat 
         + ", channel: " + channelConfig; 

       Log.d(TAG, "Trying (2): " + description); 

       int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); 
       if (bufferSize != AudioRecord.ERROR && bufferSize != AudioRecord.ERROR_BAD_VALUE) { 
        AudioRecord recorder = new AudioRecord(AudioSource.MIC, rate, channelConfig, audioFormat, bufferSize); 
        if (recorder.getState() == AudioRecord.STATE_INITIALIZED) { 
         Log.d(TAG, "Success: " + description); 
         return recorder; 
        } else { 
         Log.d(TAG, "Failed: Recorder is uninitialized"); 
        } 
       } else { 
        Log.d(TAG, "Failed: This rate/channel config/format is not supported"); 
       } 
      } 
     } 
    } 

    Log.e(TAG, "Failed all rates. Does the device have a microphone?"); 
    return null; 
} 
+1

Mẫu tương tự (nỗ lực đăng nhập không có thành công hoặc thất bại sau) cũng xảy ra 3 lần khác trong nhật ký. Nó gần như cảm thấy như một khối try/catch đang ăn một ngoại lệ (hoặc phát hành một tuyên bố tiếp tục im lặng). Mẫu mã bạn đã cung cấp * chính xác * những gì tạo nhật ký? –

+0

Điều này thực sự là lạ. Bạn đã thử nghiệm cho các điều kiện nghịch đảo và làm tổ của bạn nếu khối, và do đó không sử dụng 'tiếp tục'? –

+0

Giống như đề cập @SeanReilly, nó thực sự có vẻ như đây không phải là mã tạo ra đầu ra nhật ký. Hai thông báo 'Trying' trong một hàng hiện có vẻ như có thể trừ khi có một' break; 'hoặc' continue; 'bị thiếu trong danh sách mã của bạn. Bạn đã thử làm sạch và xây dựng lại ứng dụng của bạn để đảm bảo các lớp học được cập nhật? Habe bạn đã thử sử dụng trình gỡ rối và bước qua mã? – Gray

Trả lời

0

Quấn chức năng của bạn trong một khối try/catch và có thể bạn sẽ thấy rằng một cái gì đó đang gây ra một ngoại lệ được ném.

+1

Nếu một ngoại lệ đã được ném, nó sẽ đi lên đến ngăn xếp cuộc gọi cho đến khi nó bị bắt. Lặp lại sẽ dừng ngay lập tức. –

1

Không có vấn đề với câu lệnh return, bạn chỉ đơn giản là không bao giờ đạt được nó vì AudioRecord của bạn không bao giờ khởi (Hầu hết các ví dụ ra khỏi đó không kiểm tra xem nó, mặc dù họ có lẽ nên)

Là một sự tỉnh táo ngắn ngủi kiểm tra xem bạn có thể muốn kiểm tra tệp kê khai của bạn để verify you have the proper permissions để ghi lại âm thanh ngay từ đầu, cho rằng quyền truy cập vào micrô là tính năng phần cứng có thể/không tồn tại.