Giter Site home page Giter Site logo

doublesymmetry / react-native-track-player Goto Github PK

View Code? Open in Web Editor NEW
3.1K 50.0 968.0 45.17 MB

A fully fledged audio module created for music apps. Provides audio playback, external media controls, background mode and more!

Home Page: https://rntp.dev/

License: Apache License 2.0

Java 2.29% JavaScript 1.62% Swift 17.83% Objective-C 2.90% Ruby 0.92% TypeScript 31.24% C 0.17% C++ 15.47% Kotlin 26.87% Shell 0.22% Objective-C++ 0.35% HTML 0.13%
react-native music-player music-library media-control android ios windows audio audio-library audio-player

react-native-track-player's People

Contributors

0xlethe avatar alangumer avatar alpha0010 avatar anderslemke avatar austinried avatar biomancer avatar brad-sf avatar curiousdustin avatar dcvz avatar dependabot[bot] avatar fivecar avatar formula1 avatar guichaguri avatar hybridfox avatar jason-cooke avatar jspizziri avatar kaioduarte avatar kirillzyusko avatar lovegaoshi avatar mitchdowney avatar moduval avatar mpivchev avatar nagyszili avatar puckey avatar rkbhochalya avatar rtmalone avatar spice-z avatar thessler27 avatar timmywil avatar xiaoxu193 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

react-native-track-player's Issues

skipToNext on player-ended leapfrogs a song

Let's say I have tracks 1,2,3,4. When 1 finishes playing, I want to fire skipToNext on player-ended in background headless task. This seems to start track 3, rather than track 2? However, if song 1 is mid-way through and I get impatient and decide to move along, triggering skipToNext while player-playing takes me to 2, as expected.

Fix Chromecast

The Chromecast support is not very reliable as it uses the old Cast SDK v2.
The objective is to update it to the Cast SDK v3 and find a way to have custom application ids.

[iOS] Having `%` in URLs break the player

Having an audio URL like this:

https://d23q6m8guwx14t.cloudfront.net/e1173810-9496-11e7-afc9-25da05a60416/mindstel%C3%B8n_mixdown.mp3

will make the AudioPlayer fail.

Queue/Playlist API

This is not only a good idea for general design, but it also helps for better performance on Chromecast devices.

APIs that are going to change:

  • setMetadata() will be removed. load() will be accepting metadata
  • load() can be called multiple times. The songs will be added to the queue
  • reset() will now reset the queue

APIs that are going to be added:

  • skip() will skip to a song based on ID
  • skipToNext() will skip to the next song
  • skipToPrevious()will skip to the previous song
  • Functions for removing/clearing the queue without resetting the player

It might be a good idea to rename load() to something else

Possible wake lock bug

I've seen the app crash a couple times when starting a song -- managed to grab a log. Looks like it has something to do wake lock?

06-11 15:47:28.972 30812 31653 E AndroidRuntime: FATAL EXCEPTION: mqt_native_modules
06-11 15:47:28.972 30812 31653 E AndroidRuntime: Process: com.decoderhq.indieshuffle, PID: 30812
06-11 15:47:28.972 30812 31653 E AndroidRuntime: java.lang.RuntimeException: WakeLock under-locked track-player-wake-lock
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at android.os.PowerManager$WakeLock.release(PowerManager.java:1300)
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at android.os.PowerManager$WakeLock.release(PowerManager.java:1270)
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at guichaguri.trackplayer.logic.MediaManager.onPlayerStop(MediaManager.java:315)
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at guichaguri.trackplayer.logic.MediaManager.onStop(MediaManager.java:169)
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at guichaguri.trackplayer.player.Player.updateState(Player.java:213)
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at guichaguri.trackplayer.player.players.ExoPlayer.onPlayerStateChanged(ExoPlayer.java:199)
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at com.google.android.exoplayer2.ExoPlayerImpl.handleEvent(ExoPlayerImpl.java:326)
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at com.google.android.exoplayer2.ExoPlayerImpl$1.handleMessage(ExoPlayerImpl.java:93)
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:102)
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:154)
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:208)
06-11 15:47:28.972 30812 31653 E AndroidRuntime:        at java.lang.Thread.run(Thread.java:761)
06-11 15:47:28.977  4888  4906 W ActivityManager:   Force finishing activity com.decoderhq.indieshuffle/.MainActivity

No task registered for key TrackPlayer

hi all , first of all thank you for this package , its very useful
today i init a new project but when i setup it gets me an error below:

TrackPlayerModule.setupPlayer got 2 arguments, expected 3
invoke
    JavaMethodWrapper.java:344

so i change my code to this for setup: TrackPlayer.setupPlayer({});
it works!

after that when i call add every thinks is ok but if i TrackPlayer.play() i have error:

No task registered for key TrackPlayer
startHeadlessTask
    C:\Users\Mohammad\Desktop\Player\node_modules\react-native\Libraries\ReactNative\AppRegistry.js:222:12

all of my app codes:

import React, { Component } from 'react';
import {
  StyleSheet,
  View,
  Button
} from 'react-native';
import TrackPlayer from 'react-native-track-player';

export default class App extends Component {

  async componentDidMount() {
    await TrackPlayer.setupPlayer({});
    await TrackPlayer.add({
      id: 'track',
      url: 'http://tegos.kz/new/mp3_full/Luis_Fonsi_feat._Daddy_Yankee_-_Despacito.mp3', // just for test!
      title: 'Despacito',
      artist: 'Luis Fonsi Feat. Daddy Yankee',
      artwork: 'https://images-eu.ssl-images-amazon.com/images/I/61JH2ggghmL._AC_US160_.jpg'
    })
    TrackPlayer.play();
  }

  render() {
    return (
      <View style={styles.container}>

        <Button onPress={() => this.play()} title="play" color="#841584" accessibilityLabel="Learn more about this purple button" />
        <Button onPress={() => TrackPlayer.stop()} title="stop" color="#841584" accessibilityLabel="Learn more about this purple button" />
      </View>
    );
  }

  play() {
    TrackPlayer.add({
      id: 'track',
      url: 'http://tegos.kz/new/mp3_full/Luis_Fonsi_feat._Daddy_Yankee_-_Despacito.mp3',
      title: 'Despacito',
      artist: 'Luis Fonsi Feat. Daddy Yankee',
      artwork: 'https://images-eu.ssl-images-amazon.com/images/I/61JH2ggghmL._AC_US160_.jpg'
    }).then(() => {
      TrackPlayer.play();
    });
  }

}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  }
});

