Я пытаюсь разработать мероприятие, в котором пользователь может записывать и сохранять там аудио во внутреннем хранилище - PullRequest
0 голосов
/ 24 октября 2019

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

java.lang.RuntimeException: остановить не удалось. atroid.media.MediaRecorder.stop (собственный метод)

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

     private void audiorecordermethod(){
   if(checkPermission()){
       capturebutton.setOnTouchListener(new View.OnTouchListener() {
           @Override
           public boolean onTouch(View v, MotionEvent event) {
               if(event.getAction() == MotionEvent.ACTION_DOWN){
                   validateMicAvailability();
                   AudioSavePathInDevice =
                           Environment.getExternalStorageDirectory().getAbsolutePath() + "/Alpha/Voice/Send/" ;
                   File audiodir = new File(AudioSavePathInDevice);
                   if (!audiodir.exists()){
                       audiodir.mkdirs();
                   }
                   String filepath = audiodir + "/"+ CreateRandomAudioFileName(5) + ".3gp";
                   MediaRecorderReady(filepath);

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

                   return true;
               }else if(event.getAction() == MotionEvent.ACTION_UP){

                      mediaRecorder.stop();
                      mediaRecorder.release();

                   return true;
               }
               return false;
           }
       });
   }else{
       requestPermission();
   }
}

public void MediaRecorderReady(String filepath){
    mediaRecorder=new MediaRecorder();

        mediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
        mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        mediaRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB);
        mediaRecorder.setOutputFile(filepath);
        mediaRecorder.setAudioChannels(1);
        mediaRecorder.setAudioSamplingRate(8000);
        mediaRecorder.setAudioEncodingBitRate(44100);

}

public String CreateRandomAudioFileName(int string){
    StringBuilder stringBuilder = new StringBuilder( string );
    int i = 0 ;
    while(i < string ) {
        stringBuilder.append(RandomAudioFileName.
                charAt(random.nextInt(RandomAudioFileName.length())));

        i++ ;
    }
    return stringBuilder.toString();
}

private void requestPermission() {
    ActivityCompat.requestPermissions(personalChat.this, new
            String[]{WRITE_EXTERNAL_STORAGE, RECORD_AUDIO}, RequestPermissionCode);
}

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case RequestPermissionCode:
            if (grantResults.length> 0) {
                boolean StoragePermission = grantResults[0] ==
                        PackageManager.PERMISSION_GRANTED;
                boolean RecordPermission = grantResults[1] ==
                        PackageManager.PERMISSION_GRANTED;

                if (StoragePermission && RecordPermission) {
                    Toast.makeText(personalChat.this, "Permission Granted",
                            Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(personalChat.this,"Permission Denied",Toast.LENGTH_LONG).show();
                }
            }
            break;
    }
}

public boolean checkPermission() {
    int result = ContextCompat.checkSelfPermission(getApplicationContext(),
            WRITE_EXTERNAL_STORAGE);
    int result1 = ContextCompat.checkSelfPermission(getApplicationContext(),
            RECORD_AUDIO);
    return result == PackageManager.PERMISSION_GRANTED &&
            result1 == PackageManager.PERMISSION_GRANTED;
}

Logcat

 10-24 15:50:51.762 9687-9687/com.nanb.alpha E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.nanb.alpha, PID: 9687
java.lang.RuntimeException: stop failed.
    at android.media.MediaRecorder.stop(Native Method)
    at com.nanb.alpha.personalChat$7.onTouch(personalChat.java:312)
    at android.view.View.dispatchTouchEvent(View.java:8476)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2408)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2107)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2402)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1752)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2785)
    at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
    at androidx.appcompat.view.WindowCallbackWrapper.dispatchTouchEvent(WindowCallbackWrapper.java:69)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2363)
    at android.view.View.dispatchPointerEvent(View.java:8677)
    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4144)
    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:4010)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3565)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3618)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3584)
    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3701)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3592)
    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3758)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3565)
    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3618)
    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3584)
    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3592)
    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3565)
    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5828)
    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5802)
    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5773)
    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5918)
    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
    at android.os.MessageQueue.nativePollOnce(Native Method)
    at android.os.MessageQueue.next(MessageQueue.java:143)
    at android.os.Looper.loop(Looper.java:122)
    at android.app.ActivityThread.main(ActivityThread.java:5268)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:902)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:697)

1 Ответ

0 голосов
/ 24 октября 2019

Это происходит потому, что вы пытаетесь остановить MediaRecorder до того, как он будет подготовлен, быстрое решение может быть следующим:

try{
    mediaRecorder.stop();
    mediaRecorder.release();
}catch (Exception e){
}

Проверьте Документация :

Обратите внимание, что RuntimeException преднамеренно выбрасывается в приложение, если при вызове stop () не было получено никаких действительных аудио / видео данных. Это происходит, если stop () вызывается сразу после start (). Ошибка позволяет приложению принять соответствующие меры для очистки выходного файла (например, удаления выходного файла), поскольку при этом выходной файл создается неправильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...