A Basic Call Recorder for rooted Android devices

Related tags

Kotlin Projects BCR
Overview

Basic Call Recorder

app icon

BCR is a simple Android call recording app for rooted devices or devices running custom firmware. Once enabled, it stays out of the way and automatically records incoming and outgoing calls in the background.

light mode screenshot dark mode screenshot

Features

  • Supports Android 9 through 13
  • Records FLAC-encoded lossless audio at the device's native sample rate
  • Supports Android's Storage Access Framework (can record to SD cards, USB devices, cloud storage, etc.)
  • Quick settings toggle
  • Material You dynamic theming
  • No persistent notification unless a recording is in progress
  • No network access permission
  • No third party dependencies
  • Works with call screening on Pixel devices (records the caller, but not the automated system)

Non-features

As the name alludes, BCR intends to be a basic as possible, with only two configuration options: an on/off switch and the output directory. The project will have succeeded at its goal if the only updates it ever needs are for compatibility with new Android versions. Thus, many potentially useful features will never be implemented, such as:

  • Automatic deletion of old recordings
  • Changing the filename format
  • Support for other lossless codecs
  • Support for lossy audio compression
  • Support for old Android versions (support is dropped as soon as maintenance becomes cumbersome)
  • Workarounds for OEM-specific battery optimization and app killing behavior
  • Workarounds for devices that don't support the VOICE_CALL audio source (eg. using microphone + speakerphone)
  • Support for direct boot mode (the state before the device is initially unlocked after reboot)
  • Support for stock, unrooted firmware

Usage

  1. Download the latest version from the releases page. To verify the digital signature, see the verifying digital signatures section.

  2. Install BCR as a system app.

    For devices rooted with Magisk, simply flash the zip as a Magisk module from within the Magisk app.

    For unrooted custom firmware, the files from the system/ folder in the zip will need to be baked into the system image (or otherwise made available on the actual /system volume).

  3. Reboot and open BCR.

  4. Enable call recording and pick an output directory. If no output directory is selected or if the output directory is no longer accessible, then recordings will be saved to /sdcard/Android/data/com.chiller3.bcr/files.

  5. To install future updates, there are a couple methods:

    • If installed via Magisk, the module can be updated right from Magisk Manager's modules tab. Flashing the new version in Magisk manually also works just as well.
    • The .apk can also be extracted from the zip and be directly installed. With this method, the old version exists as a system app and the new version exists as a user-installed update to the system app. This method is more convenient if BCR is baked into the Android firmware image.

How it works

BCR relies heavily on system app permissions in order to function properly. This is primarily because of two permissions:

  • CONTROL_INCALL_EXPERIENCE

    This permission allows Android's telephony service to bind to BCR's InCallService without BCR being a wearable companion app, a car UI, or the default dialer. Once bound, the service will receive callbacks for call change events (eg. incoming call in the ringing state). This method is much more reliable than using the READ_PHONE_STATE permission and relying on android.intent.action.PHONE_STATE broadcasts.

    This method has a couple additional benefits. Due to the way that the telephony service binds to BCR's InCallService, the service can bring itself in and out of the foreground as needed when a call is in progress and access the audio stream without hitting Android 12+'s background microphone access limitations. It also does not require the service to be manually started from an ACTION_BOOT_COMPLETED broadcast receiver and thus is not affected by that broadcast's delays during initial boot.

  • CAPTURE_AUDIO_OUTPUT

    This permission is used to record from the VOICE_CALL audio stream. This stream, along with some others, like VOICE_DOWNLINK and VOICE_UPLINK, cannot be accessed without this system permission.

With these two permissions, BCR can reliably detect phone calls and record from the call's audio stream. The recording process pulls PCM s16le raw audio at the device's native sample rate and uses MediaCodec's builtin (software) FLAC encoder to create a losslessly compressed recording.

Verifying digital signatures

Both the zip file and the APK contained within are digitally signed.

To verify the signature of the zip file, first retrieve the public key: 2233C479609BDCEC43BE9232F6A3B19090EFF32C. This is the same key used to sign the git tags in this repository.

gpg --recv-key 2233C479609BDCEC43BE9232F6A3B19090EFF32C

Then, verify the signature of the zip file.