how i can fix this?
dependencies:

  • "react": "16.0.0-beta.5",
  • "react-native": "0.49.3",
  • "react-native-cli": "^2.0.1",
  • "react-native-fetch-blob": "^0.10.8",
  • "react-native-track-player": "^0.1.0"

iOS automatic next song not actually playing?

As reported via chat, the eventEmitter works fine to detect that the track has changed, but the new song doesn't actually start playing? skipToNext() works fine, just not the automatic switch. Have you seen this on your side?

Can't load or add

If I try run the following, I get the attached error:

  var id = store.playerId // from createPlayer -- usually 0 (zero)
   var mediaInfo = {
       id: '1234',
       url: 'https://api.soundcloud.com/tracks/278939950/stream?client_id=859f207b8732ba827b2bc008608089|', // Load remote media
       title: 'Avaritia',
       artist: 'deadmau5',
       album: 'while(1<2)',
       genre: 'Progressive House, Electro House',
       date: '2014-05-20T07:00:00+00:00', // RFC 3339
       artwork: 'https://i1.sndcdn.com/artworks-000214312426-rc08ol-t500x500.jpg',
       // Set cache to "null" or "undefined" to disable it
       cache: {
           maxFiles: 10, // The maximum amount of files
           maxSize: 1024 // The maximum total size in kilobytes
       }
   }
   TrackPlayer.load(id,mediaInfo).then(function() {
       TrackPlayer.play(id)
   }, function(err) {
       console.log(err)
   })

screenshot_1492340644

[Android] Error - No task registered for key TrackPlayer

I've started testing this library on Android and so far it works great.

I'm just having an issue that maybe is related to missing configuration on my part.
But I've reading the documentation and followed all the steps indicated. Maybe you guys could point me in the right direction.

This error appears every time an action (play, pause, add tracks, ...) on the player is run.
Do you know what could be the reason?

ExceptionsManager.js:65 No task registered for key TrackPlayer

error

Thanks in advance,
Jon.

[Android] NullPointerException on Track.<init>

Seeing the below error come up a lot in my logs.

Here's one from a Samsung Galaxy Note5 (nobleltevzw), 4096MB RAM, Android 7.0.

java.lang.NullPointerException: 
  at guichaguri.trackplayer.logic.track.Track.<init> (Track.java:84)
  at guichaguri.trackplayer.logic.components.MediaWrapper$2.run (MediaWrapper.java:49)
  at android.os.Handler.handleCallback (Handler.java:751)
  at android.os.Handler.dispatchMessage (Handler.java:95)
  at android.os.Looper.loop (Looper.java:154)
  at android.app.ActivityThread.main (ActivityThread.java:6682)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1534)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1424)

I noticed voice calls will resume a paused player

If I had a notifcation open but paused it -- coming back 20 minutes later to make a WhatsApp phone call triggers the audio again and it starts playing while I'm making my call. As soon as I hang up, it stops playing. I also noticed the issue while recording a voice note -- when I started recording, the music came back on; as soon as I stopped, the music ended.

Issue with remote mp3s?

The last two commits got me through issues #7 and #8 -- thank you! I've now stepped forward to a new error when I try TrackPlayer.load() with a remote mp3. Here's an example:

04-16 19:16:05.580  4345  4489 W MediaPlayer: Couldn't open file on client side; trying server side: java.io.FileNotFoundException: No content provider: https://archive.org/download/testmp3testfile/mpthreetest.m
p3

I haven't tested a local mp3.

Possible to insertAfterId instead of insertBeforeId on add()?

The functionality I'm trying to accomplish is:

  1. User hits play on a song, and I load() that song
  2. In the background, I fetch the accompanying playlist of next songs for that song
  3. I then create an object of the new songs, and try to add() them

I'd want this new playlist to fill in after the current song. Is that possible?

[Android] RuntimeException com.google.android.gms.cast.framework.CastContext.<init>

Coming from a Google Pixel XL.

java.lang.RuntimeException: 
  at android.app.ActivityThread.handleCreateService (ActivityThread.java:3414)
  at android.app.ActivityThread.-wrap4 (Unknown Source)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1683)
  at android.os.Handler.dispatchMessage (Handler.java:105)
  at android.os.Looper.loop (Looper.java:164)
  at android.app.ActivityThread.main (ActivityThread.java:6541)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.Zygote$MethodAndArgsCaller.run (Zygote.java:240)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:767)
Caused by: java.lang.RuntimeException: 
  at com.google.android.gms.internal.zzni.zzbg (Unknown Source:35)
  at com.google.android.gms.internal.zzni.zza (Unknown Source)
  at com.google.android.gms.cast.framework.CastContext.<init> (Unknown Source:123)
  at com.google.android.gms.cast.framework.CastContext.getSharedInstance (Unknown Source:36)
  at guichaguri.trackplayer.cast.GoogleCast.<init> (GoogleCast.java:32)
  at guichaguri.trackplayer.logic.MediaManager.<init> (MediaManager.java:45)
  at guichaguri.trackplayer.logic.services.PlayerService.onCreate (PlayerService.java:76)
  at android.app.ActivityThread.handleCreateService (ActivityThread.java:3404)

[Android] NullPointerException on setupPlayer

This is a new error affecting a lot of users since the last commit :(

java.lang.NullPointerException: 
  at guichaguri.trackplayer.TrackModule.setupPlayer (TrackModule.java:151)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.facebook.react.bridge.BaseJavaModule$JavaMethod.invoke (BaseJavaModule.java:368)
  at com.facebook.react.cxxbridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:138)
  at com.facebook.react.bridge.queue.NativeRunnable.run (Native Method)
  at android.os.Handler.handleCallback (Handler.java:751)
  at android.os.Handler.dispatchMessage (Handler.java:95)
  at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java:31)
  at android.os.Looper.loop (Looper.java:154)
  at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run (MessageQueueThreadImpl.java:208)
  at java.lang.Thread.run (Thread.java:762)

Audio doesn't actually play?

I fire this:

load(id,song).then(function() {
  TrackPlayer.play(id)
})

And no music plays. The following shows up in the logs.

