Monday, August 13, 2012

The Friday App Clinic: Podcast Players

Every week The Friday App Clinic takes a critical look at a selection of apps in a particular category. Our focus on is to help developers learn how to make their apps magical, and we'll use these corresponding blog posts to provide links to some of the techniques you can use to make that happen.
Last Friday Ian Ni-Lewis and I took the scalpel to podcast players. Up on the tablet were Doggcatcher, Beyond Pod, Pocket Casts, Volksempfänger, Listen Up, Good News, Podax, and Hipstacast.

Podcast Player Essentials

Let's start by looking at the fundamentals to creating a good podcast player.

Audio playback and control

This Android Training class on Managing Your Audio Playback explains audio focus and how to make sure your app responds to hardware and bluetooth multimedia control keys.

We recommend you create a homescreen widget to show users what's playing, and offer a shortcut to pause or skip tracks.

Use the Remote Control Client to offer the same details and shortcuts to users from the lock screen, and enrich your ongoing Notifications to support pause and resume playback at any time. While some of the apps we looked at allowed you to pause playback from a notification, doing so removed the notification, requiring you to relaunch the app to resume playback.

Offline Media Playback

Like any media playing app, a podcast player should continue to work even when your network connection is intermittent or disabled.

You can use the Download Manager to download podcasts in the background, using techniques like prefetching, as described in Android Training class Transferring Data Without Draining the Battery, to ensure that users are never left listening to "dead air" while the next track buffers or downloads.

Taking things a step further, Ian called out the elimination of the refresh button as the gold standard for podcast players.

Eliminating the refresh button is hard - which explains why all of the apps we looked at included a refresh button. To effectively remove it, you need to ensure that all your feeds are constantly up to date.  The best solution is to use Google Cloud Messaging to notify each installation of your app whenever a new podcast is available.

Making Podcast Player Work Like Magic

Playing a Podcast

Listening to podcasts is the sort of thing you tend to do when you're using your eyes for something else.

With your eyes otherwise occupied interacting with your app needs to be intuitive and familiar.

From a user-perspective, there's very little difference between a podcast player and a music player, but we noticed that many of the podcast players were presented more as podcast feed managers rather than media players, with playback controls like pause and skip were often hidden behind secondary tabs or even menu options.

Consider arranging your UI to focus around playback, so the media control buttons should always be available whenever a podcast is playing.


Podcasts are amazing -- there's thousands of hours of fresh content in every posible genre available for free, every day. But like TV and radio, content discovery is a key challenge.

The perfect podcast player should be as easy to use as the radio. Turn it on, and you should be able to start listening to something interesting within one or two clicks. That means presenting new users with a selection of content that's likely to get them hooked.

 In the apps we looked at, we noticed that the behavior of the "next" and "previous" buttons was often unpredictable. If the user hits "next", your app should be able to determine something for them to listen to without them having to pick it out specifically.

Similarly, never present users with an empty screen, or rely on them knowing and entering a podcast URL in order to get started. Even if they're experienced podcast listeners with their favorite feeds, make it easy for them to test your app before they go to the trouble of importing their favorites.

Managing Subscriptions

The focus of many of the apps we looked at was in managing your subscriptions and controlling which episodes were downloaded. These are largely implementation details that help you decide how often to refresh feeds, which feeds to fetch, and which episodes to download ahead of time.

While important, this functionality but is secondary to the point of your app. In most cases, a user's preferences will be global for all their favorite podcasts, so rather than having them configure different settings for each feed, create a sensible (customizable) default and apply it to all their subscriptions. Now you only need to allow users to browse content and select the sources they favor.

Show users what they've got organized in ways that are familiar and obvious: genres, albums, artists, and playlists.
Tune in every Friday at 1pm Pacific Time (UTC-7) for The Friday App Clinic with Ian Ni-Lewis and Reto Meier.


  1. For me, there is one very important feature missing from the must-haves: The podcatcher must remember the listened position so that one can interrupt one Podcasts, quit the app, but or listen to a different episode and then return to the exact position where one had paused. Music players don't usually do this and are therefore unacceptable for me. Big bonus points if the app syncs listened status across my devices.

    Something else that is important to me, yet possibly limited to Germany: I'd like to see Flattr support in more podcatchers. It's become a popular way of supporting one's favourite podcasts over here but until now only Podkicker Pro supports it.

  2. There's some good tips here which we're already implementing for the next version of Pocket Casts.

    I'd like to point out 2 things though:
    1. It's clear that you guys have never attempted to use your own libraries to build a podcasting app. Your suggestion of 'use the Download Manager' sounds so obvious, but let me tell you what happens when you do:
    - it won't download https episodes, about 5% of all podcasts, even if no username/password is required
    - it frequently screws up content-length calculations, resulting in it spending 3 minutes downloading a file, only to decide it needs to start again and again and again and again.
    - it doesn't support writing to an external SD card, making it problematic for people that want to download large podcasts, they have to have enough space on their phone for them, even if all you do is move them when the download is over
    - it puts everything it downloads into the Media Service, meaning it shows up in the music player, something not many people want, and which is impossible to turn off
    - it doesn't support download resuming...and it's a download manager! Lose your network connection 150MB of the way through a 300MB podcast download, I hope you like starting again! Pause a download? Not supported, please start again.
    - it doesn't give you enough options about what networks to allow podcast downloads over
    - it doesn't give you enough control over what is happening with a download, and requires you to query and SQL database for what is going one...really?
    - often when it fails, it gives you no where near enough information to know what it actually failed at

    I could go on all day, but basically the Download Manager is horribly broken, and should never be used in a podcasting app.

    My second point is that we'd love it if Google would add better support to Android for podcasts:
    - Support variable speed playback in the MediaPlayer libraries, something a lot of podcast listeners rely on
    - Support 'enhanced' AAC podcasts, so developers like us can read the chapter information embedded in them
    - Make the MediaPlayer libraries much more robust, they crash a lot on different phones and are very finnicky

  3. I think this would be a good thing, one will get to know lots about their app to what they are developing, they will understand to what they are missing in their app.

  4. I think you missed a few details in Beyondpod that covered many of the points you were making in the video - it has a driving interface (on a phone sized device at least) that fills the screen with transport buttons if you turn the device on it's side. It also refreshes a feed automatically when you view it (giving you the continuous experience), but the refresh button is there for people like me who like to download a bunch of podcasts over wifi and not bother with streaming them over 3G. It's not yet the perfect app but it is starting to get there and seems to have a lot of updates from the developer.

  5. I think it would be good to ba able to integrate the podcast player with google play. Is this possible?