{"id":16556267,"url":"https://github.com/asynctaskcoffee/voicerecorder","last_synced_at":"2025-03-21T10:32:26.377Z","repository":{"id":170454139,"uuid":"278362859","full_name":"AsynctaskCoffee/VoiceRecorder","owner":"AsynctaskCoffee","description":"Easy Android Audio Voice Recorder for lazy coders ;) (WRAPPER)","archived":false,"fork":false,"pushed_at":"2021-10-15T10:51:23.000Z","size":4545,"stargazers_count":41,"open_issues_count":6,"forks_count":8,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-18T00:43:32.894Z","etag":null,"topics":["android-library","audio","record","record-audio","voice"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AsynctaskCoffee.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2020-07-09T12:47:19.000Z","updated_at":"2024-05-07T18:41:18.000Z","dependencies_parsed_at":"2023-10-20T18:04:34.411Z","dependency_job_id":null,"html_url":"https://github.com/AsynctaskCoffee/VoiceRecorder","commit_stats":null,"previous_names":["asynctaskcoffee/voicerecorder"],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AsynctaskCoffee%2FVoiceRecorder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AsynctaskCoffee%2FVoiceRecorder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AsynctaskCoffee%2FVoiceRecorder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AsynctaskCoffee%2FVoiceRecorder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AsynctaskCoffee","download_url":"https://codeload.github.com/AsynctaskCoffee/VoiceRecorder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244778032,"owners_count":20508840,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android-library","audio","record","record-audio","voice"],"created_at":"2024-10-11T20:04:00.571Z","updated_at":"2025-03-21T10:32:23.953Z","avatar_url":"https://github.com/AsynctaskCoffee.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Easy Audio Recorder\n\n[![License](https://img.shields.io/badge/License-Apache%202.0-yellowgreen.svg)](https://opensource.org/licenses/Apache-2.0) ![version](https://img.shields.io/badge/version-0.4-blue)\n\n\n\u003cimg src=\"previews/preview_gif_1.gif\" width=\"250\"\u003e \u003cimg src=\"previews/preview_gif_2.gif\" width=\"250\"\u003e  \u003cimg src=\"previews/preview_gif_3.gif\" width=\"250\"\u003e\n\n\n\u003e Two stylish design and\n\u003e Easy to use record functions\n\n## Why this project exists\n\n\u003e In applications that include chat, it is often desired to record audio in **m4a-mpeg** format to be compatible with **IOS**. To avoid the confusion of algorithms on the chat screen you can use this library to add voice recording feature to your application with a few lines.\n\n## Features and Usage\n\n\n### Administration Base and Idea\n\n\u003e Start record when press the button and keep recording until release the button.\n\n```kotlin\n\nclass DemoActivity : AppCompatActivity(), AudioRecordListener {\n\nprivate var recorder: Recorder? = null\n\noverride fun onCreate(savedInstanceState: Bundle?) {\n      super.onCreate(savedInstanceState)\n      setContentView(R.layout.activity_button_usage)\n      recorder = Recorder(this)\n}\n\noverride fun onTouch(p0: View?, p1: MotionEvent?): Boolean \n{\n      when (p1?.action) {\n          MotionEvent.ACTION_DOWN -\u003e {     \n              recorder?.startRecord()                    \n              return true\n          }\n          MotionEvent.ACTION_UP,\n          MotionEvent.ACTION_BUTTON_RELEASE -\u003e {         \n              recorder?.stopRecording()                \n              return true\n          }\n      }\n      return false\n}\n\n}\n```\n\n\n\u003cimg src=\"previews/1.jpeg\" width=\"250\"\u003e \u003cimg src=\"previews/2.jpeg\" width=\"250\"\u003e  \u003cimg src=\"previews/3.jpeg\" width=\"250\"\u003e\n\n\n### BottomSheetFragment Usage\n[**here  :)**](https://github.com/AsynctaskCoffee/VoiceRecorder/blob/master/app/src/main/java/com/asynctaskcoffee/voicerecorder/BottomSheetUsageActivity.kt)\n```kotlin\nclass BottomSheetUsageActivity : AppCompatActivity(), AudioRecordListener {\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_bottom_sheet_usage)\n    }\n    \n    fun openDialog(view: View) {\n        VoiceSenderDialog(this).show(supportFragmentManager, \"VOICE\")\n    }\n\n    override fun onAudioReady(audioUri: String?) {\n        TODO(\"Not yet implemented\")\n    }\n\n    override fun onRecordFailed(errorMessage: String?) {\n        TODO(\"Not yet implemented\")\n    }\n}\n```\n\n### Normal Usage\n[**here  :)**](https://github.com/AsynctaskCoffee/VoiceRecorder/blob/master/app/src/main/java/com/asynctaskcoffee/voicerecorder/WorkerUsageActivity.kt)\n```kotlin\nclass WorkerUsageActivity : AppCompatActivity(), AudioRecordListener {\n\n    lateinit var recorder: Recorder\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_worker_usage)\n    }\n\n    fun initRecorder() {\n        recorder = Recorder(this)\n    }\n\n    fun startRecord() {\n        recorder.startRecord()\n    }\n\n    fun stopRecord() {\n        recorder.stopRecording()\n    }\n\n    override fun onAudioReady(audioUri: String?) {\n        TODO(\"Not yet implemented\")\n    }\n\n    override fun onRecordFailed(errorMessage: String?) {\n        TODO(\"Not yet implemented\")\n    }\n\n}\n```\n\n\u003cimg src=\"previews/preview_btn_1.png\" width=\"250\"\u003e \u003cimg src=\"previews/preview_btn_2.png\" width=\"250\"\u003e  \u003cimg src=\"previews/preview_btn_3.png\" width=\"250\"\u003e\n\n### Stylish Button Usage\n[**here  :)**](https://github.com/AsynctaskCoffee/VoiceRecorder/blob/master/app/src/main/java/com/asynctaskcoffee/voicerecorder/ButtonUsageActivity.kt)\n```kotlin\nclass ButtonUsageActivity : AppCompatActivity(), AudioRecordListener {\n\n    private var permissionsRequired = arrayOf(\n        Manifest.permission.RECORD_AUDIO,\n        Manifest.permission.WRITE_EXTERNAL_STORAGE,\n        Manifest.permission.READ_EXTERNAL_STORAGE\n    )\n\n    private var permissionToRecordAccepted = false\n    private var permissionCode = 200\n\n    override fun onCreate(savedInstanceState: Bundle?) {\n        super.onCreate(savedInstanceState)\n        setContentView(R.layout.activity_button_usage)\n        setViews()\n    }\n\n    private fun setViews() {\n        recordButton.audioRecordListener = this\n        if (letsCheckPermissions()) {\n            recordButton.setRecordListener()\n        } else {\n            ActivityCompat.requestPermissions(this, permissionsRequired, permissionCode)\n        }\n    }\n\n    override fun onAudioReady(audioUri: String?) {\n        Toast.makeText(this, audioUri, Toast.LENGTH_SHORT).show()\n    }\n\n    override fun onRecordFailed(errorMessage: String?) {\n        Toast.makeText(this, errorMessage, Toast.LENGTH_SHORT).show()\n    }\n\n    private fun letsCheckPermissions(): Boolean {\n        return ContextCompat.checkSelfPermission(\n            this,\n            android.Manifest.permission.RECORD_AUDIO\n        ) == PackageManager.PERMISSION_GRANTED \u0026\u0026 ContextCompat.checkSelfPermission(\n            this,\n            android.Manifest.permission.WRITE_EXTERNAL_STORAGE\n        ) == PackageManager.PERMISSION_GRANTED \u0026\u0026 ContextCompat.checkSelfPermission(\n            this,\n            android.Manifest.permission.READ_EXTERNAL_STORAGE\n        ) == PackageManager.PERMISSION_GRANTED\n    }\n\n    override fun onRequestPermissionsResult(\n        requestCode: Int,\n        permissions: Array\u003cout String\u003e,\n        grantResults: IntArray\n    ) {\n        super.onRequestPermissionsResult(requestCode, permissions, grantResults)\n        if (requestCode == permissionCode) {\n            permissionToRecordAccepted =\n                (grantResults[0] == PackageManager.PERMISSION_GRANTED) \u0026\u0026 ((grantResults[1] == PackageManager.PERMISSION_GRANTED))\n            if (permissionToRecordAccepted) recordButton.setRecordListener()\n        }\n        if (!permissionToRecordAccepted) Toast.makeText(\n            this,\n            \"You have to accept permissions to send voice\",\n            Toast.LENGTH_SHORT\n        ).show()\n    }\n\n}\n```\n\n```xml\n\u003c?xml version=\"1.0\" encoding=\"utf-8\"?\u003e\n\u003cFrameLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:app=\"http://schemas.android.com/apk/res-auto\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n    android:layout_width=\"match_parent\"\n    android:layout_height=\"match_parent\"\n    tools:context=\".ButtonUsageActivity\"\u003e\n\n    \u003cImageView\n        android:layout_width=\"40dp\"\n        android:layout_height=\"40dp\"\n        android:layout_gravity=\"bottom\"\n        android:layout_margin=\"5dp\"\n        android:background=\"@drawable/button_circle\"\n        android:backgroundTint=\"@android:color/holo_green_light\"\n        android:padding=\"10dp\"\n        android:src=\"@drawable/ic_gallery_icon\"\n        android:tint=\"@color/white\" /\u003e\n\n\n    \u003candroidx.cardview.widget.CardView\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"40dp\"\n        android:layout_gravity=\"bottom\"\n        android:layout_marginStart=\"50dp\"\n        android:layout_marginEnd=\"50dp\"\n        android:layout_marginBottom=\"5dp\"\n        app:cardBackgroundColor=\"@color/white\"\n        app:cardCornerRadius=\"20dp\"\n        app:cardElevation=\"0dp\"\u003e\n\n        \u003cEditText\n            android:layout_width=\"match_parent\"\n            android:layout_height=\"match_parent\"\n            android:background=\"@null\"\n            android:fontFamily=\"@font/rubik_regular\"\n            android:hint=\"Your Message\"\n            android:paddingStart=\"20dp\"\n            android:paddingEnd=\"15dp\"\n            android:textSize=\"14sp\" /\u003e\n\n    \u003c/androidx.cardview.widget.CardView\u003e\n\n    \u003ccom.asynctaskcoffee.audiorecorder.uikit.RecordButton\n        android:id=\"@+id/recordButton\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:layout_gravity=\"bottom|end\" /\u003e\n\n\u003c/FrameLayout\u003e\n```\n\n```xml\n\u003cmanifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\u003e\n\n    \u003cuses-permission android:name=\"android.permission.RECORD_AUDIO\" /\u003e\n    \u003cuses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" /\u003e\n    \u003cuses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\" /\u003e\n\n    \u003capplication\n        android:requestLegacyExternalStorage=\"true\"\n        tools:targetApi=\"q\" /\u003e\n\u003c/manifest\u003e\n```\n\n### Extras\n\n##### Change Record Path\n\n```kotlin\nfun setFileName(fileName: String?) {\n   this.fileName = fileName\n}\n```\n\n##### Beep before record\n\n```kotlin\nval dialog = VoiceSenderDialog(this)\ndialog.setBeepEnabled(true)\ndialog.show(supportFragmentManager, \"VOICE\")\n```\n\n```kotlin\nrecordButton.audioRecordListener = this\nrecordButton.beepEnabled = true\n```\n\n##### Easy MPlayer\n\n```kotlin\nlateinit var player: Player\n\noverride fun onAudioReady(audioUri: String?) {\n    player = Player(this)\n    player.injectMedia(audioUri)\n}\n\nfun playRecord(view: View) {\n    if (player.player!!.isPlaying)\n        player.stopPlaying()\n    else player.startPlaying()\n}\n```\n\n##### Customize Dialog Language with LangObj\n\n```java\npublic LangObj() {\n}\n\nString record_audio_string = \"Start Record\";\nString hold_for_record_string = \"Hold for record\";\nString release_for_end_string = \"Release for end record\";\nString listen_record_string = \"You can listen record\";\nString stop_listen_record_string = \"Stop Listen\";\nString stop_record_string = \"Stop Record\";\nString send_record_string = \"Send Record\";\n\npublic LangObj(String record_audio_string, String hold_for_record_string, String release_for_end_string, String listen_record_string, String stop_listen_record_string, String stop_record_string, String send_record_string) {\n    this.record_audio_string = record_audio_string;\n    this.hold_for_record_string = hold_for_record_string;\n    this.release_for_end_string = release_for_end_string;\n    this.listen_record_string = listen_record_string;\n    this.stop_listen_record_string = stop_listen_record_string;\n    this.stop_record_string = stop_record_string;\n    this.send_record_string = send_record_string;\n}\n```\n\n```java\npublic VoiceSenderDialog(AudioRecordListener audioRecordListener, LangObj langObj) {\n    this.langObj = langObj;\n    this.audioRecordListener = audioRecordListener;\n}\n```\n\n##### Customize Dialog Icons with LangObj\n\n```java\npublic IconsObj() {\n}\n\nint ic_start_record = R.drawable.ic_start_record;\nint ic_stop_play = R.drawable.ic_stop_play;\nint ic_play_record = R.drawable.ic_play_record;\nint ic_audio_delete = R.drawable.ic_audio_delete;\nint ic_send_circle = R.drawable.ic_send_circle;\nint ic_stop_record = R.drawable.ic_stop_record;\n\npublic IconsObj(int ic_start_record, int ic_stop_play, int ic_play_record, int ic_audio_delete, int ic_send_circle, int ic_stop_record) {\n    this.ic_start_record = ic_start_record;\n    this.ic_stop_play = ic_stop_play;\n    this.ic_play_record = ic_play_record;\n    this.ic_audio_delete = ic_audio_delete;\n    this.ic_send_circle = ic_send_circle;\n    this.ic_stop_record = ic_stop_record;\n}\n```\n\n```java\npublic VoiceSenderDialog(AudioRecordListener audioRecordListener, IconsObj iconsObj) {\n    this.iconsObj = iconsObj;\n    this.audioRecordListener = audioRecordListener;\n}\n```\n\n\n## Implementation Gradle\n\n###### Add it in your root build.gradle at the end of repositories\n\n```groovy\nallprojects {\n    repositories {\n        maven { url 'https://jitpack.io' }\n    }\n}\n```\n\n###### Add the dependency\n\n```groovy\ndependencies {\n    implementation 'com.github.AsynctaskCoffee:VoiceRecorder:beta-0.5'\n}\n```\n\n## Implementation Maven\n\n###### Add the JitPack repository to your build file\n\n```xml\n\u003crepositories\u003e\n\t\u003crepository\u003e\n\t\t\u003cid\u003ejitpack.io\u003c/id\u003e\n\t\t\u003curl\u003ehttps://jitpack.io\u003c/url\u003e\n\t\u003c/repository\u003e\n\u003c/repositories\u003e\n```\n\n###### Add the dependency\n\n```xml\n\u003cdependency\u003e\n\t\u003cgroupId\u003ecom.github.AsynctaskCoffee\u003c/groupId\u003e\n\t\u003cartifactId\u003eVoiceRecorder\u003c/artifactId\u003e\n\t\u003cversion\u003ebeta-0.5\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n\n## Credits\n\n@vedraj360\n\n\n## License\n\n```\nCopyright 2020 Egemen ÖZOGUL\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasynctaskcoffee%2Fvoicerecorder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fasynctaskcoffee%2Fvoicerecorder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fasynctaskcoffee%2Fvoicerecorder/lists"}