GithubHelp home page GithubHelp logo

lassana / continuous-audiorecorder Goto Github PK

View Code? Open in Web Editor NEW
147.0 9.0 51.0 1.25 MB

Implementation of the missing feature in Android SDK: audio recorder with a pause.

License: BSD 2-Clause "Simplified" License

Java 96.22% Shell 3.78%
android mediarecorder mp4

continuous-audiorecorder's People

Contributors

devfozgul avatar lassana avatar mottykohn avatar saslam4 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

continuous-audiorecorder's Issues

Start Failed Only When Using VORBIS Encoding

When generating a custom MediaRecorderConfig and specifying VORBIS (https://developer.android.com/reference/android/media/MediaRecorder.AudioEncoder.html#VORBIS) as the enum value for encoding, I receive the error message 04-12 15:38:40.504 E/MediaRecorder(20929): start failed: -2147483648. This does not occur with any other choice of encoding.

java.lang.RuntimeException: An error occurred while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.RuntimeException: start failed.
at android.media.MediaRecorder.native_start(Native Method)
at android.media.MediaRecorder.start(MediaRecorder.java:852)
at com.github.lassana.recorder.AudioRecorder$StartRecordTask.doInBackground(AudioRecorder.java:97)
at com.github.lassana.recorder.AudioRecorder$StartRecordTask.doInBackground(AudioRecorder.java:79)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)

Error when click quickly to record and pause

When user click quickly on record and pause buttons app close activity and return without any crash report
the problem here
private void appendToFile(final String targetFileName, final String newFileName) {
Mp4ParserWrapper.append(targetFileName, newFileName);//<- here
}

when user click quickly append function doesn't finish appending so app crash but not show any exception stacktrace
thanks for sharing this lib

Not compatible with iOS devices

Created audio file is not playing in iOS devices whereas it plays in android and web browsers. Can you please help why it is happening?

APK on drone.io does not play back recording

I just downloaded the latest build here: https://drone.io/github.com/lassana/continuous-audiorecorder/files and installed it on a Samsung S6 running 6.0.1. When I press record, it asks me if I want to allow permissions for recording and writing to storage, when I allow them, it gives me the impression that it begins recording. I speak into the mic for about 30 seconds and then hit Pause. When I hit play, nothing happens. I also couldn't find where the recording file is located to see if it even generated one / recorded the audio. Where is that located?

Destination file required to be created prior to using AudioRecorder

When using the standard MediaRecorder class, it is not necessary to create a file on the device prior to recording, as long the destination file path is set, using MediaRecorder.setOutputFile(String outputFilePath).

When using AudioRecorder, the output file needs to be created and the destination file path to this output file needs to be set prior to recording, using AudioRecorderBuilder.fileName(String outputFilePath).

Here is the original code using MediaRecorder, which was functional:

