2011-02-28 16 views
13

हेज शुरू नहीं होगा, मैं वर्तमान में ऑडियो रिकॉर्ड करने के लिए ऑडियो रिकॉर्ड करने की कोशिश कर रहा हूं। क्योंकि मुझे इसे एक बड़ी परियोजना में चाहिए। लेकिन ऐसा लगता है कि बहुत गड़बड़ है। मैं बहुत सारी चीजों की कोशिश कर रहा हूं, इसलिए जब मैंने इस बग का पता लगाया तो मैं मूलभूत स्थिति में वापस गया। मैं अपने सैमसंग गैलेक्सी एस का उपयोग अपने डीबगडेविस के रूप में कर रहा हूं।एंड्रॉइड ऑडियो रिकॉर्ड - दूसरी बार

मेरी समस्या यह है कि, मेरे डिवाइस के रीबूट के बाद पहली बार मैं बिना ऑडियो समस्याओं के ऑडियोरकोर्ड ऑब्जेक्ट को प्रारंभ कर सकता हूं। लेकिन दूसरी बार जब मैं इसे चलाता हूं, तो यह ऑडियो रिकॉर्डॉर्ड ऑब्जेक्ट को प्रारंभ नहीं करेगा। मैंने कई आवृत्तियों की कोशिश की है, fyi।

यहाँ मेरी कोड है:।

package android.audiorecordtest; 

import android.app.Activity; 
import android.media.AudioFormat; 
import android.media.AudioRecord; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 

public class AudioRecordTest extends Activity { 

    int frequency; 
    AudioRecord audRec; 
    TextView txtVw; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     txtVw = (TextView) findViewById(R.id.txtVw); 


     frequency=8000; 
     int bufferSize=(AudioRecord.getMinBufferSize(frequency, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT))*2; 
     if (bufferSize>0) { 
      audRec = new AudioRecord(MediaRecorder.AudioSource.MIC, frequency, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); 
       int status = audRec.getState(); 
     if (status == AudioRecord.STATE_INITIALIZED) { 
      txtVw.setText("Initialized" + frequency); 
     } else { 
      txtVw.setText("Not Initialized i=" + frequency); 
     } 
     } 

मैं इस घटना

02-28 10:46:37.048: DEBUG/dalvikvm(4477): GC_EXPLICIT freed 1801 objects/98944 bytes in 97ms 
02-28 10:46:37.048: VERBOSE/AudioRecord(4477): stop 

"AudioRecord पर देशी पकड़ जारी करने के लिए लगता है कौन सा पाया logcat जानकारी के माध्यम से देख के कुछ ही घंटों के बाद तो मैंने अपने Audiorecord object.release() के साथ अंतिम रूप देने के ओवरराइड करने का प्रयास किया। हालांकि यह काम नहीं किया .. किसी को भी कोई विचार है?

+0

मैं वास्तव में,, सोच रहा हूँ क्यों कोई भी कोई जवाब नहीं है ऐसा इसलिए है क्योंकि आप लोग समस्या को पुन: नहीं कर सकते या मदद करने के लिए, क्योंकि लोग परेशान नहीं किया जा सकता है, या: इस प्रकार आप इसका इस्तेमाल कर सकते हैं ? –

+0

आप में से उन लोगों के लिए इस पर ठोकर खाई, सुनिश्चित करें कि आपके पास रिकॉर्ड अनुमति है! – NateS

+1

@NateS अगर आपके पास रिकॉर्ड अनुमति नहीं है तो यह पहली बार प्रारंभ नहीं होगा क्योंकि मेरा प्रश्न शीर्षक स्पष्ट रूप से बताता है :) लेकिन हाँ अगर किसी को केवल पहले प्रारंभिक प्रयास के साथ समस्या है तो उन्हें AndroidManifest.xml –

उत्तर

11

मैं आपकी समस्या (सैमसंग फोन पर) को पुन: उत्पन्न करने में सक्षम था। मैं एक OnDestroy() विधि रिकॉर्ड रिहा कहा:

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    System.out.println("OnDestroy"); 
    audRec.release(); 
} 

इस जोड़ने के बाद, audioRecord सही ढंग से हर बार गतिविधि शुरू होता है प्रारंभ करने में लगता है।

+1

+1 मेरे लिए, मुझे एक AsyncTask की 'ऑनकांस्ड()' विधि की आवश्यकता थी, लेकिन मुझे नहीं पता कि मैं इसके बिना इस मुद्दे के नीचे कैसे पहुंचा होगा। धन्यवाद। :) – Mikaveli

0

आपको टी को आजमाएं o संसाधन जारी करने के लिए audRec.stop() को कॉल करें।

+0

में उनकी अनुमतियां जांचनी चाहिए स्टॉप केवल चल रहे रिकॉर्डिंग को रोकने के लिए है। लेकिन रिलीज में कॉल स्टॉप करने का प्रयास भी है, हालांकि रिलीज संसाधन जारी कर रहा है, रुको नहीं। जहां तक ​​मैंने कक्षा के माध्यम से देखा है। अन्य धन्यवाद। –

1

