2016-05-18 16 views
5

Jestem nowy w rozwoju Androida. Po prostu próbuję nagrać audio z Androidem Studio (2.1.1), testując urządzenie 6.0.1 Marshmallow.java.lang.RuntimeException: setAudioSource failed

public class MainActivity extends AppCompatActivity { 

    Button start, stop; 
    public MediaRecorder recorder = null; 
    public String fileextn = ".mp4"; 

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

     start = (Button) findViewById(R.id.start_button); 
     stop = (Button) findViewById(R.id.stop_button); 

     start.setOnClickListener(new View.OnClickListener(){ 

            @Override 
            public void onClick(View v) { 

             switch (v.getId()) { 
              case R.id.start_button: 
               startRecord(); 
              case R.id.stop_button: 
               stoprecord(); 
             } 
            } 

           } 
     ); 

    } 

    public void startRecord() { 
     recorder = new MediaRecorder(); 
     recorder.reset(); 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); 
     recorder.setOutputFile(getFilePath()); 

     try { 
      recorder.prepare(); 
      recorder.start(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void stoprecord() { 

     if (recorder != null) { 
      recorder.stop(); 
      recorder.reset(); 

      recorder.release(); 
      recorder = null; 
     } 

    } 


    private String getFilePath() { 

     String filepath = Environment.getExternalStorageDirectory().getPath(); 
     File file = new File(filepath, "MediaRecorderSample"); 

     if (!file.exists()) 
      file.mkdirs(); 

     return (file.getAbsolutePath() + "/" + fileextn); 
    } 


} 

Przy okazji dodałem uprawnienia do zastosowań w pliku manifext.xml.

To co ja dostać w Monitorze Android:

05-18 11:08:36.576 10414-10414/com.example.gk.audiocapture E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.example.gk.audiocapture, PID: 10414 
                     java.lang.RuntimeException: stop failed. 
                      at android.media.MediaRecorder.stop(Native Method) 
                      at com.example.gk.audiocapture.MainActivity.stoprecord(MainActivity.java:65) 
                      at com.example.gk.audiocapture.MainActivity$1.onClick(MainActivity.java:35) 
                      at android.view.View.performClick(View.java:5207) 
                      at android.view.View$PerformClick.run(View.java:21168) 
                      at android.os.Handler.handleCallback(Handler.java:746) 
                      at android.os.Handler.dispatchMessage(Handler.java:95) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5443) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 

Próbowałem kilku odpowiedzi, nie znaleźliśmy żadnego.

MY AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
     <manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.gk.audiocapture"> 
<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission> 
<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

+0

recorder.setAudioSource (MediaRecorder.AudioSource.MIC); –

+0

@NiravRanpara Próbowałem. Wciąż ten sam błąd. –

+0

umieścić wszystkie pozwolenie, które dałeś –

Odpowiedz

-2

Spróbuj this.Hope To pomaga

change 

recorder.setAudioSource(1); 

to 

recorder.setAudioSource(MediaRecorder.AudioSource.MIC); in your startRecord method. 
+0

Dzięki. Ale wydaje się, że to nie usuwa błędu. :/ –

1

tracisz kilka break w twoich case s:

case R.id.start_button: 
    startRecord(); 
    // You need to put a 'break;' here, or you'll fall through to the next case 
case R.id.stop_button: 
    stoprecord(); 
    // For the last case of a switch it might not matter, but it'd still be a good idea to put a 'break;' here as well 
+0

To jeden głupi błąd. Dzięki. Po poprawieniu tego, Po naciśnięciu przycisku nagrywania nic się nie dzieje. Brak nagrania w pliku. Ale plik jest tworzony bez żadnych nagrań. –

+0

Mój przystanek nie działa. Nie reaguje nawet po kliknięciu przycisku stop. –

0

wypróbować ten kod

@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.record_btn: 
      recordAudio(); 
      break; 
     case R.id.play_pause_btn: 
      playAudio(); 
      break; 
    } 
} 