04-16 21:58:57.880  6858  8254 W MediaPlayer: Couldn't open file on client side; trying server side: java.io.FileNotFoundException: No content provider: https://api.soundcloud.com/tracks/278939950/stream?client_id=859f207b8732ba827b2bc00860808909
04-16 21:58:57.882  1620  2775 I MediaFocusControl:  AudioFocus  requestAudioFocus() from android.media.AudioManager@3e43528guichaguri.trackplayer.logic.components.FocusManager@54d0241 req=1flags=0x0
04-16 21:58:57.883  6858  6914 W MessageQueue: Handler (android.media.AudioManager$FocusEventHandlerDelegate$1) {7bff3e6} sending message to a Handler on a dead thread
04-16 21:58:57.883  6858  6914 W MessageQueue: java.lang.IllegalStateException: Handler (android.media.AudioManager$FocusEventHandlerDelegate$1) {7bff3e6} sending message to a Handler on a dead thread
04-16 21:58:57.883  6858  6914 W MessageQueue:  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543)
04-16 21:58:57.883  6858  6914 W MessageQueue:  at android.os.Handler.enqueueMessage(Handler.java:631)
04-16 21:58:57.883  6858  6914 W MessageQueue:  at android.os.Handler.sendMessageAtTime(Handler.java:600)
04-16 21:58:57.883  6858  6914 W MessageQueue:  at android.os.Handler.sendMessageDelayed(Handler.java:570)
04-16 21:58:57.883  6858  6914 W MessageQueue:  at android.os.Handler.sendMessage(Handler.java:507)
04-16 21:58:57.883  6858  6914 W MessageQueue:  at android.media.AudioManager$1.dispatchAudioFocusChange(AudioManager.java:2165)
04-16 21:58:57.883  6858  6914 W MessageQueue:  at android.media.IAudioFocusDispatcher$Stub.onTransact(IAudioFocusDispatcher.java:57)
04-16 21:58:57.883  6858  6914 W MessageQueue:  at android.os.Binder.execTransact(Binder.java:453)
04-16 21:58:57.883  6858  8253 I ReactNativeJS: player-state
04-16 21:58:57.885  6858  8253 I ReactNativeJS: player-state
04-16 21:58:57.887  6858  8253 I ReactNativeJS: player-playing
04-16 21:58:58.572  1344  8264 I NuCachedSource2: new range: offset= 4476548
04-16 21:58:59.968  1344  8264 I NuCachedSource2: caching reached eos.
04-16 21:59:00.017  1344  8262 D NuPlayerDriver: notifyListener_l(0xf615af80), (3, 100, 0)
04-16 21:59:00.017  1344  8262 D NuPlayerDriver: notifyListener_l(0xf615af80), (1, 0, 0)
04-16 21:59:00.033  6858  8254 D MediaPlayer: setSubtitleAnchor in MediaPlayer
04-16 21:59:00.041  1253  1311 D hwcomposer: hw_composer sent 3491 syncs in 60s
04-16 21:59:00.076  6858  8253 I ReactNativeJS: player-state
04-16 21:59:00.079  1620  2075 I MediaFocusControl:  AudioFocus  abandonAudioFocus() from android.media.AudioManager@3e43528guichaguri.trackplayer.logic.components.FocusManager@54d0241
04-16 21:59:00.080  6858  6914 W MessageQueue: Handler (android.media.AudioManager$FocusEventHandlerDelegate$1) {7bff3e6} sending message to a Handler on a dead thread
04-16 21:59:00.080  6858  6914 W MessageQueue: java.lang.IllegalStateException: Handler (android.media.AudioManager$FocusEventHandlerDelegate$1) {7bff3e6} sending message to a Handler on a dead thread
04-16 21:59:00.080  6858  6914 W MessageQueue:  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543)
04-16 21:59:00.080  6858  6914 W MessageQueue:  at android.os.Handler.enqueueMessage(Handler.java:631)
04-16 21:59:00.080  6858  6914 W MessageQueue:  at android.os.Handler.sendMessageAtTime(Handler.java:600)
04-16 21:59:00.080  6858  6914 W MessageQueue:  at android.os.Handler.sendMessageDelayed(Handler.java:570)
04-16 21:59:00.080  6858  6914 W MessageQueue:  at android.os.Handler.sendMessage(Handler.java:507)
04-16 21:59:00.080  6858  6914 W MessageQueue:  at android.media.AudioManager$1.dispatchAudioFocusChange(AudioManager.java:2165)
04-16 21:59:00.080  6858  6914 W MessageQueue:  at android.media.IAudioFocusDispatcher$Stub.onTransact(IAudioFocusDispatcher.java:57)
04-16 21:59:00.080  6858  6914 W MessageQueue:  at android.os.Binder.execTransact(Binder.java:453)
04-16 21:59:00.082  6858  8253 I ReactNativeJS: player-state
04-16 21:59:00.082  1344  1657 D NuPlayerDriver: start(0xf615af80), state is 4, eos is 0
04-16 21:59:00.082  1344  8262 I GenericSource: start
04-16 21:59:00.082  1344  8264 I NuCachedSource2: new range: offset= 0
04-16 21:59:00.084  1620  1758 I MediaFocusControl:  AudioFocus  requestAudioFocus() from android.media.AudioManager@3e43528guichaguri.trackplayer.logic.components.FocusManager@54d0241 req=1flags=0x0
04-16 21:59:00.085  6858  6869 W MessageQueue: Handler (android.media.AudioManager$FocusEventHandlerDelegate$1) {7bff3e6} sending message to a Handler on a dead thread
04-16 21:59:00.085  6858  6869 W MessageQueue: java.lang.IllegalStateException: Handler (android.media.AudioManager$FocusEventHandlerDelegate$1) {7bff3e6} sending message to a Handler on a dead thread
04-16 21:59:00.085  6858  6869 W MessageQueue:  at android.os.MessageQueue.enqueueMessage(MessageQueue.java:543)
04-16 21:59:00.085  6858  6869 W MessageQueue:  at android.os.Handler.enqueueMessage(Handler.java:631)
04-16 21:59:00.085  6858  6869 W MessageQueue:  at android.os.Handler.sendMessageAtTime(Handler.java:600)
04-16 21:59:00.085  6858  6869 W MessageQueue:  at android.os.Handler.sendMessageDelayed(Handler.java:570)
04-16 21:59:00.085  6858  6869 W MessageQueue:  at android.os.Handler.sendMessage(Handler.java:507)
04-16 21:59:00.085  6858  6869 W MessageQueue:  at android.media.AudioManager$1.dispatchAudioFocusChange(AudioManager.java:2165)
04-16 21:59:00.085  6858  6869 W MessageQueue:  at android.media.IAudioFocusDispatcher$Stub.onTransact(IAudioFocusDispatcher.java:57)
04-16 21:59:00.085  6858  6869 W MessageQueue:  at android.os.Binder.execTransact(Binder.java:453)
04-16 21:59:00.093  6858  8253 I ReactNativeJS: player-pause
04-16 21:59:00.098  6858  8253 I ReactNativeJS: player-loaded
04-16 21:59:00.101  6858  8253 I ReactNativeJS: player-state
04-16 21:59:00.105  6858  8253 I ReactNativeJS: player-playing
04-16 21:59:00.680  1344  8264 I NuCachedSource2: retrying a previously failed read succeeded.
04-16 21:59:00.684  1344  8262 D NuPlayerDriver: notifyListener_l(0xf615af80), (3, 1, 0)
04-16 21:59:00.697  1344  8271 E OMXNodeInstance: setConfig(2f:google.mp3.decoder, ConfigPriority(0x6f800002)) ERROR: Undefined(0x80001001)
04-16 21:59:00.697  1344  8271 I ACodec  : codec does not support config priority (err -2147483648)
04-16 21:59:00.698  1344  8271 I MediaCodec: MediaCodec will operate in async mode
04-16 21:59:00.722  1344  8262 D NuPlayerDriver: notifyListener_l(0xf615af80), (6, 0, 0)
04-16 21:59:00.741  6858  8253 I ReactNativeJS: player-state
04-16 21:59:00.836  1344  1655 D AudioFlinger: mixer(0xf44c0000) throttle end: throttle time(6)
04-16 21:59:01.683  1344  8262 D NuPlayerDriver: notifyListener_l(0xf615af80), (3, 31, 0)
04-16 21:59:01.699  6858  8253 I ReactNativeJS: player-state
04-16 21:59:02.683  1344  8262 D NuPlayerDriver: notifyListener_l(0xf615af80), (3, 51, 0)
04-16 21:59:02.704  6858  8253 I ReactNativeJS: player-state
04-16 21:59:03.684  1344  8262 D NuPlayerDriver: notifyListener_l(0xf615af80), (3, 73, 0)
04-16 21:59:03.689  6858  8253 I ReactNativeJS: player-state
04-16 21:59:04.276  1344  8264 I NuCachedSource2: caching reached eos.
04-16 21:59:04.685  1344  8262 D NuPlayerDriver: notifyListener_l(0xf615af80), (3, 100, 0)
04-16 21:59:04.690  6858  8253 I ReactNativeJS: player-state

