0

Я создаю приложение, которое записывает аудио, пока коснется и удерживается кнопка изображения. Я достиг этого с помощью следующего кода:Не удается воспроизвести записанный файл

public class MainActivity extends Activity { 

MediaRecorder recorder; 
MediaPlayer mediaPlayer; 

//STORAGE PATHS 
String storagePath; 
String externalStoragePath; 

//FULL OUTPUT PATHS 
String externalOutputPath; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    //AUDIO RECORDER 
    recorder = new MediaRecorder(); 
    recorder.reset();  
    recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 
    { 
     externalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     externalOutputPath = externalStoragePath + File.separator + "/Android/data/com.whizzappseasyvoicenotepad/test.mp3"; 
     recorder.setOutputFile(externalOutputPath); 
    } 
    else 
    { 
     storagePath = Environment.getDataDirectory().getAbsolutePath(); 
     recorder.setOutputFile(storagePath + "/Android/data/com.whizzappseasyvoicenotepad/test.mp3"); 
    } 

    //IMAGE BUTTON ONTOUCHLISTENER 
    final ImageButton recBtn = (ImageButton) findViewById(R.id.recButton); 
    recBtn.setOnTouchListener(new OnTouchListener(){ 

     @Override 
     public boolean onTouch(View v, MotionEvent event) { 

      if (event.getAction() == MotionEvent.ACTION_DOWN) 
      { 
       recBtn.setImageResource(R.drawable.record_btn_pressed); 
       try { 
        recorder.prepare(); 
        recorder.start(); 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 
      else if (event.getAction() == MotionEvent.ACTION_UP) 
      { 
       recBtn.setImageResource(R.drawable.record_btn); 
       try { 
        recorder.prepare(); 
        recorder.stop(); 
        recorder.reset(); 
        recorder.release(); 
        recorder = null; 
       } catch (IllegalStateException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       Log.i(STORAGE_SERVICE, "File saved to: " + externalStoragePath + "/Android/data/com.whizzappseasyvoicenotepad/test.3gp"); 
      } 
      return true; 
     } 

    }); 
} //END OF ONCREATE 

Теперь после того, как я прекратил запись, я искал mp3 файл в менеджере файлов (Android приложение) и пытался играть его музыкальный плеер, но он не работает. В нем говорится, что файл нельзя воспроизвести.

Я также попытался добавить кнопку «тестовое воспроизведение» в приложение, чтобы попытаться воспроизвести записанный файл с помощью MediaPlayer, но он тоже не работает. Как только я нажму кнопку воспроизведения, приложение выйдет из строя.

public void testPlay (View v) throws IllegalArgumentException, SecurityException, IllegalStateException, IOException{ 
    mediaPlayer = new MediaPlayer(); 
    mediaPlayer.setDataSource(externalOutputPath); 
    mediaPlayer.start(); 
} 

Да, я добавить андроида: OnClick = "testPlay" в файл XML

LogCat файл:

07-31 16:51:43.938: E/MediaPlayer(26918): Unable to to create media player 
07-31 16:51:43.953: E/AndroidRuntime(26918): FATAL EXCEPTION: main 
07-31 16:51:43.953: E/AndroidRuntime(26918): java.lang.IllegalStateException: Could not execute method of the activity 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.view.View$1.onClick(View.java:3633) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.view.View.performClick(View.java:4240) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.view.View$PerformClick.run(View.java:17721) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.os.Handler.handleCallback(Handler.java:730) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.os.Handler.dispatchMessage(Handler.java:92) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.os.Looper.loop(Looper.java:137) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.app.ActivityThread.main(ActivityThread.java:5103) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at java.lang.reflect.Method.invokeNative(Native Method) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at java.lang.reflect.Method.invoke(Method.java:525) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at dalvik.system.NativeStart.main(Native Method) 
07-31 16:51:43.953: E/AndroidRuntime(26918): Caused by: java.lang.reflect.InvocationTargetException 
07-31 16:51:43.953: E/AndroidRuntime(26918): at java.lang.reflect.Method.invokeNative(Native Method) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at java.lang.reflect.Method.invoke(Method.java:525) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.view.View$1.onClick(View.java:3628) 
07-31 16:51:43.953: E/AndroidRuntime(26918): ... 11 more 
07-31 16:51:43.953: E/AndroidRuntime(26918): Caused by: java.io.IOException: setDataSourceFD failed.: status=0x80000000 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.media.MediaPlayer.setDataSource(Native Method) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:981) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:960) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:918) 
07-31 16:51:43.953: E/AndroidRuntime(26918): at com.whizzappseasyvoicenotepad.MainActivity.testPlay(MainActivity.java:99) 
07-31 16:51:43.953: E/AndroidRuntime(26918): ... 14 more 

Права доступа:

<uses-permission android:name="android.permission.RECORD_AUDIO" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<uses-permission android:name="android.permission.STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
+1

Я не знаю, почему именно ваш файл не будет играть. Я просто хотел бы указать, что то, что вы создаете, это _not_ mp3-файл. Вы говорите рекордеру кодировать аудиоданные с помощью узкополосного кодека AMR и помещать его в контейнер 3GPP. Тот факт, что вы назвали файл «.mp3», не имеет значения. – Michael

