2012-05-16 60 views
0

我試圖記錄音頻,之後應立即播放記錄。我哪裏出錯了。請幫助我。我沒有得到。顯示空指針異常......Android:java.lang.RuntimeException:無法實例化活動ComponentInfo:java.lang.NullPointerException

下面是代碼

import android.app.Activity; 
import android.media.AudioFormat; 
import android.media.AudioManager; 
import android.media.AudioRecord; 
import android.media.AudioTrack; 
import android.media.MediaRecorder; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.Button; 
import android.widget.LinearLayout; 

public class Audio_testActivity extends Activity { 
private String LOG_TAG = null; 

/* variables which are required to generate and manage the UI of the App */ 
// private RecordButton mRecordButton = null; 
private Button recordBtn, stopBtn, playBtn; 

/* 
* variables which are required for the actual functioning of the recording 
* and playing 
*/ 
private AudioRecord recorder = null; 
private AudioTrack player = null; 
private AudioManager audioManager = null; 
private int recorderBufSize, recordingSampleRate; 
private int trackBufSize; 
private short[] audioData; 
private boolean isRecording = false, isPlaying = false; 
private Thread startRecThread; 

private AudioRecord.OnRecordPositionUpdateListener posUpdateListener; 

/** 
* constructor method for initializing the variables 
*/ 
public Audio_testActivity() { 
    super(); 
    LOG_TAG = "Constructor"; 
    recorderBufSize = recordingSampleRate = trackBufSize = 0; 

    // init function will initialize all the necessary variables ... 
    init(); 

    if (recorder != null && player != null) { 
     Log.e(LOG_TAG, "recorder and player initialized"); 
     audioData = new short[recorderBufSize/2]; // since we r reading 
                // shorts 

    } else { 
     Log.e(LOG_TAG, "Problem inside init function "); 
    } 
    posUpdateListener = new AudioRecord.OnRecordPositionUpdateListener() { 
     int numShortsRead = 0; 

     @Override 
     public void onPeriodicNotification(AudioRecord rec) { 
      // TODO Auto-generated method stub 
      // String LOG_TAG = Thread.currentThread().getName(); 
      // Log.e(LOG_TAG, "inside position listener"); 
      audioData = new short[recorderBufSize/2]; // divide by 2 since 
                 // now we are 
                 // reading shorts 
      numShortsRead = rec.read(audioData, 0, audioData.length); 
      player.write(audioData, 0, numShortsRead); 

     } 

     @Override 
     public void onMarkerReached(AudioRecord recorder) { 
      // TODO Auto-generated method stub 
      Log.e(LOG_TAG, "Marker Reached"); 
     } 
    }; 
    // listener will be called every time 160 frames are reached 
    recorder.setPositionNotificationPeriod(160); 
    recorder.setRecordPositionUpdateListener(posUpdateListener); 

    Log.e(LOG_TAG, "inside constructor"); 
} 

private void init() { 
    LOG_TAG = "initFunc"; 
    // int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 }; 
    short audioFormat = AudioFormat.ENCODING_PCM_16BIT; 
    // for (int rate : mSampleRates) { 
    this.recordingSampleRate = AudioTrack 
      .getNativeOutputSampleRate(AudioManager.STREAM_MUSIC); 
    try { 
     // Log.d(LOG_TAG, "Attempting rate " + rate + "Hz, bits: " + 
     // audioFormat); 
     int bufrSize = AudioRecord.getMinBufferSize(
       this.recordingSampleRate, AudioFormat.CHANNEL_IN_MONO, 
       audioFormat); 

     // lets find out the minimum required size for AudioTrack 
     int audioTrackBufSize = AudioTrack.getMinBufferSize(
       this.recordingSampleRate, AudioFormat.CHANNEL_OUT_MONO, 
       audioFormat); 

     if (bufrSize != AudioRecord.ERROR_BAD_VALUE 
       && bufrSize != AudioRecord.ERROR) { 
      // check if we can instantiate and have a success 
      if (audioTrackBufSize >= bufrSize) { 
       this.recorderBufSize = audioTrackBufSize; 
      } else { 
       this.recorderBufSize = bufrSize; 
      } 

      AudioRecord rec = new AudioRecord(
        MediaRecorder.AudioSource.DEFAULT, 
        this.recordingSampleRate, AudioFormat.CHANNEL_IN_MONO, 
        audioFormat, this.recorderBufSize); 

      if (rec != null 
        && rec.getState() == AudioRecord.STATE_INITIALIZED) { 

       // storing variables for future use . . . 
       // this.recordingSampleRate = rate; 
       // this.recorderBufSize = bufrSize; 

       Log.e(LOG_TAG, 
         "Returning..(rate:channelConfig:audioFormat:recorderBufSize)" 
           + this.recordingSampleRate + ":" 
           + AudioFormat.CHANNEL_IN_MONO + ":" 
           + audioFormat + ":" + this.recorderBufSize); 

       // Now create an instance of the AudioTrack 
       // int audioTrackBufSize = AudioTrack.getMinBufferSize(rate, 
       // AudioFormat.CHANNEL_OUT_MONO, audioFormat); 

       Log.e(LOG_TAG, "Audio Record/Track/Final buf size :" 
         + bufrSize + "/ " + audioTrackBufSize + "/ " 
         + this.recorderBufSize); 

       this.player = new AudioTrack(AudioManager.STREAM_MUSIC, 
         this.recordingSampleRate, 
         AudioFormat.CHANNEL_OUT_MONO, audioFormat, 
         this.recorderBufSize, AudioTrack.MODE_STREAM); 

       this.recorder = rec; 
       this.player.stop(); 
       this.player.flush(); 
       this.player.setPlaybackRate(this.recordingSampleRate); 
       return; 
      } 
     } 
    } catch (IllegalArgumentException e) { 
     Log.d(LOG_TAG, 
       this.recordingSampleRate + "Exception, keep trying.", e); 
    } catch (Exception e) { 
     Log.e(LOG_TAG, this.recordingSampleRate + "Some Exception!!", e); 
    } 
    // for loop for channel config ended here. . . . 
    // for loop for audioFormat ended here. . . 
    // }// for loop for sampleRate 
    return; 
} 

private void startPlaying() { 
    LOG_TAG = "startPlaying"; 

    Log.e(LOG_TAG, "start Playing"); 
} 

private void stopPlaying() { 
    LOG_TAG = "stopPlaying"; 

    Log.e(LOG_TAG, "stop Playing"); 
} 

private void startRecording() { 
    LOG_TAG = "startRecording"; 

    /* start a separate recording thread from here . . . */ 
    startRecThread = new Thread() { 
     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      android.os.Process 
        .setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO); 
      // String LOG_TAG = Thread.currentThread().getName(); 
      if (recorder.getRecordingState() != AudioRecord.RECORDSTATE_RECORDING) { 
       recorder.startRecording(); 
      } 
      // Log.e(LOG_TAG, "running" +recorder.getRecordingState()); 
      while (recorder.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) { 
       recorder.read(audioData, 0, audioData.length); 
       try { 

        Thread.sleep(1000); // sleep for 2s 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        Log.e("run Method", "recorder thread is interrupted"); 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 
    setVolumeControlStream(AudioManager.STREAM_MUSIC); 
    audioManager.setSpeakerphoneOn(false); 
    player.flush(); 
    player.play(); 
    startRecThread.start(); 

    Log.e(LOG_TAG, "start Recording"); 
} 

private void stopRecording() { 
    LOG_TAG = "stopRecording"; 
    recorder.stop(); 

    if (startRecThread != null && startRecThread.isAlive()) { 
     startRecThread.destroy(); 
     startRecThread = null; 
    } 

    player.stop(); 
    player.flush(); 
    Log.e(LOG_TAG, "stop Recording"); 
} 

private void stop() { 
    if (isRecording) { 
     isRecording = false; 
     stopRecording(); 
    } 
    if (isPlaying) { 
     isPlaying = false; 
     stopPlaying(); 
    } 
    recordBtn.setEnabled(true); 
    playBtn.setEnabled(true); 
} 

@Override 
public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    LOG_TAG = "onCreate"; 
    // Log.e(LOG_TAG, "Create Called"); 
    // getting the audio service 
    audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); 
    LinearLayout ll = new LinearLayout(this); 

    // creating Buttons one by one . . . . 
    // button to start the recording process 
    recordBtn = new Button(this); 
    recordBtn.setText("Record"); 
    recordBtn.setOnClickListener(new OnClickListener() { 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      recordBtn.setEnabled(false); 
      playBtn.setEnabled(false); 
      isRecording = true; 
      startRecording(); 
     } 
    }); 
    // single button to stop recording and playing as applicable 
    stopBtn = new Button(this); 
    stopBtn.setText("Stop"); 
    stopBtn.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      stop(); 
     } 
    }); 
    // button to play the recorded sound 
    playBtn = new Button(this); 
    playBtn.setText("Play"); 
    playBtn.setOnClickListener(new OnClickListener() { 

     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      // reverse the isPlaying 
      isPlaying = true; 
      recordBtn.setEnabled(false); 
      playBtn.setEnabled(false); 
      startPlaying(); 
     } 
    }); 

    ll.addView(recordBtn, new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT, 1)); 

    ll.addView(playBtn, new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT, 1)); 

    ll.addView(stopBtn, new LinearLayout.LayoutParams(
      ViewGroup.LayoutParams.WRAP_CONTENT, 
      ViewGroup.LayoutParams.WRAP_CONTENT, 1)); 

    setContentView(ll); 
} 