Split Chromecast code into another module

Since Chromecast require Google Play Services and its library available, it would be better to split the Chromecast code into another module.

I'm still thinking into creating a submodule (where you need react-native-track-player to run it) or an independent module (Chromecast focused, but it has special support to react-native-track-player)

[Android] NullPointerException on TrackModule.pause

Here's one I've seen pop up 7 times so far (not that many):

java.lang.NullPointerException: 
  at guichaguri.trackplayer.TrackModule.pause (TrackModule.java:202)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.facebook.react.bridge.BaseJavaModule$JavaMethod.invoke (BaseJavaModule.java:368)
  at com.facebook.react.cxxbridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:138)
  at com.facebook.react.bridge.queue.NativeRunnable.run (Native Method)
  at android.os.Handler.handleCallback (Handler.java:739)
  at android.os.Handler.dispatchMessage (Handler.java:95)
  at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java:31)
  at android.os.Looper.loop (Looper.java:148)
  at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run (MessageQueueThreadImpl.java:208)
  at java.lang.Thread.run (Thread.java:818)

[Android] RuntimeException on MediaNotification.update

On a Samsung Galaxy J1:

java.lang.RuntimeException: 
  at android.os.Parcel.readIntArray (Parcel.java:827)
  at android.app.INotificationManager$Stub$Proxy.enqueueNotificationWithTag (INotificationManager.java:348)
  at android.app.NotificationManager.notify (NotificationManager.java:161)
  at android.support.v4.app.NotificationManagerCompat$ImplBase.postNotification (NotificationManagerCompat.java:179)
  at android.support.v4.app.NotificationManagerCompat.notify (NotificationManagerCompat.java:290)
  at android.support.v4.app.NotificationManagerCompat.notify (NotificationManagerCompat.java:274)
  at guichaguri.trackplayer.metadata.components.MediaNotification.update (MediaNotification.java:224)
  at guichaguri.trackplayer.metadata.components.MediaNotification.updatePlayback (MediaNotification.java:155)
  at guichaguri.trackplayer.metadata.Metadata.updatePlayback (Metadata.java:172)
  at guichaguri.trackplayer.logic.MediaManager.onPlaybackUpdate (MediaManager.java:246)
  at guichaguri.trackplayer.player.Playback.updateState (Playback.java:191)
  at guichaguri.trackplayer.player.players.ExoPlayback.onLoadingChanged (ExoPlayback.java:195)
  at com.google.android.exoplayer2.ExoPlayerImpl.handleEvent (ExoPlayerImpl.java:371)
  at com.google.android.exoplayer2.ExoPlayerImpl$1.handleMessage (ExoPlayerImpl.java:99)
  at android.os.Handler.dispatchMessage (Handler.java:102)
  at android.os.Looper.loop (Looper.java:136)
  at android.app.ActivityThread.main (ActivityThread.java:5584)
  at java.lang.reflect.Method.invokeNative (Native Method)
  at java.lang.reflect.Method.invoke (Method.java:515)
  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:1268)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1084)
  at dalvik.system.NativeStart.main (Native Method)

Android BUILD FAILED

FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring project ':app'.
> Could not resolve all dependencies for configuration ':app:_debugApk'.
   > A problem occurred configuring project ':react-native-track-player'.
      > You have not accepted the license agreements of the following SDK components:
[Google Repository].

How to solve ?

    "react": "16.0.0-alpha.6",
    "react-native": "0.43.4",
    "react-native-track-player": "0.0.2",

Attempt to invoke virtual method 'boolean guichaguri.trackplayer.logic.track.Track.needsNetwork()' on a null object reference

Another little crash that's popping up:

