Skip to content

Commit d4176bb

Browse files
feat: request audio focus for api > 28 (nstudio#177)
1 parent 14d7328 commit d4176bb

File tree

2 files changed

+36
-9
lines changed

2 files changed

+36
-9
lines changed

src/android/player.ts

+34-8
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export enum AudioFocusDurationHint {
1414

1515
export class TNSPlayer implements TNSPlayerI {
1616
private _mediaPlayer: android.media.MediaPlayer;
17+
private _audioFocusRequest: android.media.AudioFocusRequest;
1718
private _mAudioFocusGranted: boolean = false;
1819
private _lastPlayerVolume; // ref to the last volume setting so we can reset after ducking
1920
private _events: Observable;
@@ -304,21 +305,37 @@ export class TNSPlayer implements TNSPlayerI {
304305
* Helper method to ensure audio focus.
305306
*/
306307
private _requestAudioFocus(): boolean {
307-
// If it does not enter the codition block, means that we already
308+
// If it does not enter the condition block, means that we already
308309
// have focus. Therefore we have to start with `true`.
309310
let result = true;
311+
let focusResult = null;
310312
if (!this._mAudioFocusGranted) {
311313
const ctx = this._getAndroidContext();
312314
const am = ctx.getSystemService(
313315
android.content.Context.AUDIO_SERVICE
314316
) as android.media.AudioManager;
315-
// Request audio focus for play back
316-
const focusResult = am.requestAudioFocus(
317-
this._mOnAudioFocusChangeListener,
318-
android.media.AudioManager.STREAM_MUSIC,
319-
this._durationHint
320-
);
321317

318+
// Request audio focus for play back
319+
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
320+
const playbackAttributes = new android.media.AudioAttributes.Builder()
321+
.setUsage(android.media.AudioAttributes.USAGE_MEDIA)
322+
.setContentType(android.media.AudioAttributes.CONTENT_TYPE_MUSIC)
323+
.build();
324+
325+
this._audioFocusRequest = new android.media.AudioFocusRequest.Builder(android.media.AudioManager.AUDIOFOCUS_GAIN)
326+
.setAudioAttributes(playbackAttributes)
327+
.setAcceptsDelayedFocusGain(true)
328+
.setOnAudioFocusChangeListener(this._mOnAudioFocusChangeListener)
329+
.build();
330+
focusResult = am.requestAudioFocus(this._audioFocusRequest);
331+
} else {
332+
focusResult = am.requestAudioFocus(
333+
this._mOnAudioFocusChangeListener,
334+
android.media.AudioManager.STREAM_MUSIC,
335+
this._durationHint
336+
);
337+
}
338+
322339
if (
323340
focusResult === android.media.AudioManager.AUDIOFOCUS_REQUEST_GRANTED
324341
) {
@@ -327,13 +344,22 @@ export class TNSPlayer implements TNSPlayerI {
327344
result = false;
328345
}
329346
}
347+
330348
return result;
331349
}
332350

333351
private _abandonAudioFocus(preserveMP: boolean = false): void {
334352
const ctx = this._getAndroidContext();
335353
const am = ctx.getSystemService(android.content.Context.AUDIO_SERVICE);
336-
const result = am.abandonAudioFocus(this._mOnAudioFocusChangeListener);
354+
let result = null;
355+
356+
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
357+
result = am.abandonAudioFocusRequest(this._audioFocusRequest);
358+
this._audioFocusRequest = null;
359+
} else {
360+
result = am.abandonAudioFocus(this._mOnAudioFocusChangeListener);
361+
}
362+
337363
// Normally we will preserve the MediaPlayer only when pausing
338364
if (this._mediaPlayer && !preserveMP) {
339365
this._mediaPlayer.release();

src/references.d.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
/// <reference path="./node_modules/@nativescript/types/index.d.ts" />
1+
/// <reference path="./node_modules/@nativescript/types-ios/index.d.ts" />
2+
/// <reference path="./node_modules/@nativescript/types-android/lib/android-29.d.ts" />

0 commit comments

Comments
 (0)