private void playAudio() { 
    if (mPlaying) { 
     record_btn.setEnabled(false); 
     startPlaying(); 
     play_pause_btn.setText("Stop Playing"); 
     mPlaying = false; 
    } else { 
     stopPlaying(); 
     play_pause_btn.setText("Start Playing"); 
     mPlaying = true; 
     record_btn.setEnabled(true); 
    } 
} 

private void startPlaying() { 
    mAudioPlayer = new MediaPlayer(); 
    try { 
     mAudioPlayer.setDataSource(mFilename); 
     mAudioPlayer.prepare(); 
     updatingPlyingProgressBar(); 
     mAudioPlayer.start(); 
     showProgressforPlaying(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    mAudioPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 
     @Override 
     public void onCompletion(MediaPlayer mp) { 
      playAudio(); 
     } 
    }); 
} 

private void updatingPlyingProgressBar() { 
    long maxTime = mAudioPlayer.getDuration(); 
    int second = (int) maxTime/1000; 
    playing_audio_progressBar.setMax(second * 1000); 
    playing_audio_progressBar.setProgress(0); 
    playing_audio_max_time.setText(second > 9 ? "00:" + second : "00:0" + second); 
} 

private void stopPlaying() { 
    mAudioPlayer.stop(); 
    mAudioPlayer.release(); 
    mPlayingTimer.cancel(); 
    mAudioPlayer = null; 
} 

private void showProgressforPlaying() { 
    seconds = 0; 
    mPlayingTimer = new Timer(); 
    mPlayingTimer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      if (!mPlaying) { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         if (playing_audio_progressBar.getProgress() < mAudioPlayer.getDuration()) { 
          playing_audio_progressBar.setProgress(playing_audio_progressBar.getProgress() + 1000); 
          seconds++; 
          playing_audio_time.setText(seconds > 9 ? "00:" + seconds : "00:0" + seconds); 
         } else { 
          playAudio(); 
         } 
        } 
       }); 
      } 
     } 
    }, 1000, 1000); 
} 

private void recordAudio() { 
    if (mRecording) { 
     play_pause_btn.setEnabled(false); 
     mRecording = false; 
     audio_recording_progressBar.setMax(MAXTIME); 
     audio_recording_progressBar.setProgress(0); 
     startRecording(); 
     showProgressforRecording(); 
     record_btn.setText("Stop"); 

    } else { 
     stopRecording(); 
     record_btn.setText("Record"); 
     mRecording = true; 
     mRecordingtimer.cancel(); 
     play_pause_btn.setEnabled(true); 
    } 
} 

private void stopRecording() { 
    mAudioRecorder.stop(); 
    mAudioRecorder.release(); 
    mAudioRecorder = null; 

} 

private void startRecording() { 
    mAudioRecorder = new MediaRecorder(); 
    mFilename = Environment.getExternalStorageDirectory().getAbsolutePath() + "/AudioRecordDemo/" + "Audio" + System.currentTimeMillis() + ".3gp"; 

    mAudioRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
    mAudioRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
    mAudioRecorder.setOutputFile(mFilename); 
    mAudioRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
    try { 
     mAudioRecorder.prepare(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    mAudioRecorder.start(); 
} 

private void showProgressforRecording() { 
    seconds = 0; 
    mRecordingtimer = new Timer(); 
    mRecordingtimer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
      if (!mRecording) { 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         if (audio_recording_progressBar.getProgress() < MAXTIME) { 
          audio_recording_progressBar.setProgress(audio_recording_progressBar.getProgress() + 1000); 
          seconds++; 
          recorded_audio_time.setText(seconds > 9 ? "00:" + seconds : "00:0" + seconds); 
         } else { 
          recordAudio(); 
         } 
        } 
       }); 
      } 
     } 
    }, 1000, 1000); 
} 
+0

@Gokul Krishna usuń ukośnik z tego 'return (file.getAbsolutePath() +"/"+ fileextn) ;, to może działać – UserSharma

0

startRecording