06-12 13:30:56.934  6738  6994 E AndroidRuntime: Process: com.decoderhq.indieshuffle, PID: 6738
06-12 13:30:56.934  6738  6994 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean guichaguri.trackplayer.logic.track.Track.needsNetwork()' on a null object reference
06-12 13:30:56.934  6738  6994 E AndroidRuntime:        at guichaguri.trackplayer.logic.MediaManager.onPlayerStop(MediaManager.java:317)
06-12 13:30:56.934  6738  6994 E AndroidRuntime:        at guichaguri.trackplayer.logic.MediaManager.onStop(MediaManager.java:169)
06-12 13:30:56.934  6738  6994 E AndroidRuntime:        at guichaguri.trackplayer.player.Player.updateState(Player.java:213)
06-12 13:30:56.934  6738  6994 E AndroidRuntime:        at guichaguri.trackplayer.player.players.ExoPlayer.onPlayerStateChanged(ExoPlayer.java:199)
06-12 13:30:56.934  6738  6994 E AndroidRuntime:        at com.google.android.exoplayer2.ExoPlayerImpl.handleEvent(ExoPlayerImpl.java:326)
06-12 13:30:56.934  6738  6994 E AndroidRuntime:        at com.google.android.exoplayer2.ExoPlayerImpl$1.handleMessage(ExoPlayerImpl.java:93)
06-12 13:30:56.934  6738  6994 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:102)
06-12 13:30:56.934  6738  6994 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:148)
06-12 13:30:56.934  6738  6994 E AndroidRuntime:        at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:208)
06-12 13:30:56.934  6738  6994 E AndroidRuntime:        at java.lang.Thread.run(Thread.java:818)
06-12 13:30:56.938  1618  2967 W ActivityManager:   Force finishing activity com.decoderhq.indieshuffle/.MainActivity

getCurrentTrack returns null

If I fire this while a song is playing:

    TrackPlayer.getCurrentTrack(id,function(string) {
        console.log(string)
    })

I get string = null. I'm hoping to use this feature so that if the app does close in the background while the player keeps going, when resuming the app I'm able to restore the state and show the currently playing song in the UI. From the docs, it seems like it's expected to return the track ID? Would be cool if it returned the whole object, including artist name, song title, artwork, etc.

Design a better MediaBrowser handler

Currently, the MediaBrowser only shows the queue of the player, triggering skip events when a user clicks on a track.
The idea is to make it work with custom content, such as playlists.

setupPlayer causes crash on Android 7.0?

On Android 7.0 device (Huawei) I get the following error when I try to run await TrackPlayer.setupPlayer({})