private void recordAudio() {
    String fileName = UUID.randomUUID().toString().replaceAll("-", "");
    outputFile = getFilesDir().getAbsolutePath();
    outputFile += "/" + fileName + ".3gp";
    MediaRecorder myRecorder = MediaRecorder;

    try {
        myRecorder = new MediaRecorder(); 
        myRecorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
        myRecorder.setAudioEncoder(MediaRecorder.OutputFormat.AMR_NB); 
        myRecorder.setOutputFile(outputFile);
        myRecorder.setAudioChannels(1);

        myRecorder.prepare();
        myRecorder.start();

    } catch (IllegalStateException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Here is the functional version of the code using AudioRecorder:

    private void recordAudio(){
        String fileName = UUID.randomUUID().toString().replaceAll("-", "");
        outputFile = this.getFilesDir().getPath();
        outputFile += "/" + fileName + ".mp4";

        File file = new File(outputFile);
        if (!file.exists()) {
            try {
                file.createNewFile();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }

        myRecorder = AudioRecorderBuilder.with(this)
                .fileName(outputFile)
                .config(AudioRecorder.MediaRecorderConfig.DEFAULT)
                .loggable()
                .build();

        myRecorder.start(new AudioRecorder.OnStartListener() {
            @Override
            public void onStarted() {
                // started
                changeButtonsToRecordingOptions();
            }

            @Override
            public void onException(Exception e) {
                // error
                Log.i("AudioRecorder", "ERROR With continuous audio recorder!");
            }
        });
    }

I believe this error is occurring due to some issue with Mp4ParserWrapper not properly creating the file, which I believe should happen in Line 49.

An example of the final value of the String outputFile is: /data/user/0/com.packageName.app/files/fb0409ac7dd743d6867151c034d145b8.mp4

I'm using a Samsung Galaxy 5 and Android 6.0.

Thanks,
Andy

Handle java.lang.RuntimeException: An error occurred while uting doInBackground() Exception

Hi
My app use ACRA crash report
this Exception reported several times:
Please handle this exception. thanks.

java.lang.RuntimeException: An error occurred while uting doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:309) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
at java.util.concurrent.FutureTask.setException(FutureTask.java:223) at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$Serialutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolutor.runWorker(ThreadPoolutor.java:1113)
at java.util.concurrent.ThreadPoolutor$Worker.run(ThreadPoolutor.java:588) at java.lang.Thread.run(Thread.java:818)nCaused by: java.util.NoSuchElementException
at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:59) at java.util.AbstractCollection.toArrayList(AbstractCollection.java:349)
at java.util.AbstractCollection.toArray(AbstractCollection.java:339) at java.util.ArrayList.addAll(ArrayList.java:188)
at com.googlecode.mp4parser.authoring.tracks.AppendTrack.getSamples(AppendTrack.java:357) at com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder.build(DefaultMp4Builder.java:92)
at com.github.lassana.recorder.Mp4ParserWrapper.append(Mp4ParserWrapper.java:105) at com.github.lassana.recorder.Mp4ParserWrapper.append(Mp4ParserWrapper.java:48)
at com.github.lassana.recorder.AudioRecorder.appendToFile(AudioRecorder.java:287) at com.github.lassana.recorder.AudioRecorder.access$900(AudioRecorder.java:18)
at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:131) at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:117)
at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237)n ... 4 morenjava.util.NoSuchElementException
at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:59) at java.util.AbstractCollection.toArrayList(AbstractCollection.java:349)
at java.util.AbstractCollection.toArray(AbstractCollection.java:339) at java.util.ArrayList.addAll(ArrayList.java:188)
at com.googlecode.mp4parser.authoring.tracks.AppendTrack.getSamples(AppendTrack.java:357) at com.googlecode.mp4parser.authoring.builder.DefaultMp4Builder.build(DefaultMp4Builder.java:92)
at com.github.lassana.recorder.Mp4ParserWrapper.append(Mp4ParserWrapper.java:105) at com.github.lassana.recorder.Mp4ParserWrapper.append(Mp4ParserWrapper.java:48)
at com.github.lassana.recorder.AudioRecorder.appendToFile(AudioRecorder.java:287) at com.github.lassana.recorder.AudioRecorder.access$900(AudioRecorder.java:18)
at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:131) at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:117)
at android.os.AsyncTask$2.call(AsyncTask.java:295) at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$Serialutor$1.run(AsyncTask.java:234) at java.util.concurrent.ThreadPoolutor.runWorker(ThreadPoolutor.java:1113)
at java.util.concurrent.ThreadPoolutor$Worker.run(ThreadPoolutor.java:588) at java.lang.Thread.run(Thread.java:818)

if directory of recording exists but not the file or the file exists but its length == 0 the recorder silently fails

