मेरे पास एक तरीका है जो AudioRecord
बनाने का प्रयास करता है। विभिन्न फोन विभिन्न नमूना दर, चैनल विन्यास और ऑडियो प्रारूपों का समर्थन करते हैं। तो विधि उनमें से प्रत्येक के लिए AudioRecord
बनाने की कोशिश करती है और काम करने वाले पहले को वापस कर देती है।मेरा "रिटर्न" कथन तब भी काम नहीं कर रहा है जब कोई अन्य कोड शाखाएं नहीं हैं
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;
}
समस्या return recorder
कभी नहीं होता है!
प्रकाश डाला लाइन (8000/3/12) पर कोई त्रुटि है, लेकिन यह भी कोई सफलता:
यहाँ मेरी logcat उत्पादन होता है।
यदि मैं नीचे दी गई टिप्पणियों में कहा गया है कि continue
का उपयोग नहीं करता है, तो यह अभी भी वापस नहीं आता है!
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;
}
समान पैटर्न (निम्नलिखित सफलता या विफलता के बिना एक लॉग प्रयास) लॉग में 3 अन्य बार भी होता है। ऐसा लगता है कि एक कोशिश/पकड़ ब्लॉक एक अपवाद खा रहा है (या एक मूक जारी बयान जारी)। क्या कोड नमूना आपने प्रदान किया है * बिल्कुल * लॉग किसने उत्पन्न किया? –
यह वास्तव में अजीब है। क्या आपने उलटा परिस्थितियों के परीक्षण और अपने ब्लॉक को घोंसले करने की कोशिश की है, और इस प्रकार 'जारी रखें' का उपयोग नहीं किया है? –
@ सेनरेली का उल्लेख है, ऐसा लगता है कि यह वास्तव में ऐसा नहीं है जो लॉग आउटपुट उत्पन्न कर रहा है। एक पंक्ति में दो 'कोशिश करने वाले' संदेश अब तब तक संभव प्रतीत होते हैं जब तक कोई ब्रेक नहीं होता है, या 'जारी रखें;' जो आपकी कोड सूची से गुम है। क्या आपने कक्षाओं को अद्यतित करने के लिए अपने आवेदन की सफाई और पुनर्निर्माण की कोशिश की है? क्या आपने डीबगर का उपयोग करने और कोड के माध्यम से कदम उठाने का प्रयास किया है? – Gray