gpg --verify BCR-<version>-release.zip.asc BCR-<version>-release.zip

The command output should include both Good signature and the GPG fingerprint listed above.

To verify the signature of the APK, extract it from the zip and then run:

apksigner verify --print-certs system/priv-app/com.chiller3.bcr/app-release.apk

The SHA-256 digest of the APK signing certificate is:

d16f9b375df668c58ef4bb855eae959713d6d02e45f7f2c05ce2c27ae944f4f9

Building from source

BCR can be built like most other Android apps using Android Studio or the gradle command line.

To build the APK:

./gradlew assembleDebug

To build the Magisk module zip (which automatically runs the assembleDebug task if needed):

./gradlew zipDebug

The output file is written to app/build/distributions/debug/. The APK will be signed with the default autogenerated debug key.

To create a release build with a specific signing key, set up the following environment variables:

export RELEASE_KEYSTORE=/path/to/keystore.jks
export RELEASE_KEY_ALIAS=alias_name

read -s RELEASE_KEYSTORE_PASSPHRASE
read -s RELEASE_KEY_PASSPHRASE
export RELEASE_KEYSTORE_PASSPHRASE
export RELEASE_KEY_PASSPHRASE

and then build the release zip:

./gradlew zipRelease

Contributing

Bug fix and translation pull requests are welcome and much appreciated!

If you are interested in implementing a new feature and would like to see it included in BCR, please open an issue to discuss it first. I intend for BCR to be as simple and low-maintenance as possible, so I am not too inclined to add any new features, but I could be convinced otherwise.

License

BCR is licensed under GPLv3. Please see LICENSE for the full license text.

