# Android tutorial 5: A Complete media player

## Goal!

This tutorial wants to be the “demo application” that showcases what can be done with GStreamer in the Android platform.

It is intended to be downloaded in final, compiled, form rather than analyzed for its pedagogical value, since it adds very little GStreamer knowledge over what has already been shown in Android tutorial 4: A basic media player.

FIXME: Do we want to provide a binary of the app?

## Introduction

The previous tutorial already implemented a basic media player. This one simply adds a few finishing touches. In particular, it adds the capability to choose the media to play, and disables the screensaver during media playback.

These are not features directly related to GStreamer, and are therefore outside the scope of these tutorials. Only a few implementation pointers are given here.

## Registering as a media player

The `AndroidManifest.xml` tells the Android system the capabilities of the application. By specifying in the `intent-filter` of the activity that it understands the `audio/*`, `video/*` and `image/*` MIME types, the tutorial will be offered as an option whenever an application requires such medias to be viewed.

“Unfortunately”, GStreamer knows more file formats than Android does, so, for some files, Android will not provide a MIME type. For these cases, a new `intent-filter` has to be provided which ignores MIME types and focuses only in the filename extension. This is inconvenient because the list of extensions can be large, but there does not seem to be another option. In this tutorial, only a very short list of extensions is provided, for simplicity.

Finally, GStreamer can also playback remote files, so URI schemes like `http` are supported in another `intent-filter`. Android does not provide MIME types for remote files, so the filename extension list has to be provided again.

Once we have informed the system of our capabilities, it will start sending Intents to invoke our activity, which will contain the desired URI to play. In the `onCreate()` method the intent that invoked the activity is retrieved and checked for such URI.

## Implementing a file chooser dialog

The UI includes a new button ![media-next) which was not present in Android tutorial 4: A basic media player. It invokes a file chooser dialog (based on the Android File Dialog project) that allows you to choose a local media file, no matter what extension or MIME type it has.

If a new media is selected, it is passed onto the native code (which will set the pipeline to READY, pass the URI onto `playbin`, and bring the pipeline back to the previous state). The current position is also reset, so the new clip does not start in the previous position.

## Preventing the screen from turning off

While watching a movie, there is typically no user activity. After a short period of such inactivity, Android will dim the screen, and then turn it off completely. To prevent this, a Wake Lock is used. The application acquires the lock when the Play button is pressed, so the screen is never turned off, and releases it when the Pause button is pressed.

## Conclusion

This finishes the series of Android tutorials. Each one of the preceding tutorials has evolved on top of the previous one, showing how to implement a particular set of features, and concluding in this tutorial 5. The goal of tutorial 5 is to build a complete media player which can already be used to showcase the integration of GStreamer and Android.

It has been a pleasure having you here, and see you soon!

The results of the search are