nstudio / nativescript-audio

:microphone: NativeScript plugin to record and play audio :musical_note:
Other
149 stars 104 forks source link

Could not request audio focus nativescript-audio version 6.2.6 on Android 14 #202

Open pap5508 opened 2 months ago

pap5508 commented 2 months ago

Seems there is bug on android 14

    public async playRecord(
        attachment = undefined,
        attachmentId = undefined,
        args,
        repeat: boolean = false
    ) {

        console.log("attachment.filepath: " + attachment.filepath);
        let recordedFile: File = null;

        console.log("1...........................  "+ attachment.filepath);

        //Pause current playing file if another file is tapped and reset variables
        if (attachmentId !== this.currentPlayingAttachmentId && attachmentId !== this.currentPausedAttachmentId) {
            console.log("2...........................  "+ attachment.filepath);

            try {
                if (this._player.isAudioPlaying()) {
                    console.log("3...........................  "+ attachment.filepath);

                    await this.pauseRecord(this.currentPlayingAttachmentId);
                }
            } catch (error) {
                console.log("there was an error pausing the record");
            }

            //reset for new file
            this.isPlaying = false;
            this.isPaused = false;
            this.tapped = false;
            timer.clearInterval(this.timerId);
            this.progressInMilliseconds = 0;
            this.progressInSeconds = 0;
            this.currentPlaytimeInMilliseconds = 0;
            this.currentPlaytimeInSeconds = 0;
            this.currentPausedAttachmentId = null;
            this.currentPlayingAttachmentId = null;
            this.remainingDuration = 0;
            this.changeDetectionRef.detectChanges();
            this._player.dispose().then(() => console.log("player disposed"));
        }

        if (attachment.filepath && File.exists(attachment.filepath)) {
            console.log("4...........................  "+ attachment.filepath);
            recordedFile = File.fromPath(attachment.filepath);
        }
        if (
            !recordedFile ||
            !attachment.filepath ||
            !File.exists(attachment.filepath)
        ) {
            try {
                console.log("file not foumnd, try download");

                var downloadparent = args.object.parent;
                var downloadActivityIndicator = this.downloadActivityIndicator
                    ? this.downloadActivityIndicator.nativeElement
                    : downloadparent.getViewById("DownloadActivityIndicator");

                if (downloadActivityIndicator) {
                    downloadActivityIndicator.busy = true;
                    downloadActivityIndicator.visibility = "visible";
                }
                this.changeDetectionRef.detectChanges();
                await this.checkPermissions().then((granted) => {
                    if (granted) {
                        if (isAndroid) {
                            return this.attachmentsService
                                .downloadAttachment(attachment, this.chat.name)
                                .then((fileExist) => {
                                    if (fileExist === "false" || fileExist == null) {
                                        return Promise.reject("file not found");
                                    } else {
                                        recordedFile = File.fromPath(attachment.filepath);
                                        if (downloadActivityIndicator) {
                                            downloadActivityIndicator.busy = false;
                                            downloadActivityIndicator.visibility = "collapsed";
                                        }
                                        this.changeDetectionRef.detectChanges();
                                        return Promise.resolve();
                                    }
                                });
                        } else {
                            return this.attachmentsService
                                .iosAttachment(attachment, this.chat.name)
                                .then((fileExist) => {
                                    if (fileExist == "false" || fileExist == null) {
                                        return Promise.reject("file not found");
                                    } else {
                                        recordedFile = File.fromPath(attachment.filepath);
                                        if (downloadActivityIndicator) {
                                            downloadActivityIndicator.busy = false;
                                            downloadActivityIndicator.visibility = "collapsed";
                                        }
                                        this.changeDetectionRef.detectChanges();
                                        return Promise.resolve();
                                    }
                                });
                        }
                    }
                });

                if (!File.exists(recordedFile.path)) {
                    console.log("download failed");
                    return;
                }
            } catch {
                console.log("could not dl file");
                return;
            }
        }

        if (recordedFile === null) {
            console.log("no audio file found");
            return;
        }

        if (this.isPaused && !repeat) {
            console.log("5...........................  "+ attachment.filepath);
            this.isPaused = false;
            this.isPlaying = true;
            this.currentPausedAttachmentId = null;
            this.currentPlayingAttachmentId = attachmentId;
            this.changeDetectionRef.detectChanges();
            this.tapped = false;
            this._player.resume();

            if (!this._player.isAudioPlaying()) {
                this.isPaused = false;
                this.isPlaying = false;
                this.currentPlaytimeInMilliseconds = 0;
                this.currentPlaytimeInSeconds = 0;
                timer.clearInterval(this.timerId);
                this.changeDetectionRef.detectChanges();
                return;
            }
            return;
        }

        console.log("RECORDED FILE : " + JSON.stringify(recordedFile));
        const playerOptions: AudioPlayerOptions = {
            audioFile: recordedFile.path,
            loop: false,
            completeCallback: () => {
                console.log("6...........................  "+ attachment.filepath);
                console.log("Audio file complete.");
                this.isPlaying = false;
                this.isPaused = false;
                this.tapped = false;
                timer.clearInterval(this.timerId);
                this.progressInMilliseconds = 0;
                this.progressInSeconds = 0;
                this.changeDetectionRef.detectChanges();
                this.currentPausedAttachmentId = null;
                this.currentPlayingAttachmentId = null;
                this.remainingDuration = 0;
                this.changeDetectionRef.detectChanges();
                if (!playerOptions.loop) {
                    this._player.dispose().then(() => console.log("player disposed"));
                }
            },

            errorCallback: (errorObject) => {
                console.log("7...........................  "+ attachment.filepath);
                console.log(JSON.stringify(errorObject));
                this.isPlaying = false;
                this.tapped = false;
                this.isPaused = false;
                this.currentPausedAttachmentId = null;
                this.currentPlayingAttachmentId = null;
                this.remainingDuration = 0;
                this.progressInMilliseconds = 0;
                this.progressInSeconds = 0;
                if (!this.isDisposed) {
                    this.changeDetectionRef.detectChanges();
                }
            },

            infoCallback: (infoObject) => {
                console.log("8...........................  "+ attachment.filepath);
                console.log(JSON.stringify(infoObject));
            },
        };

        this._player.playFromFile(playerOptions).then(
            (played) => {
                console.log("9...........................  "+ JSON.stringify(playerOptions));
                console.log("file played", played);
                this.isPlaying = true;
                this.isPaused = false;
                this.currentPausedAttachmentId = null;
                this.currentPlayingAttachmentId = attachmentId;
                this.changeDetectionRef.detectChanges();
                this._player.getAudioTrackDuration().then((duration) => {
                    this.audioTrackDurationInSeconds = platform.isAndroid
                        ? this.roundMillisecondsToNearestSecond(+duration)
                        : +duration;
                    this.audioTrackDurationInMilliseconds = platform.isAndroid
                        ? +duration
                        : +duration * 1000;
                    // start audio duration tracking
                    this.startDurationTracking(
                        this.audioTrackDurationInSeconds,
                        this.audioTrackDurationInMilliseconds
                    );
                });
            },
            (err) => {
                console.log("error playFromFile");
                this.isPlaying = false;
                this.isPaused = false;
                this.currentPausedAttachmentId = null;
                this.currentPlayingAttachmentId = null;
            }
        );
    }