Comments
  • Recordings Overlapping

    Recordings Overlapping

    Hi @chenxiaolong

    I tried latest v1.4 too but the audio recording overlapping is still there!

    Say If I record for a 20 seconds long call then sometimes it's the recorded duration only getting 7 seconds, sometimes it's 11 seconds and sometimes whole 20 seconds!

    When the duration reducing say for 7 seconds long recording then the remaining recording of 13 seconds seems getting overlapped between 6th to 7th second of the recorded audio!

    I've also allowed BCR to run in the background, So there's no issue with getting it killed in background.

    opened by CodElixer 53
  • Output format M4A/AAC corrupt (missing moov header?)

    Output format M4A/AAC corrupt (missing moov header?)

    Hi,

    First of all, I love the simplicity of this app. Keep it that way!

    I do noticed that the recorder does record conversations, but the generated m4a/aac files cannot be played correctly. I tried to fix them with e.g. ffmpeg, but it seems the moov header is missing? Not sure tough, as I'm not familiar with the aac format.

    See attached files for a few examples. calls.zip

    Here's one with debuglogging: with debuglog.zip

    I'm using BCR version 1.20 (release + debugmode) Installed /enabled as Magisk module On Android 9, running on Samsuing S8 stock firmware (rooted obviously).

    Output dir is default (com.chiller3.bcr/file), format is also default (m4a/aac, 64kbps, 48kHz) App Permissions are Contacts and Microphone

    Although I'm not in favor submitting multiple issues at the same time, I also notice that the debug file is often missing, or sometimes has a size of 0 bytes.

    Hope you can help, Thanks!

    bug/limitation elsewhere 
    opened by JeroenHid 33
  • [Question] Custom rom > root > install BCR > unroot

    [Question] Custom rom > root > install BCR > unroot

    Can it be installed by placing its files in root/system folder using file explorer with root permission, and after installing BCR, can magisk be uninstalled? So that BCR can work like system app, but without magisk.

    Basically, this app is perfect; but with magisk, few banking apps are not working properly.

    Thanks

    question 
    opened by tdas777 20
  • Add support for custom date/time format in the output filename

    Add support for custom date/time format in the output filename

    From @nikhilbadyal's comment at: https://github.com/chenxiaolong/BCR/pull/189#issuecomment-1363705779

    It's possible to add custom format for ${date} like yyyy-MM-ddHH:mm:ss . I don't want time_zone in output filename. As it container ugly + sign.

    enhancement 
    opened by chenxiaolong 13
  • Not working after crDroid 9.0 2022-december update

    Not working after crDroid 9.0 2022-december update

    I used BCR in crDroid 9.0 (android 13) without an issue. But after december update BCR stopped working. Notification Also not present. I tried to get the log by enabling release+debugmode but logs are also not saving. All the permissions are allowed. App runs normally. Only the recording is not working. Device - Redmi Note 8 Pro

    bug/limitation elsewhere 
    opened by sanjayahashan 10
  • Possible to enable or disable call recording in the middle of a call?

    Possible to enable or disable call recording in the middle of a call?

    I see that currently I'm not able to change the state of call recording after answering a phone call. If the call recording was enabled before I got the call, the call will be recorded and I can't stop it during the call. And if the call recording was not enabled before I got the call, I can't enable it during the call.

    This leads to situations where I either keep it enabled all the time, and record unnecessary calls too and then delete the recording afterwards. OR not keep it enabled all the time, and risk missing to record a call that I should've, as I can't always make an excuse to the caller to call me again in a minute (giving me a chance to enable recording.)

    It would be really really helpful if we can select whether to record a call or not, during the call itself.

    (Pixel 7 Pro, Android 13, Magisk Canary.)

    enhancement 
    opened by bagarwa 7
  • [Feature] Uplink and downlink separated source

    [Feature] Uplink and downlink separated source

    Hi thanks for the application, it's working very well, I don't know what you think about that but would that be convenient to have at least the caller's source(downlink?), a clean audio without my voice, the wind, the noise coming from my mic overlapping with the caller's audio.

    enhancement bug/limitation elsewhere 
    opened by Ceynou 7
  • Not working on Android 12, LOS+microG

    Not working on Android 12, LOS+microG

    What happened

    • Nothing at all (no recordings, no empty files, no errors)

    What did I do?

    • enabled call recording
    • selected output directory
    • disabled buttery optimization
    • call on 123456 number to get input

    Other

    • Tested with both enabled and disabled VOC_REC_* mixers in /vendor/etc
    • Axet's call recorder works weirdly, maybe because it's 2 mixers in /vendor/etc/mixer_paths_tasha.xml. If to play with switches, it may start working but not for long. Also it seems that skip silence somehow affects recording too
    • Mixer info is at the end of the issue
    • ROM: https://download.lineage.microg.org/cheeseburger/

    DeviceInfo

    build.board: msm8998
    build.bootloader: unknown
    build.brand: OnePlus
    build.cpu_abi: arm64-v8a
    build.cpu_abi2: 
    build.device: OnePlus5
    build.display: lineage_cheeseburger-userdebug 12 SP2A.220505.002 eng.root.20220608.224223 dev-keys
    build.fingerprint: OnePlus/OnePlus5/OnePlus5:10/QKQ1.191014.012/2010292059:user/release-keys
    build.hardware: qcom
    build.host: a6c8e04ec309
    build.id: SP2A.220505.002
    build.manufacturer: OnePlus
    build.model: ONEPLUS A5000
    build.product: OnePlus5
    build.radio: unknown
    build.serial: unknown
    build.tags: dev-keys
    build.time: 1654728040000
    build.type: userdebug
    build.user: root
    version.codename: REL
    version.incremental: eng.root.20220608.224223
    version.release: 12
    version.sdk_int: 32
    

    Logcat

    06-16 20:10:56.584 I/Telecom (1498): InCallServiceBindingConnection: Attempting to bind to InCall [ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService} supportsExternal? false supportsSelfMg?false], with Intent { act=android.telecom.InCallService cmp=com.chiller3.bcr/.RecorderInCallService (has extras) }: TSI.pC->CM.fOCP->CM.sOCPA->CM.dSMCP->CM.dSPA->CM.pASP@BQc
    06-16 20:10:56.600 I/Telecom (1498): InCallController: onConnected to ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}: ICSBC.oSC(ccb)@BQg
    06-16 20:10:56.601 I/Telecom (1498): InCallController: Adding 1 calls to InCallService after onConnected: ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}, including external calls: ICSBC.oSC(ccb)@BQg
    06-16 20:10:56.663 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: NOCBIR.oR@BRE
    06-16 20:10:56.736 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-BRI
    06-16 20:10:56.737 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-BRI
    06-16 20:10:56.740 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-BRI
    06-16 20:10:56.741 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-BRI
    06-16 20:10:56.744 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-BRI
    06-16 20:10:56.744 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-BRI
    06-16 20:10:56.745 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-BRI
    06-16 20:10:56.751 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: (...->CS.crCo->H.CS.crCo->H.CS.crCo.pICR)->CSW.hCCC(cap/cast)@E-E-BRI
    06-16 20:10:56.755 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.sSH(cap)@BRk
    06-16 20:10:56.756 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.rE(cap)@BRo
    06-16 20:10:56.758 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.rE(cap)@BRs
    06-16 20:10:56.759 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.sSH(cap)@BRw
    06-16 20:10:56.761 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.rE(cap)@BR0
    06-16 20:10:56.763 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.rE(cap)@BR4
    06-16 20:10:56.867 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.sSH(cap)@BVo
    06-16 20:10:56.869 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.sCDN(cap)@BVw
    06-16 20:10:56.870 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.rE(cap)@BV4
    06-16 20:10:56.871 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.rE(cap)@BV8
    06-16 20:10:59.656 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.sCC(cap)@Beg
    06-16 20:10:59.664 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.sSH(cap)@Bek
    06-16 20:10:59.670 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.rE(cap)@Bes
    06-16 20:10:59.676 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.rE(cap)@Be0
    06-16 20:11:06.623 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.sSH(cap)@BhQ
    06-16 20:11:06.625 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.sDc(cap)@BhU
    06-16 20:11:06.642 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.sCC(cap)@Bhg
    06-16 20:11:06.644 I/Telecom (1498): InCallController: Components updated: [ComponentInfo{com.android.dialer/com.android.incallui.InCallServiceImpl}, ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}]: CSW.sCC(cap)@Bhs
    06-16 20:11:08.650 I/Telecom (1498): InCallController: ICSBC#disconnect: unbinding after 12066 ms;[ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService} supportsExternal? false supportsSelfMg?false]. isCrashed: false: CSW.rC->CM.pR->ICC.oCR(cap)@Bhw
    06-16 20:11:08.660 I/Telecom (1498): InCallController: onDisconnected from ComponentInfo{com.chiller3.bcr/com.chiller3.bcr.RecorderInCallService}: CSW.rC->CM.pR->ICC.oCR(cap)@Bhw
    

    Mixer

        <!-- Incall Recording -->
        <ctl name="MultiMedia9 Mixer VOC_REC_UL" value="0" />
        <ctl name="MultiMedia9 Mixer VOC_REC_DL" value="0" />
        <ctl name="MultiMedia8 Mixer VOC_REC_UL" value="0" />
        <ctl name="MultiMedia8 Mixer VOC_REC_DL" value="0" />
        <!-- Incall Recording End -->
    --
        <path name="incall-rec-uplink">
            <ctl name="MultiMedia9 Mixer VOC_REC_UL" value="0" />
        </path>
    --
        <path name="incall-rec-uplink-compress">
            <ctl name="MultiMedia8 Mixer VOC_REC_UL" value="0" />
        </path>
    --
        <path name="incall-rec-downlink">
            <ctl name="MultiMedia9 Mixer VOC_REC_DL" value="0" />
        </path>
    --
        <path name="incall-rec-downlink-compress">
            <ctl name="MultiMedia8 Mixer VOC_REC_DL" value="0" />
        </path>
    
    
    invalid 
    opened by Lavmint 7
  • Empty recording

    Empty recording

    Hi, after making a call, I get a record file with [nothing.(<10KB)] I use this mod apk or magisk mod and also get Empty recording, realme x2 with pixel extended 4.3 android12 . (https://github.com/jacopotediosi/GoogleDialerMod/issues/12) https://github.com/jacopotediosi/GoogleDialerMod-Magisk How can I debug this, thanks! logcat.txt

    05-27 23:58:33.989 D/[email protected](768): Failed to fetch the lookup information of the device 00000004 05-27 23:58:33.989 D/ACDB-LOADER(768): Error: ACDB AFE returned = -19 05-27 23:58:33.989 D/ACDB-LOADER(768): ACDB -> AUDIO_SET_AFE_CAL cal_type[17] acdb_id[4] 05-27 23:58:33.989 D/ACDB-LOADER(768): ACDB -> send_hw_delay : acdb_id = 4 path = 1 05-27 23:58:33.989 D/ACDB-LOADER(768): ACDB -> ACDB_AVSYNC_INFO: ACDB_CMD_GET_DEVICE_PROPERTY 05-27 23:58:33.989 D/audio_hw_primary(768): enable_audio_route: apply mixer and update path: incall-rec-uplink-and-downlink 05-27 23:58:33.989 D/audio_route(768): Apply path: incall-rec-uplink-and-downlink 05-27 23:58:33.989 D/audio_hw_primary(768): select_devices: acdb_id_in: 41 05-27 23:58:33.989 D/audio_hw_primary(768): select_devices: done 05-27 23:58:33.990 W/OggWriter(3831): failed to read next buffer

    bug/limitation elsewhere 
    opened by windscolorme 7
  • Add support for additional (low-bitrate, lossy) codecs

    Add support for additional (low-bitrate, lossy) codecs

    I know I said in the README that this would not be implemented, but it seems like a useful enough feature to implement. I'll consider adding lossy compression formats if Android's MediaCodec's encoders for them aren't buggy.

    Tentative plan:

    • Add OGG/Opus (Android 10+ only) and ~OGG/Vorbis~ (EDIT: M4A/AAC, see below) codecs
    • FLAC will remain the default
    • Both OGG/Opus and OGG/Vorbis will detail to a high bitrate for better quality, but the user will be able to change it

    What will not be implemented:

    • Changing the sample rate. I don't want to deal with broken downsampling on some devices so recording always happens at the native sample rate, regardless of which codec is used to encode the output file. (Eg. Pixel 6 Pro's native sample rate for VOICE_LINE is 48kHz)
    • mp3, ~m4a/aac~ (EDIT: see below), or any other codec that might be patent encumbered in some countries
    • AMR-NB, AMR-WB, or any other extremely low bitrate codecs
    • wav because the audio is exactly the same as flac, but the file size is larger
    enhancement 
    opened by chenxiaolong 7
  • adb sideload error

    adb sideload error

    I get the following error on oneplus 7t when i try to sideload zip file: "ERROR: recovery: Error in /sideload/package.zip (status 1)"

    am i missing something?

    question 
    opened by firofame 6
  • Building the magisk module zip

    Building the magisk module zip

    export RELEASE_KEYSTORE=/path/to/keystore.jks
    export RELEASE_KEY_ALIAS=alias_name
    
    read -r -s RELEASE_KEYSTORE_PASSPHRASE
    read -r -s RELEASE_KEY_PASSPHRASE
    export RELEASE_KEYSTORE_PASSPHRASE
    export RELEASE_KEY_PASSPHRASE
    

    So it seems that export is set on windows but I can't find anything for read because the command doesn't work

    question 
    opened by Ceynou 1
  • No Sound In Recorded call

    No Sound In Recorded call

    Hello , I found one issue that its recording my call but there is no sound in recorded call .. can you tell me please how can i fix this .. this is the only annoying things i found otherwise your app is one of the best call recording app .. waiting for your reply Thank you

    opened by hypersoumya 3
  • Failed to record call

    Failed to record call

    I think it only occurs when answering calls received when screen is off. Using the latest version of the app. This is a new phone I've recently started using. Stock ROM with root. I've uploaded the failed oga file as a zip because Github only allows certain formats (like BCR ;-) ) Screenshot_Error Screenshot About Phone _in_REDACTED.log.txt _in_REDACTED.zip

    bug/limitation elsewhere 
    opened by effectively0 14
  • Add `Android.mk` for building the app together with the rest of the system

    Add `Android.mk` for building the app together with the rest of the system

    If it's maintained in the repo, it won't have to be kept up to date manually (obviously) or - what's worse - the app wouldn't have to be compiled separately.

    enhancement 
    opened by SigmaBonder 0
  • Notification issue

    Notification issue

    https://user-images.githubusercontent.com/16841896/204638140-95d008d9-3453-4f4f-991d-1253475657e1.mp4

    Like from recording, cannot open file from notification.

    opened by laltroweb 1
