apache / apache/cordova-plugin-media

Android@10 not playing files served via https://localhost

Open
#345 6 comments 0 reactions 0 assignees View on GitHub
Dominant language
JavaScript
Stars
391
Forks
762
PR merge metrics
No merged PRs in 30d

Description

# Bug Report

## Problem

Files stored on the device which are accessed through `https://localhost` should start playing, but don't. Files play fine if accessed directly from the web. A simple Html5 player is able to play the file normally through `localhost`.

## Information

LogCat logs when playing file:
```
2022-06-01 20:59:30.446 23784-23895/io.cordova.hellocordova V/MediaHTTPService: MediaHTTPService(android.media.MediaHTTPService@771fbf7): Cookies: null
2022-06-01 20:59:30.456 23784-23895/io.cordova.hellocordova W/MediaPlayer: Use of stream types is deprecated for operations other than volume control
2022-06-01 20:59:30.456 23784-23895/io.cordova.hellocordova W/MediaPlayer: See the documentation of setAudioStreamType() for what to use instead with android.media.AudioAttributes to qualify your playback use case
2022-06-01 20:59:30.459 23784-23895/io.cordova.hellocordova W/AudioManager: Use of stream types is deprecated for operations other than volume control
2022-06-01 20:59:30.459 23784-23895/io.cordova.hellocordova W/AudioManager: See the documentation of requestAudioFocus() for what to use instead with android.media.AudioAttributes to qualify your playback use case
2022-06-01 20:59:30.462 23784-23895/io.cordova.hellocordova W/PluginManager: THREAD WARNING: exec() call to Media.startPlayingAudio blocked the main thread for 25ms. Plugin should use CordovaInterface.getThreadPool().
2022-06-01 20:59:30.463 23784-23884/io.cordova.hellocordova V/MediaHTTPService: makeHTTPConnection: CookieManager created: java.net.CookieManager@73fb182
2022-06-01 20:59:30.464 23784-23884/io.cordova.hellocordova V/MediaHTTPService: makeHTTPConnection(android.media.MediaHTTPService@771fbf7): cookieHandler: java.net.CookieManager@73fb182 Cookies: null
2022-06-01 20:59:30.468 23784-23784/io.cordova.hellocordova I/chromium: [INFO:CONSOLE(245)] "1", source: https://localhost/plugins/cordova-plugin-media/www/Media.js (245)
2022-06-01 20:59:30.724 23784-23846/io.cordova.hellocordova D/: PlayerBase::stop() from IPlayer
2022-06-01 20:59:30.724 23784-23846/io.cordova.hellocordova D/AudioTrack: stop() called with 980792 frames delivered
2022-06-01 21:00:00.719 23784-23884/io.cordova.hellocordova E/MediaPlayerNative: error (1, -2147483648)
2022-06-01 21:00:00.720 23784-23895/io.cordova.hellocordova E/MediaPlayer: Error (1,-2147483648)
2022-06-01 21:00:00.720 23784-23895/io.cordova.hellocordova D/AudioPlayer: AudioPlayer.onError(1, -2147483648)
2022-06-01 21:00:00.721 23784-23895/io.cordova.hellocordova V/MediaPlayer: resetDrmState: mDrmInfo=null mDrmProvisioningThread=null mPrepareDrmInProgress=false mActiveDrmScheme=false
2022-06-01 21:00:00.721 23784-23895/io.cordova.hellocordova V/MediaPlayer: cleanDrmObj: mDrmObj=null mDrmSessionId=null
2022-06-01 21:00:00.729 23784-23784/io.cordova.hellocordova I/chromium: [INFO:CONSOLE(261)] "[object Object]", source: https://localhost/plugins/cordova-plugin-media/www/Media.js (261)
```

Notice the error:
```
2022-06-01 21:00:00.719 23784-23884/io.cordova.hellocordova E/MediaPlayerNative: error (1, -2147483648)
2022-06-01 21:00:00.720 23784-23895/io.cordova.hellocordova E/MediaPlayer: Error (1,-2147483648)
```

### Command or Code

Some code snippets that can be run in chrome console when inspecting device

Download sample wav file
```
(() => {
const fileTransfer = new FileTransfer();
const TIMEOUT_INTERVAL = 30 * 1000;
const filePath = window.cordova.file.dataDirectory + "test.wav";

fileTransfer.download(
"https://github.com/prof3ssorSt3v3/media-sample-files/blob/master/jimmy-coffee.wav?raw=true",
filePath,
file => console.log(file.toURL()),
error => console.error(error)
);
})()
// returns: https://localhost/__cdvfile_files__/test.wav
```

NOT WORKING: Play file locally with cordova-plugin-media (This is the bug)
```
source = 'http://localhost/__cdvfile_files__/test.wav';
track = new Media(source, null, console.error, console.log);
track.play();
```

WORKING: Play file remotely with cordova-plugin-media
```
source = 'https://github.com/prof3ssorSt3v3/media-sample-files/blob/master/jimmy-coffee.wav?raw=true';
track = new Media(source, null, console.error, console.log);
track.play();
```

WORKING: Play file locally with html5
```
sound = new Audio("http://localhost/__cdvfile_files__/test.wav");
sound.play();
```

### Environment, Platform, Device

Device: Android 8.1 (API 27)

### Version information

Cordova CLI: 11.0.0
Cordova Platforms: android 10.1.2
Cordova Plugins:

- cordova-plugin-file-transfer 2.0.0-dev "File Transfer"
- cordova-plugin-file 7.0.0 "File"
- cordova-plugin-media 6.0.0 "Media"

## Checklist

- [x] I searched for existing GitHub issues
- [x] I updated all Cordova tooling to most recent version
- [x] I included all the necessary information above

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the issue with the provided Media.js snippets on Android 8.1, then trace Media.startPlayingAudio and the native AudioPlayer path referenced by the logs. The work is done when a WAV file served through the local https://localhost URL plays through cordova-plugin-media as it does through HTML5 audio.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, java, javascript
Domain
audio-video-rtc, mobile
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.