├── .github └── FUNDING.yml ├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── cafe │ │ └── adriel │ │ └── androidaudiorecorder │ │ └── example │ │ ├── MainActivity.java │ │ └── Util.java │ └── res │ ├── layout │ └── activity_main.xml │ ├── mipmap-hdpi │ └── ic_launcher.png │ ├── mipmap-mdpi │ └── ic_launcher.png │ ├── mipmap-xhdpi │ └── ic_launcher.png │ ├── mipmap-xxhdpi │ └── ic_launcher.png │ ├── mipmap-xxxhdpi │ └── ic_launcher.png │ └── values │ ├── colors.xml │ ├── strings.xml │ └── styles.xml ├── build.gradle ├── demo.gif ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── lib ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ └── main │ ├── AndroidManifest.xml │ ├── java │ └── cafe │ │ └── adriel │ │ └── androidaudiorecorder │ │ ├── AndroidAudioRecorder.java │ │ ├── AudioRecorderActivity.java │ │ ├── Util.java │ │ ├── VisualizerHandler.java │ │ └── model │ │ ├── AudioChannel.java │ │ ├── AudioSampleRate.java │ │ └── AudioSource.java │ └── res │ ├── drawable-hdpi │ ├── aar_ic_check.png │ └── aar_ic_clear.png │ ├── drawable-mdpi │ ├── aar_ic_check.png │ └── aar_ic_clear.png │ ├── drawable-xhdpi │ ├── aar_ic_check.png │ └── aar_ic_clear.png │ ├── drawable-xxhdpi │ ├── aar_ic_check.png │ └── aar_ic_clear.png │ ├── drawable-xxxhdpi │ ├── aar_ic_check.png │ └── aar_ic_clear.png │ ├── drawable │ ├── aar_ic_pause.png │ ├── aar_ic_play.png │ ├── aar_ic_rec.png │ ├── aar_ic_restart.png │ └── aar_ic_stop.png │ ├── layout │ └── aar_activity_audio_recorder.xml │ ├── menu │ └── aar_audio_recorder.xml │ ├── values-pt │ └── strings.xml │ └── values │ ├── dimens.xml │ └── strings.xml ├── screenshots.png └── settings.gradle /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | ko_fi: adrielcafe 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | .idea 4 | /local.properties 5 | /.idea/workspace.xml 6 | /.idea/libraries 7 | .DS_Store 8 | /build 9 | /captures 10 | .externalNativeBuild 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Android Arsenal](https://img.shields.io/badge/Android%20Arsenal-AndroidAudioRecorder-green.svg?style=true)](https://android-arsenal.com/details/1/4099) [![Release](https://jitpack.io/v/adrielcafe/AndroidAudioRecorder.svg)](https://jitpack.io/#adrielcafe/AndroidAudioRecorder) 2 | 3 | # AndroidAudioRecorder 4 | 5 | > A fancy audio recorder for Android. It supports `WAV` format at `48kHz`. 6 | 7 | ![Screenshots](https://raw.githubusercontent.com/adrielcafe/AndroidAudioRecorder/master/demo.gif) 8 | 9 | ![Screenshots](https://raw.githubusercontent.com/adrielcafe/AndroidAudioRecorder/master/screenshots.png) 10 | 11 | ## How To Use 12 | 13 | 1 - Add these permissions into your `AndroidManifest.xml` and [request for them in Android 6.0+](https://developer.android.com/training/permissions/requesting.html) 14 | ```xml 15 | 16 | 17 | 18 | ``` 19 | 20 | 2 - Open the recorder activity 21 | ```java 22 | String filePath = Environment.getExternalStorageDirectory() + "/recorded_audio.wav"; 23 | int color = getResources().getColor(R.color.colorPrimaryDark); 24 | int requestCode = 0; 25 | AndroidAudioRecorder.with(this) 26 | // Required 27 | .setFilePath(filePath) 28 | .setColor(color) 29 | .setRequestCode(requestCode) 30 | 31 | // Optional 32 | .setSource(AudioSource.MIC) 33 | .setChannel(AudioChannel.STEREO) 34 | .setSampleRate(AudioSampleRate.HZ_48000) 35 | .setAutoStart(true) 36 | .setKeepDisplayOn(true) 37 | 38 | // Start recording 39 | .record(); 40 | ``` 41 | 42 | 3 - Wait for result 43 | ```java 44 | @Override 45 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 46 | super.onActivityResult(requestCode, resultCode, data); 47 | if (requestCode == 0) { 48 | if (resultCode == RESULT_OK) { 49 | // Great! User has recorded and saved the audio file 50 | } else if (resultCode == RESULT_CANCELED) { 51 | // Oops! User has canceled the recording 52 | } 53 | } 54 | } 55 | ``` 56 | 57 | ## Import to your project 58 | Put this into your `app/build.gradle`: 59 | ``` 60 | repositories { 61 | maven { 62 | url "https://jitpack.io" 63 | } 64 | } 65 | 66 | dependencies { 67 | compile 'com.github.adrielcafe:AndroidAudioRecorder:0.3.0' 68 | } 69 | ``` 70 | 71 | ## FEATURES 72 | - [X] Record audio 73 | - [X] Tint images to black when background color is too bright (thanks to [@prakh25](https://github.com/prakh25)) 74 | - [X] Wave visualization based on this [player concept](https://dribbble.com/shots/2369760-Player-Concept) 75 | - [X] Play recorded audio 76 | - [X] Pause recording 77 | - [X] Configure audio source (Mic/Camcorder), channel (Stereo/Mono) and sample rate (8kHz to 48kHz) 78 | - [X] Auto start recording when open activity 79 | - [X] Keep display on while recording 80 | - [ ] Skip silence 81 | - [ ] Animations 82 | - [ ] Landscape screen orientation (only supports portrait at the moment) 83 | 84 | ## Dependencies 85 | * [OmRecorder](https://github.com/kailash09dabhi/OmRecorder) 86 | * [WaveInApp](https://github.com/Cleveroad/WaveInApp) 87 | 88 | ## Want to CONVERT AUDIO into your app? 89 | **Take a look at [AndroidAudioConverter](https://github.com/adrielcafe/AndroidAudioConverter)! Example of usage [here](https://github.com/adrielcafe/AndroidAudioRecorder/issues/8#issuecomment-247311572).** 90 | 91 | ## License 92 | ``` 93 | The MIT License (MIT) 94 | 95 | Copyright (c) 2016 Adriel Café 96 | 97 | Permission is hereby granted, free of charge, to any person obtaining a copy 98 | of this software and associated documentation files (the "Software"), to deal 99 | in the Software without restriction, including without limitation the rights 100 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 101 | copies of the Software, and to permit persons to whom the Software is 102 | furnished to do so, subject to the following conditions: 103 | 104 | The above copyright notice and this permission notice shall be included in 105 | all copies or substantial portions of the Software. 106 | 107 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 108 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 109 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 110 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 111 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 112 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 113 | THE SOFTWARE. 114 | ``` 115 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 24 5 | buildToolsVersion "24.0.2" 6 | defaultConfig { 7 | applicationId "cafe.adriel.androidaudiorecorder.example" 8 | minSdkVersion 15 9 | targetSdkVersion 24 10 | versionCode 1 11 | versionName "1.0" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | compile 'com.android.support:appcompat-v7:24.2.1' 23 | compile project(':lib') 24 | // compile 'com.github.adrielcafe:AndroidAudioRecorder:0.1.0' 25 | } 26 | 27 | repositories { 28 | maven { url "https://jitpack.io" } 29 | } -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /Users/adrielcafe/Android/sdk/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 8 | 9 | 10 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/cafe/adriel/androidaudiorecorder/example/MainActivity.java: -------------------------------------------------------------------------------- 1 | package cafe.adriel.androidaudiorecorder.example; 2 | 3 | import android.Manifest; 4 | import android.content.Intent; 5 | import android.graphics.drawable.ColorDrawable; 6 | import android.os.Bundle; 7 | import android.os.Environment; 8 | import android.support.v4.content.ContextCompat; 9 | import android.support.v7.app.AppCompatActivity; 10 | import android.view.View; 11 | import android.widget.Toast; 12 | 13 | import cafe.adriel.androidaudiorecorder.AndroidAudioRecorder; 14 | import cafe.adriel.androidaudiorecorder.model.AudioChannel; 15 | import cafe.adriel.androidaudiorecorder.model.AudioSampleRate; 16 | import cafe.adriel.androidaudiorecorder.model.AudioSource; 17 | 18 | public class MainActivity extends AppCompatActivity { 19 | private static final int REQUEST_RECORD_AUDIO = 0; 20 | private static final String AUDIO_FILE_PATH = 21 | Environment.getExternalStorageDirectory().getPath() + "/recorded_audio.wav"; 22 | 23 | @Override 24 | protected void onCreate(Bundle savedInstanceState) { 25 | super.onCreate(savedInstanceState); 26 | setContentView(R.layout.activity_main); 27 | 28 | if (getSupportActionBar() != null) { 29 | getSupportActionBar().setBackgroundDrawable( 30 | new ColorDrawable(ContextCompat.getColor(this, R.color.colorPrimaryDark))); 31 | } 32 | 33 | Util.requestPermission(this, Manifest.permission.RECORD_AUDIO); 34 | Util.requestPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); 35 | } 36 | 37 | @Override 38 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 39 | super.onActivityResult(requestCode, resultCode, data); 40 | if (requestCode == REQUEST_RECORD_AUDIO) { 41 | if (resultCode == RESULT_OK) { 42 | Toast.makeText(this, "Audio recorded successfully!", Toast.LENGTH_SHORT).show(); 43 | } else if (resultCode == RESULT_CANCELED) { 44 | Toast.makeText(this, "Audio was not recorded", Toast.LENGTH_SHORT).show(); 45 | } 46 | } 47 | } 48 | 49 | public void recordAudio(View v) { 50 | AndroidAudioRecorder.with(this) 51 | // Required 52 | .setFilePath(AUDIO_FILE_PATH) 53 | .setColor(ContextCompat.getColor(this, R.color.recorder_bg)) 54 | .setRequestCode(REQUEST_RECORD_AUDIO) 55 | 56 | // Optional 57 | .setSource(AudioSource.MIC) 58 | .setChannel(AudioChannel.STEREO) 59 | .setSampleRate(AudioSampleRate.HZ_48000) 60 | .setAutoStart(false) 61 | .setKeepDisplayOn(true) 62 | 63 | // Start recording 64 | .record(); 65 | } 66 | 67 | } -------------------------------------------------------------------------------- /app/src/main/java/cafe/adriel/androidaudiorecorder/example/Util.java: -------------------------------------------------------------------------------- 1 | package cafe.adriel.androidaudiorecorder.example; 2 | 3 | import android.app.Activity; 4 | import android.content.pm.PackageManager; 5 | import android.support.v4.app.ActivityCompat; 6 | import android.support.v4.content.ContextCompat; 7 | 8 | public class Util { 9 | 10 | public static void requestPermission(Activity activity, String permission) { 11 | if (ContextCompat.checkSelfPermission(activity, permission) 12 | != PackageManager.PERMISSION_GRANTED) { 13 | ActivityCompat.requestPermissions(activity, new String[]{permission}, 0); 14 | } 15 | } 16 | 17 | } -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 |