Unhandled Promise rejection: Could not request audio focus ; Zone: <root> ; Task: null ; Value: Error: Could not request audio focus Error: Could not request audio focus
      at file: app/webpack:/TestApp/node_modules/nativescript-audio/android/player.js:260:0
      at new ZoneAwarePromise (file: app/webpack:/TestApp/node_modules/zone.js/fesm2015/zone.js:1429:0)
      at TNSPlayer.play (file: app/webpack:/TestApp/node_modules/nativescript-audio/android/player.js:250:0)
      at Object.onPrepared (file: app/webpack:/TestApp/node_modules/nativescript-audio/android/player.js:211:0)
  package.json 
  `{

"description": "NativeScript Application", "version": "1.1.21", "license": "MIT", "name": "TestApp", "readme": "NativeScript Application", "repository": "", "dependencies": { "@angular/animations": "~15.1.0", "@angular/common": "~15.1.0", "@angular/compiler": "~15.1.0", "@angular/core": "~15.1.0", "@angular/forms": "~15.1.0", "@angular/platform-browser": "~15.1.0", "@angular/platform-browser-dynamic": "~15.1.0", "@angular/router": "~15.1.0", "@finalsite/rich-text-editor": "^0.1.1", "@nativescript-community/ui-barcodeview": "^3.6.1", "@nativescript-community/ui-document-picker": "^1.1.12", "@nativescript-community/ui-material-bottomnavigationbar": "^7.2.44", "@nativescript-community/ui-pulltorefresh": "^2.5.3", "@nativescript-use/nativescript-orientation": "^0.0.3", "@nativescript/angular": "^15.0.1", "@nativescript/appversion": "^2.0.0", "@nativescript/background-http": "^6.0.1", "@nativescript/biometrics": "^1.3.1", "@nativescript/camera": "~5.0.15", "@nativescript/core": "~8.6.2", "@nativescript/datetimepicker": "^2.1.13", "@nativescript/firebase": "11.1.3", "@nativescript/firebase-core": "^3.2.0", "@nativescript/firebase-messaging": "^3.2.0", "@nativescript/imagepicker": "^3.0.0", "@nativescript/iqkeyboardmanager": "^2.1.1", "@nativescript/local-notifications": "^6.1.1", "@nativescript/secure-storage": "^3.0.3", "@nativescript/theme": "^2.5.0", "@ngx-translate/core": "^14.0.0", "@ngx-translate/http-loader": "^7.0.0", "@nota/nativescript-webview-ext": "^8.0.2", "@nstudio/nativescript-cardview": "^2.0.2", "@nstudio/nativescript-carousel": "^8.0.3", "@nstudio/nativescript-checkbox": "^2.0.5", "@nstudio/nativescript-floatingactionbutton": "^3.0.4", "@nstudio/nativescript-pulltorefresh": "^3.0.2", "@nstudio/nativescript-snackbar": "^2.1.0", "@triniwiz/nativescript-image-cache-it": "7.4.0", "autolinker": "^4.0.0", "bootstrap": "^4.5.2", "email-validator": "^2.0.4", "enhanced-resolve": "^4.1.1", "jwt-decode": "^2.2.0", "moment": "^2.30.1", "nativescript": "^8.6.5", "nativescript-audio": "~6.2.6", "nativescript-drop-down": "~6.0.2", "nativescript-imagecropper": "~4.0.3", "nativescript-livesync": "^1.4.1", "nativescript-mediafilepicker": "~4.0.2", "nativescript-modal-datetimepicker": "~2.1.5", "nativescript-oauth2": "~3.0.10", "nativescript-permissions": "~1.3.12", "nativescript-phone": "^3.0.3", "nativescript-screen-orientation": "~2.0.0", "nativescript-sqlite": "~2.8.6", "nativescript-themes": "^2.0.2", "nativescript-ui-listview": "~15.2.3", "nativescript-webview-utils": "~4.0.0", "ngx-linky": "~4.0.0", "qs": "npm:querystring@^0.2.1", "rxjs": "~7.5.0", "util": "^0.12.5", "zone.js": "^0.11.6" }, "devDependencies": { "@angular-devkit/build-angular": "~15.1.0", "@angular/compiler-cli": "~15.1.0", "@nativescript/android": "8.6.2", "@nativescript/ios": "8.6.3", "@nativescript/types": "~8.4.0", "@nativescript/webpack": "~5.0.18", "@ngtools/webpack": "~15.1.0", "sass": "^1.34.1", "typescript": "~4.9.4" }, "scripts": { "ns-bundle": "ns-bundle" }, "main": "app/main.ts", "hooks": [] } `