Releases(v1.29)
Owner
Andrew Gunnerson
Andrew Gunnerson
Basic-Android-Project - A Basic Android Project with proper structure and all necessary dependencies

Basic-Android-Project A Basic Android Project with proper structure and all nece

Ameer Hamza 2 Mar 18, 2022
Learn how to make an app designed for single-screen devices shine when running on foldable and dual-screen devices

dcberlin21-workshop Make your app shine om foldable devices with the samples we have here. Related links SDK open-source code SDK samples (Kotlin) App

Cesar Valiente 3 Oct 26, 2021
đź“ž Remote call sample android app using RemoteMonster

?? Remote call sample android app using RemoteMonster

Robin 1 Mar 17, 2022
Block unknown callers with this call screening service.

Silence Block unknown callers with this call screening service. By default numbers not in your contact list are blocked. Optionally allow: Numbers you

lucky 162 Jan 5, 2023
LiveDataCallAdapter - Live Data Call Adapter Factory

LiveDataCallAdapterFactory based on retrofit, the LiveData returned by the restf

Jay Wang 0 Feb 6, 2022
Automatically generates UI demos which allow users to call any function with any parameters

Automatically generates UI demos which allow users to call any function (including composable ones) with any parameters. Useful for building demo screens in playground apps of various design systems.