09-09 22:44:00.556 23584 23606 I ServiceManager: Waiting for service SurfaceFlinger...
09-09 22:44:00.593   755   755 I art     : Rejecting re-init on previously-failed class java.lang.Class<com.google.android.gms.cast.framework.CastOptions>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/internal/safeparcel/AbstractSafeParcelable;
09-09 22:44:00.594   755   755 I art     :   at com.google.android.gms.cast.framework.CastContext com.google.android.gms.cast.framework.CastContext.getSharedInstance(android.content.Context) ((null):-1)
09-09 22:44:00.594   755   755 I art     :   at void guichaguri.trackplayer.cast.GoogleCast.<init>(android.content.Context, guichaguri.trackplayer.logic.MediaManager) (GoogleCast.java:32)
09-09 22:44:00.594   755   755 I art     :   at void guichaguri.trackplayer.logic.MediaManager.<init>(guichaguri.trackplayer.logic.services.PlayerService) (MediaManager.java:45)
09-09 22:44:00.594   755   755 I art     :   at void guichaguri.trackplayer.logic.services.PlayerService.onCreate() (PlayerService.java:70)
09-09 22:44:00.594   755   755 I art     :   at void android.app.ActivityThread.handleCreateService(android.app.ActivityThread$CreateServiceData) (ActivityThread.java:3328)
09-09 22:44:00.594   755   755 I art     :   at void android.app.ActivityThread.-wrap5(android.app.ActivityThread, android.app.ActivityThread$CreateServiceData) (ActivityThread.java:-1)
09-09 22:44:00.594   755   755 I art     :   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1659)
09-09 22:44:00.594   755   755 I art     :   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
09-09 22:44:00.594   755   755 I art     :   at void android.os.Looper.loop() (Looper.java:156)
09-09 22:44:00.594   755   755 I art     :   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6523)
09-09 22:44:00.594   755   755 I art     :   at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
09-09 22:44:00.594   755   755 I art     :   at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:941)
09-09 22:44:00.594   755   755 I art     :   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:831)
09-09 22:44:00.594   755   755 I art     : Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable" on path: DexPathList[[zip file "/data/app/com.decoderhq.indieshuffle-1/base.apk"],nativeLibraryDirectories=[/data/app/com.decoderhq.indieshuffle-1/lib/arm, /system/fake-libs, /data/app/com.decoderhq.indieshuffle-1/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib, /system/vendor/lib, /product/lib]]
09-09 22:44:00.594   755   755 I art     :   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
09-09 22:44:00.594   755   755 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
09-09 22:44:00.594   755   755 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
09-09 22:44:00.594   755   755 I art     :   at com.google.android.gms.cast.framework.CastContext com.google.android.gms.cast.framework.CastContext.getSharedInstance(android.content.Context) ((null):-1)
09-09 22:44:00.594   755   755 I art     :   at void guichaguri.trackplayer.cast.GoogleCast.<init>(android.content.Context, guichaguri.trackplayer.logic.MediaManager) (GoogleCast.java:32)
09-09 22:44:00.594   755   755 I art     :   at void guichaguri.trackplayer.logic.MediaManager.<init>(guichaguri.trackplayer.logic.services.PlayerService) (MediaManager.java:45)
09-09 22:44:00.594   755   755 I art     :   at void guichaguri.trackplayer.logic.services.PlayerService.onCreate() (PlayerService.java:70)
09-09 22:44:00.594   755   755 I art     :   at void android.app.ActivityThread.handleCreateService(android.app.ActivityThread$CreateServiceData) (ActivityThread.java:3328)
09-09 22:44:00.594   755   755 I art     :   at void android.app.ActivityThread.-wrap5(android.app.ActivityThread, android.app.ActivityThread$CreateServiceData) (ActivityThread.java:-1)
09-09 22:44:00.594   755   755 I art     :   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1659)
09-09 22:44:00.594   755   755 I art     :   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
09-09 22:44:00.594   755   755 I art     :   at void android.os.Looper.loop() (Looper.java:156)
09-09 22:44:00.594   755   755 I art     :   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6523)
09-09 22:44:00.594   755   755 I art     :   at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
09-09 22:44:00.594   755   755 I art     :   at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:941)
09-09 22:44:00.594   755   755 I art     :   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:831)
09-09 22:44:00.594   755   755 I art     : 
09-09 22:44:00.594   755   755 I art     : Rejecting re-init on previously-failed class java.lang.Class<com.google.android.gms.cast.framework.CastOptions>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/gms/common/internal/safeparcel/AbstractSafeParcelable;
09-09 22:44:00.594   755   755 I art     :   at com.google.android.gms.cast.framework.CastContext com.google.android.gms.cast.framework.CastContext.getSharedInstance(android.content.Context) ((null):-1)
09-09 22:44:00.594   755   755 I art     :   at void guichaguri.trackplayer.cast.GoogleCast.<init>(android.content.Context, guichaguri.trackplayer.logic.MediaManager) (GoogleCast.java:32)
09-09 22:44:00.594   755   755 I art     :   at void guichaguri.trackplayer.logic.MediaManager.<init>(guichaguri.trackplayer.logic.services.PlayerService) (MediaManager.java:45)
09-09 22:44:00.594   755   755 I art     :   at void guichaguri.trackplayer.logic.services.PlayerService.onCreate() (PlayerService.java:70)
09-09 22:44:00.594   755   755 I art     :   at void android.app.ActivityThread.handleCreateService(android.app.ActivityThread$CreateServiceData) (ActivityThread.java:3328)
09-09 22:44:00.594   755   755 I art     :   at void android.app.ActivityThread.-wrap5(android.app.ActivityThread, android.app.ActivityThread$CreateServiceData) (ActivityThread.java:-1)
09-09 22:44:00.594   755   755 I art     :   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1659)
09-09 22:44:00.595   755   755 I art     :   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
09-09 22:44:00.595   755   755 I art     :   at void android.os.Looper.loop() (Looper.java:156)
09-09 22:44:00.595   755   755 I art     :   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6523)
09-09 22:44:00.595   755   755 I art     :   at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
09-09 22:44:00.595   755   755 I art     :   at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:941)
09-09 22:44:00.595   755   755 I art     :   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:831)
09-09 22:44:00.595   755   755 I art     : Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable" on path: DexPathList[[zip file "/data/app/com.decoderhq.indieshuffle-1/base.apk"],nativeLibraryDirectories=[/data/app/com.decoderhq.indieshuffle-1/lib/arm, /system/fake-libs, /data/app/com.decoderhq.indieshuffle-1/base.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib, /system/vendor/lib, /product/lib]]
09-09 22:44:00.595   755   755 I art     :   at java.lang.Class dalvik.system.BaseDexClassLoader.findClass(java.lang.String) (BaseDexClassLoader.java:56)
09-09 22:44:00.595   755   755 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String, boolean) (ClassLoader.java:380)
09-09 22:44:00.595   755   755 I art     :   at java.lang.Class java.lang.ClassLoader.loadClass(java.lang.String) (ClassLoader.java:312)
09-09 22:44:00.595   755   755 I art     :   at com.google.android.gms.cast.framework.CastContext com.google.android.gms.cast.framework.CastContext.getSharedInstance(android.content.Context) ((null):-1)
09-09 22:44:00.595   755   755 I art     :   at void guichaguri.trackplayer.cast.GoogleCast.<init>(android.content.Context, guichaguri.trackplayer.logic.MediaManager) (GoogleCast.java:32)
09-09 22:44:00.595   755   755 I art     :   at void guichaguri.trackplayer.logic.MediaManager.<init>(guichaguri.trackplayer.logic.services.PlayerService) (MediaManager.java:45)
09-09 22:44:00.595   755   755 I art     :   at void guichaguri.trackplayer.logic.services.PlayerService.onCreate() (PlayerService.java:70)
09-09 22:44:00.595   755   755 I art     :   at void android.app.ActivityThread.handleCreateService(android.app.ActivityThread$CreateServiceData) (ActivityThread.java:3328)
09-09 22:44:00.595   755   755 I art     :   at void android.app.ActivityThread.-wrap5(android.app.ActivityThread, android.app.ActivityThread$CreateServiceData) (ActivityThread.java:-1)
09-09 22:44:00.595   755   755 I art     :   at void android.app.ActivityThread$H.handleMessage(android.os.Message) (ActivityThread.java:1659)
09-09 22:44:00.595   755   755 I art     :   at void android.os.Handler.dispatchMessage(android.os.Message) (Handler.java:105)
09-09 22:44:00.595   755   755 I art     :   at void android.os.Looper.loop() (Looper.java:156)
09-09 22:44:00.595   755   755 I art     :   at void android.app.ActivityThread.main(java.lang.String[]) (ActivityThread.java:6523)
09-09 22:44:00.595   755   755 I art     :   at java.lang.Object java.lang.reflect.Method.invoke!(java.lang.Object, java.lang.Object[]) (Method.java:-2)
09-09 22:44:00.595   755   755 I art     :   at void com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run() (ZygoteInit.java:941)
09-09 22:44:00.595   755   755 I art     :   at void com.android.internal.os.ZygoteInit.main(java.lang.String[]) (ZygoteInit.java:831)
09-09 22:44:00.595   755   755 I art     : 
09-09 22:44:00.612   755   755 E CrashlyticsCore: Failed to execute task.
09-09 22:44:00.612   755   755 E CrashlyticsCore: java.util.concurrent.ExecutionException: java.lang.NoSuchMethodError: No static method getBatteryLevel(Landroid/content/Context;)F in class Lio/fabric/sdk/android/services/common/CommonUtils; or its super classes (declaration of 'io.fabric.sdk.android.services.common.CommonUtils' appears in /data/app/com.decoderhq.indieshuffle-1/base.apk)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at java.util.concurrent.FutureTask.report(FutureTask.java:94)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at java.util.concurrent.FutureTask.get(FutureTask.java:178)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at com.crashlytics.android.core.CrashlyticsExecutorServiceWrapper.executeSyncLoggingException(CrashlyticsExecutorServiceWrapper.java:44)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.uncaughtException(CrashlyticsUncaughtExceptionHandler.java:235)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1068)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:1063)
09-09 22:44:00.612   755   755 E CrashlyticsCore: Caused by: java.lang.NoSuchMethodError: No static method getBatteryLevel(Landroid/content/Context;)F in class Lio/fabric/sdk/android/services/common/CommonUtils; or its super classes (declaration of 'io.fabric.sdk.android.services.common.CommonUtils' appears in /data/app/com.decoderhq.indieshuffle-1/base.apk)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.writeSessionEvent(CrashlyticsUncaughtExceptionHandler.java:1005)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.writeFatal(CrashlyticsUncaughtExceptionHandler.java:766)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.handleUncaughtException(CrashlyticsUncaughtExceptionHandler.java:262)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler.access$100(CrashlyticsUncaughtExceptionHandler.java:55)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler$5.call(CrashlyticsUncaughtExceptionHandler.java:238)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at com.crashlytics.android.core.CrashlyticsUncaughtExceptionHandler$5.call(CrashlyticsUncaughtExceptionHandler.java:235)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at java.util.concurrent.FutureTask.run(FutureTask.java:237)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at io.fabric.sdk.android.services.common.ExecutorUtils$1$1.onRun(ExecutorUtils.java:75)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at io.fabric.sdk.android.services.common.BackgroundPriorityRunnable.run(BackgroundPriorityRunnable.java:30)
09-09 22:44:00.612   755   755 E CrashlyticsCore:       at java.lang.Thread.run(Thread.java:776)
09-09 22:44:00.613   755   755 E AndroidRuntime: FATAL EXCEPTION: main
09-09 22:44:00.613   755   755 E AndroidRuntime: Process: com.decoderhq.indieshuffle, PID: 755
09-09 22:44:00.613   755   755 E AndroidRuntime: java.lang.NoSuchMethodError: No static method zzh(Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; in class Lcom/google/android/gms/common/internal/zzab; or its super classes (declaration of 'com.google.android.gms.common.internal.zzab' appears in /data/app/com.decoderhq.indieshuffle-1/base.apk)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at com.google.android.gms.cast.internal.zzm.<init>(Unknown Source)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at com.google.android.gms.cast.internal.zzm.<init>(Unknown Source)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at com.google.android.gms.cast.framework.CastContext.<clinit>(Unknown Source)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at com.google.android.gms.cast.framework.CastContext.getSharedInstance(Unknown Source)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at guichaguri.trackplayer.cast.GoogleCast.<init>(GoogleCast.java:32)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at guichaguri.trackplayer.logic.MediaManager.<init>(MediaManager.java:45)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at guichaguri.trackplayer.logic.services.PlayerService.onCreate(PlayerService.java:70)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at android.app.ActivityThread.handleCreateService(ActivityThread.java:3328)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at android.app.ActivityThread.-wrap5(ActivityThread.java)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1659)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at android.os.Handler.dispatchMessage(Handler.java:105)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at android.os.Looper.loop(Looper.java:156)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at android.app.ActivityThread.main(ActivityThread.java:6523)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:941)
09-09 22:44:00.613   755   755 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:831)