public void startRecording(View view) throws IOException { 
     startButton.setEnabled(false); 
     stopButton.setEnabled(true); 
      //Creating file 
     File dir = Environment.getExternalStorageDirectory(); 
     try { 
     audiofile = File.createTempFile("sound", ".3gp", dir); 
     } catch (IOException e) { 
     Log.e(TAG, "external storage access error"); 
     return; 
     } 
      //Creating MediaRecorder and specifying audio source, output format, encoder & output format 
     recorder = new MediaRecorder(); 
     recorder.setAudioSource(MediaRecorder.AudioSource.MIC); 
     recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
     recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); 
     recorder.setOutputFile(audiofile.getAbsolutePath()); 
     recorder.prepare(); 
     recorder.start(); 
    } 

stopRecording

public void stopRecording(View view) { 
     startButton.setEnabled(true); 
     stopButton.setEnabled(false); 
      //stopping recorder 
     recorder.stop(); 
     recorder.release(); 
     //after stopping the recorder, create the sound file and add it to media library. 
     addRecordingToMediaLibrary(); 
    } 

AddtoLib

protected void addRecordingToMediaLibrary() { 
      //creating content values of size 4 
     ContentValues values = new ContentValues(4); 
     long current = System.currentTimeMillis(); 
     values.put(MediaStore.Audio.Media.TITLE, "audio" + audiofile.getName()); 
     values.put(MediaStore.Audio.Media.DATE_ADDED, (int) (current/1000)); 
     values.put(MediaStore.Audio.Media.MIME_TYPE, "audio/3gpp"); 
     values.put(MediaStore.Audio.Media.DATA, audiofile.getAbsolutePath()); 

      //creating content resolver and storing it in the external content uri 
     ContentResolver contentResolver = getContentResolver(); 
     Uri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     Uri newUri = contentResolver.insert(base, values); 

     //sending broadcast message to scan the media file so that it can be available 
     sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, newUri)); 
     Toast.makeText(this, "Added File " + newUri, Toast.LENGTH_LONG).show(); 
    } 
2

jestem zdezorientowany tytuł mówi java.lang.RuntimeException: setAudioSource failed i r ślad stosu mówi: java.lang.RuntimeException: stop failed.

Dla użytkownika java.lang.RuntimeException: setAudioSource failed może brakować uprawnienia do wykonywania zadań.

Musisz wziąć Manifest.permission.RECORD_AUDIO od użytkownika.

public void onRecordBtnClicked() { 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO) 
     != PackageManager.PERMISSION_GRANTED) { 
    ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.RECORD_AUDIO }, 
     10); 
    } else { 
    recordAudio(); 
    } 
} 

private void recordAudio() { 
    //Record Audio. 
} 

@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, 
    @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if (requestCode == 10) { 
    if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     recordAudio(); 
    }else{ 
     //User denied Permission. 
    } 
    } 
} 
+0

Czy to nie działa, jeśli umieściłem go w pliku androidmanifest.xml? Czy to coś innego? – ntgCleaner

+0

To zależy. Umieszczenie go w pliku manifestu nie będzie działać. będziesz musiał poprosić o pozwolenie od użytkownika w Runtime. –

+0

Ah, rozumiem. Wydaje się, że liczy się wersja Androida, – ntgCleaner

12

miałem dokładnie ten sam problem i udało się go naprawić, prosząc o zgodę na nagrywanie dźwięku:

     if (ActivityCompat.checkSelfPermission(activity(), Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) { 

         ActivityCompat.requestPermissions(activity(), new String[]{Manifest.permission.RECORD_AUDIO}, 
           BuildDev.RECORD_AUDIO); 

        } else { 
         startRecording(); 
        } 

gdzie

BuildDev.RECORD_AUDIO jest public static final int RECORD_AUDIO = 0;

+0

. Praca dla mnie Wielkie dzięki! –

+0

Awesome! świetne rozwiązanie –

+0

Tak, działało też dla mnie, zapomniałem dodać zezwolenia na dodanie dźwięku :( –

Powiązane problemy