2016-03-03 66 views
0

我正在嘗試製作一個應用程序,該應用程序應先記錄用戶的聲音,然後從錄製的文件中計算不同的事物(例如,頻譜)。我無法播放錄製的文件(我無法找到該文件 - 是否錄製?)。這裏是我的代碼:錄製用戶語音android

package com.example.annik.puhesovellus; 

import android.media.MediaPlayer; 
import android.media.MediaRecorder; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.Toolbar; 
import android.view.View; 
import java.io.File; 
import java.io.IOException; 


public class DisplayAanitysIkkuna extends AppCompatActivity { 
private String mFileName; 
private MediaRecorder mRecorder; 
private MediaPlayer mPlayer; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_display_aanitys_ikkuna); 
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); 
    fab.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) 
        .setAction("Action", null).show(); 
     } 
    }); 
    mFileName = Environment.getExternalStorageDirectory()+"/audiorecorder.3gpp"; 

} 
public void ButtonTapped(View view) { 
    switch(view.getId()) { 
     case R.id.start: 
      try { 
       beginRecording(); 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      break; 
     case R.id.stop: 
      try { 
       stopRecording(); 
      }catch(Exception e) { 
       e.printStackTrace(); 
      } 
      break; 
     case R.id.play: 
      try { 
       playRecording(); 
      }catch(Exception e) { 
       e.printStackTrace(); 
      } 
      break; 
     case R.id.stopPlaying: 
      try { 
       stopPlaying(); 
      }catch(Exception e) { 
       e.printStackTrace(); 
      } 
      break; 

    } 

} 

private void stopPlaying() { 
    mPlayer.release(); 
    mPlayer = null; 
} 

private void playRecording() throws Exception{ 
    ditchMediaPlayer(); 
    MediaPlayer mPlayer = MediaPlayer.create(this, Uri.parse(mFileName)); 
    mPlayer.start(); 

} 

private void ditchMediaPlayer() { 
    if(mPlayer != null) { 
     try { 
      mPlayer.release(); 
     }catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

private void beginRecording() throws IOException { 
    ditchMediaRecorder(); 
    File outFile = new File(mFileName); 

    if(outFile.exists()) { 
     outFile.delete(); 
    } 

    mRecorder = new MediaRecorder(); 
    mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    mRecorder.setOutputFile(mFileName); 
    mRecorder.prepare(); 
    mRecorder.start(); 
} 

private void ditchMediaRecorder() { 
    if(mRecorder != null) { 
     mRecorder.release(); 

    } 
} 

private void stopRecording() { 
    if(mRecorder != null) { 
     mRecorder.stop(); 
    } 

} 


} 

我知道縮進是不正確的,因爲我非常粘貼代碼...你有什麼想法,爲什麼這個代碼不工作?它給出了兩個錯誤:「應該有字幕控制器已經設置」,但我讀了,我不需要介意,「QCMediaPlayer媒體播放器不存在」,我讀到這意味着我的平臺不支持QCMediaPlayer ..? 這段代碼是否記錄了一個文件,它只是無法播放它,或者它無法記錄文件?我如何記錄用戶聲音並處理保存的文件?

回答

1

我認爲問題出在playRecording()。當您鍵入MediaPlayer mPlayer = ...時,它會在該方法內創建一個範圍爲新的變量。你沒有使用你的類MediaPlayer變量。嘗試改變

MediaPlayer mPlayer = MediaPlayer.create(this, Uri.parse(mFileName)); 

mPlayer = MediaPlayer.create(this, Uri.parse(mFileName)); 
+0

它的工作!非常感謝! :) –