Installation issues

React Native v0.43.3

Could be a conflict with another library, but seems one needs to add to app/build.gradle as follows:

compile(project(':react-native-track-player')) {
    exclude group: "com.google.android.gms" // very important
}

Doing that allows app to build, but results in attached. Working through that now.
screenshot_1492260953

5+ second delay when loading and playing new song

05-03 08:20:26.466 14864 15001 I ReactNativeJS: { player: 0, type: 'player-playing' }
05-03 08:20:26.470 14864 15001 I ReactNativeJS: { player: 0, type: 'player-state', state: 6 }
05-03 08:20:32.418 14864 15001 I ReactNativeJS: { player: 0, type: 'player-pause' }
05-03 08:20:32.425 14864 15001 I ReactNativeJS: { player: 0, type: 'player-state', state: 2 }
05-03 08:20:32.432 14864 15001 I ReactNativeJS: { player: 0, type: 'player-loaded', track: '1234' }
05-03 08:20:32.463 14864 15001 I ReactNativeJS: { player: 0, type: 'player-playing' }
05-03 08:20:32.490 14864 15001 I ReactNativeJS: { player: 0, type: 'player-state', state: 3 }

As you can see from the timestamp, it takes roughly 6 seconds to actually start playing a song. Is it trying to download the full song before playing?

[iOS] Crash when artwork contains æ

It seems that when the artwork URL has an æ in it, the app crashes.

It's not a valid URL, I know, but it probably shouldn't make the app crash...

Play from specific position

Our app often needs to play from a specific position in the track. I.e. not just from the start.

It would be nice to have an option for this. Maybe something like:

TrackPlayer.add(infos).then( () => {
  TrackPlayer.skip(trackId, 100);
});

where 100 is the position I would like to start at.

Local files

I'm currently downloading files for later playback using RNFetchBlob.

It is currently possible to play those files?

If not, maybe I could look into developing that?

[Android] NullPointerException on getCurrentTrack

Another error I'm seeing pop up in the Android logs:

java.lang.NullPointerException: 
  at guichaguri.trackplayer.TrackModule.getCurrentTrack (TrackModule.java:232)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.facebook.react.bridge.BaseJavaModule$JavaMethod.invoke (BaseJavaModule.java:368)
  at com.facebook.react.cxxbridge.JavaModuleWrapper.invoke (JavaModuleWrapper.java:138)
  at com.facebook.react.bridge.queue.NativeRunnable.run (Native Method)
  at android.os.Handler.handleCallback (Handler.java:751)
  at android.os.Handler.dispatchMessage (Handler.java:95)
  at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage (MessageQueueThreadHandler.java:31)
  at android.os.Looper.loop (Looper.java:154)
  at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run (MessageQueueThreadImpl.java:208)
  at java.lang.Thread.run (Thread.java:762)

The only time I use this in my code is as follows (to update the UI of the app to reflect the currently playing song):

updatePlayerSong = async() => {
    try {
        const track_id = await TrackPlayer.getCurrentTrack()
        var song = track_id ? store.playlist.filter(function(e) {return e.id == track_id}) : false
        var song = song && song [0] ? song[0] : false
        if (song) {
            song.artwork = song.artwork
            song.stream  = song.source
            song.playing = true
            store.changeSong(song,'playing')
        }
        // Analytics
        tracker.trackEvent('play','new-song')
    } catch (error) {
        tracker.trackEvent('error','updatePlayerSong: ' + error)
        alert(error)
    }
}

URL-encoding inconsistencies

On iOS, I have to decode the URL for the player:

url: "https://example.com/æ.mp3"

On Android, I have to encode it:

url: "https://example.com/%C3%A6.mp3"

Events overhaul

For now, events are triggered with media buttons and with only one player event (ended). It was enough for local players, as everything depends on the app. I'll create a list of categories of events to organize them:

  • Media Button Events: Events that will trigger when someone clicks a button outside your app UI (such as smartwatches, notifications, etc)
  • Player Events: Events that will trigger when the player state changes.
  • Remote Events: Events that will trigger when remote devices were found/connected/disconnected

Media Button Events