The issue lies in the following code:
if (targetFile.exists() && targetFile.length() > 0) { String tmpFileName = mainFileName + ".tmp"; append(mainFileName, anotherFileName, tmpFileName); copyFile(tmpFileName, mainFileName); rvalue = anotherFile.delete() && new File(tmpFileName).delete(); } else if (targetFile.getParentFile().mkdirs() && targetFile.createNewFile()) { copyFile(anotherFileName, mainFileName); rvalue = anotherFile.delete(); }
mkdirs() returns false if directory exists so does createNewFile() if file exists.

Stop failed when click quickly to record and pause

Here's my stack Trace :

11-30 16:27:20.674 2436-3017/com. E/MediaRecorder: stop failed: -1007
11-30 16:27:20.675 2436-2436/com. W/System.err: java.lang.RuntimeException: stop failed.
11-30 16:27:20.675 2436-2436/com.W/System.err: at android.media.MediaRecorder.stop(Native Method)
11-30 16:27:20.675 2436-2436/com. W/System.err: at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:125)
11-30 16:27:20.675 2436-2436/com. W/System.err: at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:117)
11-30 16:27:20.675 2436-2436/com.W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:295)
11-30 16:27:20.675 2436-2436/com.W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-30 16:27:20.675 2436-2436/com. W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
11-30 16:27:20.675 2436-2436/com. W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-30 16:27:20.675 2436-2436/com. W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-30 16:27:20.675 2436-2436/com. W/System.err: at java.lang.Thread.run(Thread.java:818)

Error : Start Failed

11-05 21:54:12.126 2156-2172/com.apptest.fr.myapptest W/EGL_emulation: eglSurfaceAttrib not implemented
11-05 21:54:12.126 2156-2172/com.apptest.fr.myapptest W/OpenGLRenderer: Failed to set EGL_SWAP_BEHAVIOR on surface 0xad7bdb40, error=EGL_SUCCESS
11-05 21:54:12.219 2156-2172/com.apptest.fr.myapptest E/Surface: getSlotFromBufferLocked: unknown buffer: 0xabf11a60
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #1
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: Process: com.apptest.fr.myapptest, PID: 2156
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: java.lang.RuntimeException: An error occurred while executing doInBackground()
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at android.os.AsyncTask$3.done(AsyncTask.java:309)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.FutureTask.setException(FutureTask.java:223)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:242)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: Caused by: java.lang.RuntimeException: setAudioSource failed.
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at android.media.MediaRecorder.setAudioSource(Native Method)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at com.github.lassana.recorder.AudioRecorder$StartRecordTask.doInBackground(AudioRecorder.java:89)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at com.github.lassana.recorder.AudioRecorder$StartRecordTask.doInBackground(AudioRecorder.java:79)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at android.os.AsyncTask$2.call(AsyncTask.java:295)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
11-05 21:54:21.704 2156-2378/com.apptest.fr.myapptest E/AndroidRuntime: at java.lang.Thread.run(Thread.java:818) 
11-05 21:54:21.851 2156-2384/com.apptest.fr.myapptest E/MediaRecorder: stop called in an invalid state: 0
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: Audio Recorder error !
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: java.lang.IllegalStateException
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at android.media.MediaRecorder.stop(Native Method)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:125)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at com.github.lassana.recorder.AudioRecorder$PauseRecordTask.doInBackground(AudioRecorder.java:117)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at android.os.AsyncTask$2.call(AsyncTask.java:295)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
11-05 21:54:22.104 2156-2156/com.apptest.fr.myapptest E/MainActivity: at java.lang.Thread.run(Thread.java:818)
11-05 21:54:22.119 2156-2172/com.apptest.fr.myapptest E/Surface: getSlotFromBufferLocked: unknown buffer: 0xabf11ad0
11-05 21:54:26.907 2156-2156/com.apptest.fr.myapptest I/Choreographer: Skipped 287 frames! The application may be doing too much work on its main thread.
11-05 21:54:27.267 2156-2163/com.apptest.fr.myapptest W/art: Suspending all threads took: 84.007ms
11-05 21:54:28.923 2156-2378/? I/Process: Sending signal. PID: 2156 SIG: 9

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.