@Override 
protected void onDestroy() { 
    // Clean up code . .. 
    super.onDestroy(); 
    if (recorder != null) 
     recorder.release(); 
    if (startRecThread != null && startRecThread.isAlive()) 
     startRecThread.destroy(); 
    if (recorder != null) 
     recorder.release(); 
    if (player != null) 
     player.release(); 
    startRecThread = null; 
    recorder = null; 
    player = null; 
    recordBtn = null; 
    stopBtn = null; 
    playBtn = null; 
    audioData = null; 
    System.gc(); 
} 

} 

以下是錯誤的logcat文件.....

05-17 09:53:01.402: E/AndroidRuntime(367): FATAL EXCEPTION: main 
05-17 09:53:01.402: E/AndroidRuntime(367): java.lang.NullPointerException 
05-17 09:53:01.402: E/AndroidRuntime(367): at audio.xxx.com.Audio_testActivity.startRecording(Audio_testActivity.java:232) 
05-17 09:53:01.402: E/AndroidRuntime(367): at audio.xxx.com.Audio_testActivity.access$9(Audio_testActivity.java:194) 
05-17 09:53:01.402: E/AndroidRuntime(367): at audio.xxx.com.Audio_testActivity$3.onClick(Audio_testActivity.java:291) 
05-17 09:53:01.402: E/AndroidRuntime(367): at android.view.View.performClick(View.java:2485) 
05-17 09:53:01.402: E/AndroidRuntime(367): at android.view.View$PerformClick.run(View.java:9080) 
05-17 09:53:01.402: E/AndroidRuntime(367): at android.os.Handler.handleCallback(Handler.java:587) 
05-17 09:53:01.402: E/AndroidRuntime(367): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-17 09:53:01.402: E/AndroidRuntime(367): at android.os.Looper.loop(Looper.java:123) 
05-17 09:53:01.402: E/AndroidRuntime(367): at android.app.ActivityThread.main(ActivityThread.java:3683) 
05-17 09:53:01.402: E/AndroidRuntime(367): at java.lang.reflect.Method.invokeNative(Native Method) 
05-17 09:53:01.402: E/AndroidRuntime(367): at java.lang.reflect.Method.invoke(Method.java:507) 
05-17 09:53:01.402: E/AndroidRuntime(367): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
05-17 09:53:01.402: E/AndroidRuntime(367): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
05-17 09:53:01.402: E/AndroidRuntime(367): at dalvik.system.NativeStart.main(Native Method) 

讓我知道我錯了..幫助我請。!!!!!!!!!

+2

Audio_testActivity.java中的第81行? –

+0

請讓我們知道Audio_testActivity.java中的第81號,因爲您的文件中缺少import語句,所以我們無法得到它。 –

+0

@DheereshSingh - 更新與IMPORT ..請讓我知道解決方案。謝謝 –

回答

2

如果你正在和你的代碼

if (recorder != null && player != null) { 
     Log.e(LOG_TAG, "recorder and player initialized"); 
     audioData = new short[recorderBufSize/2]; // since we r reading 
                // shorts 

    } else { 
     Log.e(LOG_TAG, "Problem inside init function "); 
    } 

記錄的「初始化函數內部問題」可以爲空。請檢查。

+0

好吧我會檢查並讓你知道..謝謝 –

+0

相同的錯誤..同樣的問題.. :( –

+0

這個日誌「初始化函數裏面的問題」即將到來嗎? –

相關問題