Anton Popov 3 Jul 28, 2022
Android Kotlin Fundamentals 01.2: Anatomy of Basic Android Project

Welcome to Android Kotlin Fundamentals 01.2: Anatomy of Basic Android Project ?? Codelab de android para practicar apps Android con Kotlin ?? Homepage

null 0 Oct 23, 2021
A basic template ecommerce application with payment integration made using Android Architechture componets

ShopIt ShopIt is a basic template ecommerce application with payment integration(RazorPay), made using Android Architechture componets and Material Co

Apurva Shukla 2 Nov 22, 2021
A basic, incomplete, buggy, far from efficient UI toolkit for Kotlin/Android. An experiment for fun and to learn.

Apex Apex is just a simple proof of concept to demonstrate how easily you can build your own UI Toolkit from scratch. This code base is most likely fu

Romain Guy 79 Sep 7, 2022
A basic, incomplete, buggy, far from efficient UI toolkit for Kotlin/Android. An experiment for fun and to learn.

Apex Apex is just a simple proof of concept to demonstrate how easily you can build your own UI Toolkit from scratch. This code base is most likely fu

Romain Guy 79 Sep 7, 2022
A single screen app learn in google basic Android Development course.

Project: Lemonade App - Starter Code Starter code for the first independent project for Android Basics in Kotlin Introduction This is the starter code