All of this events are not sent to the main player, so you can implement your own logic.

  • play: When the play button is pressed
  • pause: When the pause button is pressed
  • stop: When the stop button is pressed
  • skipNext: When the skip to next button is pressed
  • skipPrevious: When the skip to previous button is pressed
  • seekTo: When the position of the playback is changed
  • setRating: When the rating is changed

Player Events

  • player-state: When the state is changed (can be used to update the UI)
  • player-load: When a new song is loaded
  • player-play: When the state is changed to playing
  • player-paused: When the state is changed to paused
  • player-stop: When the state is changed to stopped
  • player-ended: When the playback has reached its end
  • player-error: When an error has occurred

Remote Events

  • device-added: When a compatible device is found (can be used in a list)
  • device-removed: When a compatible device can't be found anymore (can be used in a list)
  • device-connected: When a device is connected
  • device-disconnected: When a device is disconnected

Can't make a new load() without doing reset() first

Let's say I'm already playing a song with load(), but I want to move to the next song or change to a completely different playlist. It seems that calling load() again (with new details) results in the following:

04-02 09:52:36.574  4357  4425 E unknown:React: Exception in native call
04-02 09:52:36.574  4357  4425 E unknown:React: java.lang.IllegalStateException
04-02 09:52:36.574  4357  4425 E unknown:React:         at android.media.MediaPlayer.nativeSetDataSource(Native Method)
04-02 09:52:36.574  4357  4425 E unknown:React:         at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1078)
04-02 09:52:36.574  4357  4425 E unknown:React:         at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1067)
04-02 09:52:36.574  4357  4425 E unknown:React:         at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1009)
04-02 09:52:36.574  4357  4425 E unknown:React:         at android.media.MediaPlayer.setDataSource(MediaPlayer.java:967)
04-02 09:52:36.574  4357  4425 E unknown:React:         at guichaguri.trackplayer.player.players.AndroidPlayer.load(AndroidPlayer.java:83)
04-02 09:52:36.574  4357  4425 E unknown:React:         at guichaguri.trackplayer.logic.components.MediaWrapper.load(MediaWrapper.java:62)
04-02 09:52:36.574  4357  4425 E unknown:React:         at guichaguri.trackplayer.TrackModule.load(TrackModule.java:155)
04-02 09:52:36.574  4357  4425 E unknown:React:         at java.lang.reflect.Method.invoke(Native Method)
04-02 09:52:36.574  4357  4425 E unknown:React:         at com.facebook.react.bridge.BaseJavaModule$JavaMethod.invoke(BaseJavaModule.java:345)
04-02 09:52:36.574  4357  4425 E unknown:React:         at com.facebook.react.cxxbridge.JavaModuleWrapper.invoke(JavaModuleWrapper.java:136)
04-02 09:52:36.574  4357  4425 E unknown:React:         at com.facebook.react.bridge.queue.NativeRunnable.run(Native Method)
04-02 09:52:36.574  4357  4425 E unknown:React:         at android.os.Handler.handleCallback(Handler.java:751)
04-02 09:52:36.574  4357  4425 E unknown:React:         at android.os.Handler.dispatchMessage(Handler.java:95)
04-02 09:52:36.574  4357  4425 E unknown:React:         at com.facebook.react.bridge.queue.MessageQueueThreadHandler.dispatchMessage(MessageQueueThreadHandler.java:31)
04-02 09:52:36.574  4357  4425 E unknown:React:         at android.os.Looper.loop(Looper.java:154)
04-02 09:52:36.574  4357  4425 E unknown:React:         at com.facebook.react.bridge.queue.MessageQueueThreadImpl$3.run(MessageQueueThreadImpl.java:196)
04-02 09:52:36.574  4357  4425 E unknown:React:         at java.lang.Thread.run(Thread.java:761)

However, if I do TrackPlayer.reset() before calling TrackPlayer.load(), it works fine.

This "hack" creates another problem though, because TrackPlayer.reset() also triggers "ended," so if you're using "skipNext" and "ended" to both fire a "nextSong()", it gets stuck in an infinite loop.

Notification issues

This morning, I listened to my app on the way to work. I pulled out my headphones and the music stopped, as expected. My app state also reflected that. But now, 8 hours later, the notification widget is showing up as if it were actively playing. Not sure if there's a way to resolve.

AndroidRuntime: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/exoplayer2/DefaultRenderersFactory;

I get this exception when running setupPlayer on Android simulator:

08-16 09:03:31.761  1349  1349 D AndroidRuntime: Shutting down VM
08-16 09:03:31.810  1349  1349 E AndroidRuntime: FATAL EXCEPTION: main
08-16 09:03:31.810  1349  1349 E AndroidRuntime: Process: com.zetland, PID: 1349
08-16 09:03:31.810  1349  1349 E AndroidRuntime: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/google/android/exoplayer2/DefaultRenderersFactory;
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at guichaguri.trackplayer.player.players.ExoPlayback.<init>(ExoPlayback.java:62)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at guichaguri.trackplayer.logic.MediaManager.createLocalPlayback(MediaManager.java:74)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at guichaguri.trackplayer.logic.MediaManager.setupPlayer(MediaManager.java:87)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at guichaguri.trackplayer.logic.services.PlayerService.onBind(PlayerService.java:33)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at android.app.ActivityThread.handleBindService(ActivityThread.java:3218)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at android.app.ActivityThread.-wrap3(ActivityThread.java)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1572)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:102)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:154)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6119)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.android.exoplayer2.DefaultRenderersFactory" on path: DexPathList[[zip file "/data/app/com.zetland-1/base.apk"],nativeLibraryDirectories=[/data/app/com.zetland-1/lib/x86, /system/fake-libs, /data/app/com.zetland-1/base.apk!/lib/x86, /system/lib, /vendor/lib]]
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
08-16 09:03:31.810  1349  1349 E AndroidRuntime: 	... 13 more
08-16 09:03:31.811   603   716 W ActivityManager:   Force finishing activity com.zetland/.MainActivity

Any help is appreciated. :)

START_STICKY bug?

If I'm playing music and pause (in-app), then swipe to close the app from the task bar, the notification up top also closes, but after 1 minute it comes back with a "Scheduling restart of crashed service" after 1000ms.

I'm able to solve the error by changing START_STICKY to START_NOT_STICKY logic/workers/PlayerService.java, but I worry that if the app runs out of memory that's going to have implications. Granted, we're already using startForeground, so... this should be one of the last services that Android kills? Still, seems like a risky hack.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.