2016-03-03 5 views
0

Я пытаюсь создать приложение, которое должно сначала записать голос пользователя, а затем рассчитать разные вещи (например, спектр) из записанного файла. Я не могу воспроизвести записанный файл (я не могу найти этот файл - он даже записывается?). Вот мой код:Запись голоса пользователя андроида

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 = ..., он создает новую переменную с областью действия внутри этого метода. Вы не используете переменную class MediaPlayer. Попробуйте изменить

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

в

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

Это сработало! Спасибо огромное! :) –

Смежные вопросы