अपने स्वयं के प्रश्न का उत्तर देने के लिए, ऑडियो रिकार्ड का उपयोग करने के लिए इसे एकमात्र तरीका मिला, यह कभी भी वैश्विक चर के रूप में नहीं है, यह नहीं पता कि क्यों, लेकिन ऐसा लगता है कि यह आपको उदाहरण के संसाधनों को छोड़ने नहीं देगा अगर आप ऐसा करते हैं तो सही तरीके से।

+0

आपको इसे जिस तरह से जॉर्डन ने किया था, उसे आजमाएं। मैं इसे भी पसंद करता हूं, और यह ठीक काम करता है ... – ThaMe90

+0

अब कार्यान्वयन नहीं है, लेकिन हाँ अगर उसने इसे पुन: उत्पन्न किया है, और इसे हल किया है, तो मैं उसे सही उत्तर देने के लिए पर्याप्त सुरक्षित हूं, इसे लाने के लिए धन्यवाद मेरा ध्यान। –

+0

मुझे यह कहना होगा कि रिलीज() को कॉल करने के बाद, इसे शून्य पर सेट करना शीर्ष पर थोड़ा सा है, जीसी को स्वचालित रूप से इसे आपके लिए साफ कर देना चाहिए, इसलिए आप इसे फिर से शुरू करने के लिए स्वतंत्र हैं। – ThaMe90

5

मुझे एक ही समस्या थी, आमतौर पर audRec.release() वास्तव में मदद करता है, लेकिन यदि आपको रोकने और कई बार शुरू करने की आवश्यकता है तो निम्न कोड अधिक मजबूत है। इसके अलावा, मुझे एक मुद्दा था कि रिकॉर्डिंग एक अलग थ्रेड में हुई थी और एंड्रॉइड कभी-कभी लंबे समय तक चलने पर धागे को मारता है। इसलिए इस कोड को देखो, यह सुनिश्चित रिकॉर्डिंग भी आयोजित किया जाता है अन्य धागा मर चुका है और निम्नलिखित audRec.start पर() यह बंद हो जाता है जब बनाता है और रिलीज:

import android.media.AudioFormat; 
import android.media.AudioRecord; 
import android.media.MediaRecorder; 

public class RecorderSingleton { 

    private static final int FREQUENCY = 16000; 

    public static RecorderSingleton instance = new RecorderSingleton(); 
    private AudioRecord recordInstance = null; 
    private int bufferSize; 

    private RecorderSingleton() { 
     bufferSize = AudioRecord.getMinBufferSize(FREQUENCY, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT); 
    } 

    public boolean init() { 
     recordInstance = new AudioRecord(MediaRecorder.AudioSource.MIC, FREQUENCY, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, bufferSize); 
     if (recordInstance.getState() == AudioRecord.STATE_UNINITIALIZED) { 
      return false; 
     } 
     return true; 
    } 

    public int getBufferSize() { 
     return bufferSize; 
    } 
    public boolean start() { 
     if (recordInstance != null && recordInstance.getState() != AudioRecord.STATE_UNINITIALIZED) { 
      if (recordInstance.getRecordingState() != AudioRecord.RECORDSTATE_STOPPED) { 
       recordInstance.stop(); 
      } 
      recordInstance.release(); 
     } 
     if (!init()) { 
      return false; 
     } 
     recordInstance.startRecording(); 
     return true; 
    } 

    public int read(short[] tempBuffer) { 
     if (recordInstance == null) { 
      return AudioRecord.ERROR_INVALID_OPERATION; 
     } 
     int ret = recordInstance.read(tempBuffer, 0, bufferSize); 
     return ret; 
    } 

    public void stop() { 
     if (recordInstance == null) { 
      return; 
     } 
     recordInstance.stop(); 
     recordInstance.release(); 
    } 
} 

तो अगर आप एक रिकॉर्डर धागा है

import android.media.AudioRecord; 

public class Recorder implements Runnable { 
    private int requiredSamples; 
    private int takenSamples = 0; 
    private boolean cancelled = false; 

    public void run() { 

     // We're important... 
     android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 

     int bufferRead = 0; 
     int bufferSize = RecorderSingleton.instance.getBufferSize(); 
     short[] tempBuffer = new short[bufferSize]; 
     if (!RecorderSingleton.instance.start()) { 
      return; 
     } 
     try { 
      Log.d(RoomieConstants.LOG_TAG, "Recorder Started"); 
      while (takenSamples < requiredSamples && !cancelled) { 
       bufferRead = RecorderSingleton.instance.read(tempBuffer); 
       if (bufferRead == AudioRecord.ERROR_INVALID_OPERATION) { 
        throw new IllegalStateException("read() returned AudioRecord.ERROR_INVALID_OPERATION"); 
       } else if (bufferRead == AudioRecord.ERROR_BAD_VALUE) { 
        throw new IllegalStateException("read() returned AudioRecord.ERROR_BAD_VALUE"); 
       } 
       takenSamples += bufferRead; 
       // do something with the samples ... 
       // ... 
       // ... 
      } 
     } finally { 
      // Close resources... 
      stop(); 
     } 
    } 

    public void stop() { 
     RecorderSingleton.instance.stop(); 
    } 

    public void cancel() { 
     cancelled = true; 
    } 
} 
+0

आप किस विशेष मूल्य को अपने विशेष मामले में आवश्यक हैं? – Josh

संबंधित मुद्दे