Kaushal Raj 0 Dec 19, 2022
AppToDo is a simple Android project that performs the basic database CRUD operations that creates a todo task list

AppToDo is a simple Android project that performs the basic database CRUD operations that creates a todo task list

Rafiul Hye 1 Mar 13, 2022
Examples for using Kotlin at a basic level for Android application development.

Kotlin Android Jetpack Basics Ejemplos para usar Kotlin a nivel básico para el desarrollo de aplicaciones Android. Kotlin Android Jetpack Basics Acerc

José Luis González Sánchez 2 Jun 28, 2022
Framework for Mobile test automation (Native app and Browser) on Android and IOS devices

Appium Mobile Automation Framework Framework for Mobile test automation (Native app and Browser) on Android and IOS devices ?? ?? Quick Start - Appium

Thangaraj 40 Nov 18, 2022
A password list optimized for use on Android devices.

AndroidPWList A small (>1GB) password list optimized for use against Android device passwords. I do not condone, encourage, or support those who would

null 9 Jun 26, 2022
Quickly rotate screen on Android devices without second thought

Useful uitlity for ONYX BOOX Eink devices. It provides several quick actions to be added in top system panel

Daniel Kao 21 Jan 3, 2023
A convenient BMI (Body Mass Index) calculator that is compatible with Android devices.

?? BMI Calculator A convenient BMI (Body Mass Index) calculator that is compatible with Android devices. ?? Please feel free to compute your BMI using

Md. Zahidul Islam 12 Dec 23, 2022
Basic application that uses Retrofit, Moshi and Coil libraries to parse data from web API

DogAlbum_Api_CodeThrough Basic application that uses Retrofit, Moshi and Coil libraries to parse data from web API This folder contains the completed

Ayana Bando 0 Nov 9, 2021