Our metadata API events allow developers to listen for timed metadata embedded in the media file to signal the start and stop of an ad. This release adds support for parsing Event Message box events, or esmg, which carries ID3 metadata, often used in DASH streams.
Release Date: July 30, 2020 (Build 108)
Fixed an issue where setting up a player with controls set to false and then calling load() resets the controls to true.
Fixed a bug causing the InPlaylistTimedMetadataEvent to not fire as expected.
Fixed an issue where calling onPause() before the IMA SDK setup is complete, crashes the app with a NullPointerException.
Release Date: June 25, 2020 (Build 107)
Added support for triggering the on('meta') and on('metadataCueParsed') methods based on in-band emsg timed metadata.
Added a configuration option, playlistIndex, which enables a playlist to be loaded and start playback from any item within it, not just the first. The default of this option is a 0 index.
Removed trace references to advertising ID to comply with Google's new policies around children's app submissions. We recommend apps remove the additional dependency on the jwplayer-ima component/module as well.
Fixed a rare case where using a specific USB-C-to-HDMI adapter causes apps with JW Player to crash.
Business logic often requires a need to execute asynchronous code that requires knowledge of the next playlist item before either making an adjustment to that playlist item, or preventing its playback altogether. We've extended the API to allow for asynchronous blocking between playlist items. Loading, ads, and playback of the next playlist item can be blocked until async operation resolves.
Release Date: June 8, 2020 (Build 106)
Added API to enable developers to modify a playlist item, prevent it from loading and transition instead to the following item, modify the ad block, and disable ads.
Service improvements to increase stability.
Fixed an issue where the mute API did not affect Freewheel ads.
Android 3.13.0 is full of new improvements! Our Android SDK now uses Android Jetpack libraries to ensure best practices, has support for preview thumbnails, and more. Check out the full list of updates below.
Release Date: May 19, 2020 (Build 102)
Added support for the VAST ad client's new adWarning event which fires when a non-fatal ad error occurs that does not prevent fill.
Created warning 70001 for VAST error code 1002, which occurs when a VMAP does not contain tracking events for the ad break. More information can be found in the ad warning documentation.
Fixed an issue where the player fails to resume DRM playback after backgrounding the app.
Fixed a bug causing the setting controls to be ignored if defined in the setup configuration.
Fixed a bug where Google IMA ads could not be muted.
Fixed an issue causing the player to pause after seeking from the play state instead of resuming playback.
Fixed an issue causing the onFirstFrameListener() to fire before the onPlayListener() event.
Fixed a bug where if the viewer pauses playback during a Google IMA or Freewheel ad and rotates the orientation of the video, the screen becomes black instead of remaining on the current ad frame.
Release Date: May 7, 2020 (Build 98)
Breaking Change: As of version 3.13.0 the Android SDK now uses AndroidX (Jetpack) libraries. Please refer to the official Migrating to AndroidX guide to learn more about how you can migrate your application code.
Added support for PlaylistItem.startTime property that allows developers to define the number of seconds from the start of a media asset when playback should begin.
Added a PlaylistItem.externalMetadata field that allows developers to add external metadata which will be surface at a specified time in the video and delivers optional custom user data.
Added the ability to use VTT files to load preview thumbnails for individual shots or scenes in a video. This allows thumbnails to display as a tooltip when the user is seeking forward or backward in the player's progress bar.
Removed all code enabling Android Advertising ID transmission from Android SDK.
Fixed an issue where 608 captions would not automatically appear on the receiver when captions were enabled on the sender before the casting session was started. The user would need to turn them off and on again during the casting session.
Fixed an issue where onPlay does not fire consistently at the start of Google DAI streams.
Android 3.11 is packed with some great updates! We have exposed HLS #EXT-X-DATERANGE tags that can be used to indicate when there are temporal breaks in a live stream—great for ad stitching. Speaking of advertising, we upgraded and made improvements to our FreeWheel ad client.
Release Date: February 14, 2020 (Build 93)
Upgrade FreeWheel ad support to version 6.32.0
Added support for playlist-level configuration of FreeWheel where the freewheelSettings can now be nested within an individual PlaylistItem. Use case descriptions and a code sample can be found here
Added post-roll ad support in the FreeWheel ad client
Added a new callback for In-Playlist Timed Metadata, which supports DATERANGE and PROGRAM-DATE-TIME tags. The DATERANGE and PROGRAM-DATE-TIME metadata events fire when playback enters the section of an HLS stream tagged with #EXT-X-DATERANGE or #EXT-X-PROGRAM-DATE-TIME.
Fixed an issue where onVisualQuality is not called when a stream automatically changes bitrate
Added addButton() and removeButton() API methods allowing developers the ability to add or remove player buttons to the player control bar. When new buttons are added via the addButton() API method, they can call back to developers' custom native code.
Added JWFriendlyAdObstructions API class to replace the now deprecated JWExperimentalAPI class that enables the registration of video controls that overlay the media element. Typically, these video controls are considered obstructions and reduce the viewability rate calculated by the Open Measurement SDK. More information on how to use the JWFriendlyAdObstructions API can be found here
Expose the adId parameter in the AdImpressionEvent for Google IMA
Improved the user experience by retaining the paused state after a viewer seeks while paused. Developers who have worked around this in the past by calling pause() on seek no longer need to use the API, but anyone who wishes to resume playback automatically after a seek event now must call play()
Fixed an issue where changing quality levels would pause playback in fullscreen if using multiple MediaSources as pseudo quality levels.
Fixed issue where an IllegalStateException is thrown after a video plays 128 times or more
Release Date: August 16, 2019 (Build 76)
Exposed nextupOffsetPercentage property which allows the next up overlay to be displayed at a specified percent of the way through the video, rather than at a fixed number of seconds from the beginning or end of the video. When the nextupOffsetPercentage is set, it overrides nextupOffset
Our latest Android 3.6.0 release adds more flexibility to our Android SDK with enhanced fullscreen handling. The JWPlayerView now automatically detects if it is running in a RecyclerView or not and uses the appropriate handler to ensure a seamless fullscreen user experience.
Release Date: June 20, 2019 (Build 73)
Improved Android fullscreen handling for RecyclerView and non-RecyclerView configurations. The JWPlayerView will detect whether or not it is running a RecyclerView and will use the appropriate handler allowing for a seamless fullscreen user experience.
Enjoy a new and improved Chromecast experience in Android 3.5! We have migrated to the latest Google Cast library unleashing more customizable options. See our Chromecast documentation for implementation details.
Release Date: May 21, 2019 (Build 72)
Fixed an issue where developer is unable to disable fullscreen on rotation when using JWSupportFragment.
Fixed an issue where SharingPluginEvents are not available for use.
Release Date: April 29, 2019 (Build 71)
Added a new "Experimental API" class that enables the registration of video controls that overlay the media element. Typically, these video controls are considered obstructions and reduce the viewability rate calculated by the Open Measurement SDK. Learn more about Google IMA’s Open Measurement SDK integration and how to register video controls overlay obstructions here.
Improved JW Player expired license user experience by adding an error message notification and halting player setup or playback
Added onWarning callback for non-fatal error debugging or troubleshooting purposes.
Fixed issue where video content restarts from the beginning after ad playback if two midrolls are scheduled for the same time position.
Fixed issue where video is shortly displayed before IMA VMAP preroll in playlist.
Fixed issue where Google IMA ads play with sound when the advertising player configuration is set to mute.
Fixed issue where the app crashes if related items file is not found.
Fixed issue where players with Chromecast buttons using Fragments lose connection to a casting session.
Fixed issue where the title and image are not available for playlists with related videos during a casting session.
Fixed issue where the parent video is casted when the user selects a related video.
Fixed issue where audio plays on the sender app when the casting session starts and a VAST or Freewheel ad is already in progress.
Intermittently Freewheel pre-roll VPAID ads continue to load after ad completion and prevent video playback to start. This issue will be fixed in the next Android release.
Added the ability to set custom parameters to FreeWheel and IMA ad configurations, so that publishers can target their campaigns better. Please refer to the FreeWheel and IMA sections for the examples of usage.
Added the ability to customize Look-Ahead HLS buffer time. Please refer to this section for the example.
Introduced a separate version of the SDK for Amazon tablets. The ExoPlayer is replaced with its Amazon fork. It can be accessed through Maven. Please refer to the Amazon section for more details.
Fixed an issue where the player fails to seek forward if seek performed during IMA ad request
Fixed an issue where RelatedPluginEvents.OnRelatedCloseListener cannot be imported
Fixed an issue where IMA preroll causes endless buffering if playback is started before an MP4 video started buffering.
Fixed an issue where the player overlaps cue points for IMA mid-rolls with the relative offset for playlists
Fixed an issue where Ad Duration displays 6## instead of actual data in case of VAST mid-roll
Fixed an issue where the player crashes if its size is 0 and VPAID ad is loaded
Fixed an issue where getDuration() and getPosition() return -.001 for live streams
Fixed an issue where a pre-roll shows incorrect duration in case of using startOnSeek
We are excited to announce JW Player SDK 3.0 for Android. This release updates the SDK to JW8 and leverages its new UI & UX, optimization, and advertising enhancements to engage your audiences intelligently and monetize your content. In the coming months we will deploy more JW8 features into the JW Player SDKs for iOS & Android, so stay tuned!
Please refer to this important 3.x migration guide for Android to update your current application from version 2.x to 3.x. This guide includes important information about API changes, new features & callbacks, and will help your team with the transition process.
You may use Maven to update to SDK 3.x, or you can download the SDK 3 packages and new 3.x license keys from the Publish -> Tools section of your JW Player Dashboard. Please note that version 3 of the SDKs are available to our Enterprise edition customers, and require new license keys because 2.x license keys will not work.
Release Date: Jun 18, 2018 (Build 53)
Support for new advertising rules, including timeBetweenAds, startOnSeek, frequency, and startOn. Please refer to our Ad Rules Reference for details on how to use them.
Fixed an issue where the HD menu button would appear even if the stream had one quality level
Fixed an issue where the fullscreen button was missing during FreeWheel ad playback
Fixed an issue where playback controls would appear for FreeWheel VPAID ads
Fixed an issue where playback controls would disappear for audio-only streams
Fixed an issue where "Live Broadcasting" message was displayed while static video was buffering upon replay
Fixed an issue where seek controls were missing for DVR-enabled live streams
Fixed some memory leaks
Fixed an issue where finalize() wouldn't trigger when an IMA ad was skipped
Fixed an issue where onAdTime() would be invoked continuously after an ad was skipped
Fixed an issue where onError() would be erroneously invoked when the player was setting up
Fixed an issue where the "Learn More" button and Ad Message would be delayed six seconds into the ad
Fixed an issue where a clickthrough action would be auto-triggered on Android 4.x devices
Release Date: May 29, 2018 (Build 47)
We have integrated support for the FreeWheel ad-serving platform. Configure your FreeWheel Ad Manager settings in our new FreeWheel ad client to serve pre-rolls and mid-rolls with other features such as ad-skip and ad-click. Please refer to the new FreeWheel advertising section in our developer guide documentation to get started.
Fixed an issue where the app would crash if exiting the activity during IMA setup
Fixed a typo in the naming of removeOnAdScheduleListener method. Please update your code accordingly when updating to this version
Release Date: Feb 06, 2018 (Build 37)
Fixed an issue where the two-letter language codes specified in the HLS manifest for audio tracks were not being displayed correctly
Release Date: Jan 23, 2018 (Build 33)
Added synchronization and improved thread handling when a player is created and destroyed in rapid succession
Fixed an issue where the app would crash for multitrack live streams
Version 2.7.10 (Build 32 - Jan 09, 2018)
Fixed an issue where an IMA VMAP ad error would autostart the player
Release Date: Dec 11, 2017 (Build 31)
Fixed an issue where livestream with large DVR windows takes too long to load
Fixed an issue where setControls would not persist after a call to load()
Fixed an issue where valid VMAP schedules would block content playback when using Google IMA
Release Date: Nov 17, 2017 (Build 28)
Fixed an issue where navigating from one activity to a new activity (using a different player), then returning back to the first activity would freeze the player
Fixed an issue where the two letter language code in the manifest of the AudioTrack objects was not being returned
Fixed an issue where the timeSliderAbove UI of the controlbar would not stay consistent when exiting fullscreen mode
Fixed an issue where finishing an activity from onSetupError could crash the app. Equivalent to pressing back when the player encountered a setup error
Fixed an issue where the HD Button was not visible even though multiple sources had been configured
Fixed an issue where backgrounding the app caused in-manifest captions to appear twice in the caption menu
Fixed an issue where Quality and AudioTrack selectors would disappear in fullscreen
Fixed an issue where changing the visual quality from a paused state after device lock could crash the app
Fixed an issue Where programmatically instantiating another JWPlayerView could break the controls and other Web resources of the first player
Release Date: Oct 09, 2017 (Build 26)
HTTP Headers can now be updated midstream without reloading the player. Useful for updating expired AES key tokens passed in the HTTP Authorization request header without interrupting AES Encrypted HLS playback
Fixed an issue where the player would hang if the IMA pre-roll was empty
Fixed an issue where onAdError would get triggered repeatedly if an IMA mid-roll fails
Fixed an issue where HTTP Headers were missing from audio chunk requests
Release Date: Sep 15, 2017 (Build 24)
onAdImpression: now includes click-through URL parameter
Upgraded SDK to use JW Player 7.12.6
Fixed a regression issue where defaultImpression for VAST did not fire
Fixed a regression issue with onAdImpression firing in VAST ads
Release Date: Jul 21, 2017 (Build 23)
Upgraded SDK to use JW Player 7.12.1
Fixed an issue where setting up the player with IMA ads a number of times consecutively, would eventually cause the player to crash
Release Date: Jun 23, 2017 (Build 22)
Upgraded SDK to use JW Player 7.11.3
Fixed an issue where onControlBarVisible callback was not firing when in paused state and display was being toggled
Fixed an issue where double tapping the player while playing an ad would cause an exception
Release Date: May 08, 2017 (Build 19)
Fixed an issue where quality levels were sometimes available before jwplayer.js was in a playing state resulting in the HD button not appearing
Fixed an issue where OnControlbarVisibilityChanged fired when the player was in a buffering state
Fixed an issue where an HLS VOD duration displayed as live following an IMA ad
Fixed an issue where onAdError was not thrown when loading an ad with 0 duration, resulting in an indefinite loading state
Fixed an issue where getQualityLevels() and onLevels() callbacks were not consistently returning data
Fixed an issue where timeSliderAbove was not behaving correctly due to inconsistent casing
Release Date: Apr 27, 2017 (Build 18)
Fixed an issue where playback was broken in Android 4.x devices. OnControlBarVisibilityListener will not be supported at this time on any 4.x Android version that doesn't support MutationObserver.
Release Date: Apr 10, 2017 (Build 16)
New onAdSchedule callback for the VAST ad client that provides detailed information of a VMAP ad schedule.
Upgraded SDK to use JW Player 7.10.4
onAdImpression now includes VMAP ad schedule details
Fixed an issue where VMAP breakstart/breakend callbacks would not fire when no ad source was present
Fixed an issue where setting autostart to true was not enabling autostart
Fixed an issue where the first frame of media would play for a split-second before the start of an IMA pre-roll ad
Fixed an issue where the player would become unresponsive after seeking to the end and letting the media complete.
Fixed an issue where an improperly formed IMA ad would cause a crash instead of throwing an error.
Release Date: Feb 23, 2017 (Build 15)
Added support for "preload" where media is preloaded after the player is setup but before the play button is pressed. This allows JW Player to fetch media information prior to playback and enhances perceived performance by users
Added onControlBarVisible callback that indicates when the player control bar's visibility changes. Sync your custom UI elements to display & hide with the player control bar
Added localization of Casting error messages
Fixed an issue where double-clicking on an ad with a click-through URL would cause a crash
Various error message strings can now be localized to a preferred language
Added API methods to pause and resume IMA ad playback
Improved memory consistency in various classes, this should resolve intermittent NullPointerExceptions
Fixed a NullPointerException when sending player error analytics
Fixed an issue where JWPlayerView.getPlaylist() would return null when JWPlayerView.getConfig().getPlaylist() would return the correct playlist before setup
Fixed an app crash when tyring to cast a stream with WebVTT thumbnails
Fixed the subtitle button showing up for streams that did not contain any cues
Fixed an exception that would be thrown when using a timecode (00:30:00.000) with the IMA ad client
Fixed a NullPointerException in the toJSON() method of Ad Source
The SDK now logs an error message when it encounters an invalid SSL certificate, for example when requesting a VAST creative.
Release Date: Jan 27, 2017 (Build 12)
Upgraded SDK to use JW Player 7.8.7
Release Date: Dec 21, 2016 (Build 11)
Fixed an issue where the SDK would crash on Android 7.1.1 if the Chromecast module was not added as a dependency
Fixed an issue where ImaAdvertising or ImaVMAPAdvertising instances without an associated ImaSdkSettings instance would cause a crash
Release Date: Dec 09, 2016 (Build 7)
The JW Player SDK for Android is now distributed as several modules, to reduce the size of your application you will only need to import the modules you are using in your project. Please note the updated configuration instructions here:
Fixed an issue with seek() where calling seek() before play() would cause the seekbar to not update the playhead position during playback
Release Date: Feb 01, 2016 (Build 141)
ID3 Timed Metadata
Local Media File Playback
Support for newly added JW7 API callbacks (onSeeked, onFirstFrame, onAdRequest, etc.)
Enhanced fullscreen in various layouts (Linear, Frame, Relative)
Improved Fragment Fullscreening
Fixed an issue with VAST 3.0 VMAP not working as expected
Fixed an issue where IMA pre-roll tags did not work as expected for live streams
Fixed a bug where dragging to seek would cause an infinite buffer state
Fixed an issue where Autostart config option was not being honored
Fixed an issue where a player control bar that is set to hidden would become visible in fullscreen
Fixed an issue where ExoPlayerWrapper is null in SurfaceHolder callback
Developers who are already using Google's Cast Companion Library and are not using version 2.6.1, should add -dontwarn com.longtailvideo.jwplayer.cast.* to your ProGuard configuration to avoid conflicts.
Version 2.0 is a complete rewrite of the JW Player SDK for Android to make it easier for developers to add world-class media playback to any Android app. The migration guide with API changes and code examples, makes upgrading from 1.x to 2.0 a breeze.
One of the many benefits of this “One JW Player” architectural change is our ability to leverage JW Player 7 features such as CSS skinning and a DPI-responsive player UI optimized for mobile.
For more information about our JW Player SDK for Android 2.0 release, please read our blog post. Thanks!
Release Date: Dec 16, 2015 (Build 135)
Fixed an issue where calling load() or setup() immediately after setSkin(String) would throw an error
Fixed a bug where playhead position would not update on the seek bar when calling seek() before play()
Improved CSS skin downloading
Release Date: Dec. 03, 2015 (Build 131)
Fixed an issue where the Video Quality button would be broken for HLS streams that contained two quality levels.
Fixed a bug with onTime() where sometimes the webplayer truncated the last zero (e.g. returning 1.23 instead of 1.230)
Fixed an issue where getPosition() and getDuration() always returned 0.
Fixed an issue where several listeners in PlayerStateHandler were not registered.