+0

Я удалил .mp3, и он все равно не будет воспроизводить его. Спасибо, что сообщили мне об этом! – Guy

+1

Я не вижу никакого вызова 'mediaplayer.prepare' (или' prepareAsync'). – Michael

ответ

0

Я все еще не уверен, что была проблема, но я думаю, что было что-то не так с тем, как я остановил запись (в целом try, catch предмет). Я просто переписал весь код и поместил MediaRecorder в два разных метода. startRecording() и stopRecording(). И теперь он отлично работает!

startRecording()

public void startRecording(){ 
    recorder = new MediaRecorder(); 
    recorder.reset();  
    recorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
    recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) 
    { 
     externalStoragePath = Environment.getExternalStorageDirectory().getAbsolutePath(); 
     externalOutputPath = externalStoragePath + File.separator + "/Android/data/com.whizzappseasyvoicenotepad/test.mp3"; 
     recorder.setOutputFile(externalOutputPath); 
    } 
    else 
    { 
     storagePath = Environment.getDataDirectory().getAbsolutePath(); 
     recorder.setOutputFile(storagePath + "/Android/data/com.whizzappseasyvoicenotepad/test.mp3"); 
    } 
    recorder.setOnErrorListener(errorListener); 
    recorder.setOnInfoListener(infoListener); 

    try { 
     recorder.prepare(); 
     recorder.start(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

stopRecording()

public void stopRecording() { 
    if (null != recorder) { 
     recorder.stop(); 
     recorder.reset(); 
     recorder.release(); 

     recorder = null; 
    } 
} 
0
java.lang.IllegalStateException 

часто указывает, что в манифесте отсутствует разрешение. xml

+0

Я добавил разрешения на исходное сообщение, пожалуйста, скажите мне, считаете ли вы, что какое-либо разрешение отсутствует. – Guy

+0

https://developer.android.com/reference/android/Manifest.permission.html # READ_EXTERNAL_STORAGE – sschrass

+0

oops, это разрешение на самом деле не требуется, потому что «Любое приложение, объявляющее разрешение WRITE_EXTERNAL_STORAGE, неявно предоставлено это разрешение». – sschrass

0

Я использую класс AudioRecord и читаю поток в отдельном потоке и записываю файл, когда я иду.

Я надеюсь, что просто предоставив код, который я использую, вы можете решить свою проблему. Удачи.

In my Constructor: 
    bufferSize = AudioRecord.getMinBufferSize(mSampleRate, 
      mNbChannels, RECORDER_AUDIO_ENCODING); 

private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; 

public void start() 
{ 
    System.out.println("SoundRecorder JAVA: start"); 
    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, 
      mSampleRate, mNbChannels, 
      RECORDER_AUDIO_ENCODING, bufferSize); 

    recorder.startRecording(); 

    isRecording = true; 

    recordingThread = new Thread(new Runnable() 
    { 

     @Override 
     public void run() { 
      writeAudioDataToFile(); 
     } 
    }, "AudioRecorder Thread"); 

    recordingThread.start(); 
} 

private void writeAudioDataToFile() 
{ 
    byte data[] = new byte[bufferSize]; 
    String filename = mTempPath; 
    FileOutputStream os = null; 
    mRecordFile = new File(filename); 

    try { 
     os = new FileOutputStream(filename); 
    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    int read = 0; 

    if (null != os) 
    { 
     while (isRecording) 
     { 
      read = recorder.read(data, 0, bufferSize); 

      Log.i("SoundRecord", "read " + read + " bytes. Wrote In file: " + filename); 

      if (AudioRecord.ERROR_INVALID_OPERATION != read) { 
       try { 
        os.write(data); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 

     try { 
      os.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

public void stop() 
{ 
    if (null != recorder) 
    { 
     System.out.println("SoundRecorder JAVA: stop"); 
     isRecording = false; 

     recorder.stop(); 
     recorder.release(); 

     recorder = null; 
     recordingThread = null; 
    } 
} 
0

здесь образец кода для записи AMR-NB (метод OnClick)

ПРИМЕЧАНИЕ: Bitrate, SAMPLERATE, FilePath, fileTyp = 3gp

Если вы подготовить игрока к равным, что вы записали, то ваша ошибка IO должен уйти ...

 if (isRecording) return; 
     tmpFilNme = "me" +Calendar.getInstance().getTime().toString().hashCode(); 
     view.setKeepScreenOn(true); 
     File dir = Environment.getExternalStorageDirectory();   
     File appDir = new File(dir, "PictureComment"); 
     if (!appDir.exists()) appDir.mkdir(); 
     recordFilePath = new File(appDir, tmpFilNme +".3gp").getAbsolutePath(); 
     mRecorder = new MediaRecorder(); 
     mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 

     mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     mRecorder.setAudioEncodingBitRate(12200); 
     mRecorder.setAudioSamplingRate(8000); // this is the MIME rate 

     mRecorder.setOutputFile(recordFilePath); 
     try { 
      mRecorder.prepare(); 
      mRecorder.start(); 
      isRecording = true; 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
Смежные вопросы