The Android platform supplies sources for dealing with media playback, which your apps can use to create an interface between the consumer and their music recordsdata. On this tutorial collection, we are going to create a fundamental music participant utility for Android. The app will current a listing of songs on the consumer system, in order that the consumer can choose songs to play. The app will even current controls for interacting with playback and can proceed taking part in when the consumer strikes away from the app, with a notification displayed whereas playback elapses.
Searching for a Fast Answer?
If you happen to’re in search of a fast resolution, there’s an incredible assortment of Android app templates over at Envato Market.
Particularly, this Android Music Participant app template is an effective way to get began with constructing your individual app. “Lite Music” is a premium participant app template in Android, with a clear interface, that is easy and stylish to make use of.
Introduction
Constructing the music participant will contain utilizing the ContentResolver
class to retrieve tracks on the system, the MediaPlayer
class to play audio and the MediaController
class to regulate playback. We will even use a Service
occasion to play audio when the consumer is just not immediately interacting with the app. It is best to be capable to full this collection for those who’re an intermediate Android developer, so for those who’ve already constructed a number of apps, then this collection should not be an issue for you. Here’s a preview of the ultimate app:
On this tutorial, we are going to create the app and question the consumer system for audio recordsdata utilizing the ContentResolver
and Cursor
lessons. Within the subsequent half, we are going to use an Adapter
occasion to current the songs in a listing view, beginning playback when the consumer faucets an merchandise from the checklist. Within the remaining installment of this collection, we’ll use the MediaController
class to provide the consumer management over playback, implement features to skip ahead and again, and embrace a shuffle operate. After this collection, we are going to discover different features of media playback that may improve the app, similar to dealing with audio focus, presenting media recordsdata in several methods, and taking part in streaming media.
1. Create and Configure a New Venture
Step 1
Create a brand new Android mission. In case you are utilizing Eclipse, then let the IDE (Built-in Growth Atmosphere) create a principal Exercise
class and format file for you. For a number of the code we use within the collection, you have to a minimal API degree of 16, so you have to to take extra steps to assist older variations. As soon as your mission is created, open the mission’s Manifest file. Contained in the manifest
factor, add the next permission:
1 |
<uses-permission android:title="android.permission.WAKE_LOCK" /> |
We’ll use this permission to let music playback proceed when the consumer’s system turns into idle. Your Manifest ought to already comprise a component in your principal Exercise
class. Add the next attributes to the exercise
factor to set the screenOrientation
and launchMode
:
1 |
<exercise
|
2 |
android:title="com.instance.musicplayer.MainActivity" |
3 |
android:label="@string/app_name" |
4 |
android:launchMode="singleTop" |
5 |
android:screenOrientation="portrait" > |
We’ll follow portrait orientation for simplicity. The launchMode
will help the method of navigating again to the app after transferring away from it. We’ll show a notification indicating the track at present being performed, tapping the notification will take the consumer again to the app. We’re additionally going to make use of a Service
class for music playback. Add the next line to the mission’s Manifest contained in the utility
factor and after the exercise
factor:
1 |
<service android:title="com.instance.musicplayer.MusicService" /> |
Alter the package deal title to fit your personal and alter the category title if you want.
Step 2
Open the mission’s principal format file and substitute its contents with the next format:
1 |
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" |
2 |
xmlns:instruments="http://schemas.android.com/instruments" |
3 |
android:layout_width="fill_parent" |
4 |
android:layout_height="fill_parent" |
5 |
android:orientation="vertical" |
6 |
android:background="#FF330000" |
7 |
instruments:context=".MainActivity" > |
8 |
|
9 |
<ListView
|
10 |
android:id="@+id/song_list" |
11 |
android:layout_width="fill_parent" |
12 |
android:layout_height="wrap_content" > |
13 |
</ListView>
|
14 |
|
15 |
</LinearLayout>
|
Makes positive to change the instruments:context attribute in case your principal Exercise
class is called in another way. The format features a ListView
by which we are going to current the checklist of songs.
We’re going to embrace two menu objects for toggling the shuffle operate and for exiting the app. Open your principal menu file (res/menu/principal.xml) and substitute its contents with the next:
1 |
<menu xmlns:android="http://schemas.android.com/apk/res/android" > |
2 |
|
3 |
<merchandise
|
4 |
android:id="@+id/action_shuffle" |
5 |
android:icon="@drawable/rand" |
6 |
android:orderInCategory="1" |
7 |
android:showAsAction="at all times" |
8 |
android:title="Shuffle"/> |
9 |
|
10 |
<merchandise
|
11 |
android:id="@+id/action_end" |
12 |
android:icon="@drawable/finish" |
13 |
android:orderInCategory="2" |
14 |
android:showAsAction="at all times" |
15 |
android:title="Finish"/> |
16 |
|
17 |
</menu>
|
If you happen to choose, you may retailer the title strings within the res/values/strings.xml file. The 2 objects confer with drawable recordsdata. Create your individual or use these two photos to begin with:
We will even use an icon to show within the playback notification. Create one now or use the one under:
The code will confer with the pictures utilizing the names rand, finish, and play so just be sure you use the identical file names. Copy the pictures to your mission’s drawables folder(s). We’ll implement the actions later.
2. Question the Machine for Songs
Step 1
Let’s question the consumer’s system for audio recordsdata. First, add a brand new class to your mission, naming it Track
. We’ll use this class to mannequin the info for a single audio file. Inside the category declaration, add three occasion variables for the info we wish to retailer for every observe:
1 |
non-public lengthy id; |
2 |
non-public String title; |
3 |
non-public String artist; |
Subsequent, add a constructor methodology by which we instantiate the occasion variables:
1 |
public Track(lengthy songID, String songTitle, String songArtist) { |
2 |
id=songID; |
3 |
title=songTitle; |
4 |
artist=songArtist; |
5 |
}
|
Lastly, add get strategies for the occasion variables:
1 |
public lengthy getID(){return id;} |
2 |
public String getTitle(){return title;} |
3 |
public String getArtist(){return artist;} |
If you happen to plan to make use of extra observe data, then you’re free so as to add extra occasion variables to the category.
Step 2
Open the principle Exercise
class and add the next imports:
1 |
import java.util.ArrayList; |
2 |
import java.util.Collections; |
3 |
import java.util.Comparator; |
4 |
import android.internet.Uri; |
5 |
import android.content material.ContentResolver; |
6 |
import android.database.Cursor; |
7 |
import android.widget.ListView; |
Declare the next occasion variables earlier than the onCreate
methodology:
1 |
non-public ArrayList<Track> songList; |
2 |
non-public ListView songView; |
We’ll retailer the songs in a listing and show them within the ListView
occasion in the principle format. In onCreate
, after setting the content material view, retrieve the ListView
occasion utilizing the ID we gave it in the principle format:
1 |
songView = (ListView)findViewById(R.id.song_list); |
Instantiate the checklist as proven under:
1 |
songList = new ArrayList<Track>(); |
Subsequent, in the principle Exercise
class declaration, after the prevailing strategies, create a helper methodology to retrieve the audio file data:
1 |
public void getSongList() { |
2 |
//retrieve track information
|
3 |
}
|
Inside this methodology, create a ContentResolver
occasion, retrieve the URI for exterior music recordsdata, and create a Cursor
occasion utilizing the ContentResolver
occasion to question the music recordsdata:
1 |
ContentResolver musicResolver = getContentResolver(); |
2 |
Uri musicUri = android.supplier.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; |
3 |
Cursor musicCursor = musicResolver.question(musicUri, null, null, null, null); |
Now we will iterate over the outcomes, first checking that now we have legitimate knowledge:
1 |
if(musicCursor!=null && musicCursor.moveToFirst()){ |
2 |
//get columns
|
3 |
int titleColumn = musicCursor.getColumnIndex |
4 |
(android.supplier.MediaStore.Audio.Media.TITLE); |
5 |
int idColumn = musicCursor.getColumnIndex |
6 |
(android.supplier.MediaStore.Audio.Media._ID); |
7 |
int artistColumn = musicCursor.getColumnIndex |
8 |
(android.supplier.MediaStore.Audio.Media.ARTIST); |
9 |
//add songs to checklist
|
10 |
do { |
11 |
lengthy thisId = musicCursor.getLong(idColumn); |
12 |
String thisTitle = musicCursor.getString(titleColumn); |
13 |
String thisArtist = musicCursor.getString(artistColumn); |
14 |
songList.add(new Track(thisId, thisTitle, thisArtist)); |
15 |
}
|
16 |
whereas (musicCursor.moveToNext()); |
17 |
}
|
We first retrieve the column indexes for the info objects that we’re thinking about for every track, then we use these to create a brand new Track
object and add it to the checklist, earlier than persevering with to loop by way of the outcomes.
Again in onCreate
, after the code we added, name this new methodology:
3. Show the Songs
Step 1
Now we will show the checklist of songs within the consumer interface. Within the onCreate
methodology, after calling the helper methodology we created a second in the past, let’s type the info in order that the songs are offered alphabetically:
1 |
Collections.type(songList, new Comparator<Track>(){ |
2 |
public int examine(Track a, Track b){ |
3 |
return a.getTitle().compareTo(b.getTitle()); |
4 |
}
|
5 |
});
|
We use the title
variable within the Track
class, utilizing the get strategies we added, to implement a examine
methodology, sorting the songs by title.
Step 2
Let’s outline a format to signify every track within the checklist. Add a brand new file to your mission’s res/format folder, naming it track.xml and coming into the next:
1 |
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" |
2 |
xmlns:instruments="http://schemas.android.com/instruments" |
3 |
android:layout_width="fill_parent" |
4 |
android:layout_height="wrap_content" |
5 |
android:onClick="songPicked" |
6 |
android:orientation="vertical" |
7 |
android:padding="5dp" > |
8 |
|
9 |
<TextView
|
10 |
android:id="@+id/song_title" |
11 |
android:layout_width="fill_parent" |
12 |
android:layout_height="wrap_content" |
13 |
android:textColor="#FFFFFF99" |
14 |
android:textSize="20sp" |
15 |
android:textStyle="daring" /> |
16 |
|
17 |
<TextView
|
18 |
android:id="@+id/song_artist" |
19 |
android:layout_width="fill_parent" |
20 |
android:layout_height="wrap_content" |
21 |
android:textColor="#FFFFFF99" |
22 |
android:textSize="18sp" /> |
23 |
|
24 |
</LinearLayout>
|
Be at liberty to amend the format to fit your preferences. Every track within the checklist can be represented by title and artist textual content strings, so we are going to use the TextViews
to show this knowledge. Discover that the LinearLayout
opening tag lists an onClick
attribute. We’ll use this methodology in the principle Exercise
class to answer consumer faucets on the songs within the checklist, taking part in the track represented by the checklist merchandise that was tapped.
Step 3
We’ll use an Adapter
to map the songs to the checklist view. Add a brand new class to your app, naming it SongAdapter or one other title of your alternative. When creating the category, give it the superclass android.widget.BaseAdapter
. Eclipse ought to insert the next define:
1 |
public class SongAdapter extends BaseAdapter { |
2 |
|
3 |
@Override
|
4 |
public int getCount() { |
5 |
// TODO Auto-generated methodology stub
|
6 |
return 0; |
7 |
}
|
8 |
|
9 |
@Override
|
10 |
public Object getItem(int arg0) { |
11 |
// TODO Auto-generated methodology stub
|
12 |
return null; |
13 |
}
|
14 |
|
15 |
@Override
|
16 |
public lengthy getItemId(int arg0) { |
17 |
// TODO Auto-generated methodology stub
|
18 |
return 0; |
19 |
}
|
20 |
|
21 |
@Override
|
22 |
public View getView(int arg0, View arg1, ViewGroup arg2) { |
23 |
// TODO Auto-generated methodology stub
|
24 |
return null; |
25 |
}
|
26 |
|
27 |
}
|
You will want so as to add the next imports:
1 |
import java.util.ArrayList; |
2 |
import android.content material.Context; |
3 |
import android.view.LayoutInflater; |
4 |
import android.widget.LinearLayout; |
5 |
import android.widget.TextView; |
Inside the category declaration, declare the next occasion variables:
1 |
non-public ArrayList<Track> songs; |
2 |
non-public LayoutInflater songInf; |
We’ll go the track checklist from the principle Exercise
class and use the LayoutInflater
to map the title and artist strings to the TextViews
within the track format we created.
After the occasion variables, give the adapter a constructor methodology to instantiate them:
1 |
public SongAdapter(Context c, ArrayList<Track> theSongs){ |
2 |
songs=theSongs; |
3 |
songInf=LayoutInflater.from(c); |
4 |
}
|
Alter the content material of the getCount
methodology to return the scale of the checklist:
1 |
@Override
|
2 |
public int getCount() { |
3 |
return songs.measurement(); |
4 |
}
|
You possibly can go away the getItem
and getItemId
strategies untouched. Replace the implementation of the getView
methodology as proven under:
1 |
@Override
|
2 |
public View getView(int place, View convertView, ViewGroup dad or mum) { |
3 |
//map to track format
|
4 |
LinearLayout songLay = (LinearLayout)songInf.inflate |
5 |
(R.format.track, dad or mum, false); |
6 |
//get title and artist views
|
7 |
TextView songView = (TextView)songLay.findViewById(R.id.song_title); |
8 |
TextView artistView = (TextView)songLay.findViewById(R.id.song_artist); |
9 |
//get track utilizing place
|
10 |
Track currSong = songs.get(place); |
11 |
//get title and artist strings
|
12 |
songView.setText(currSong.getTitle()); |
13 |
artistView.setText(currSong.getArtist()); |
14 |
//set place as tag
|
15 |
songLay.setTag(place); |
16 |
return songLay; |
17 |
}
|
We set the title and artist textual content by retrieving the proper Track
occasion from the checklist utilizing the place index, mapping these strings to the views we added to the track format file. We additionally set the place because the view tag, which is able to allow us to play the proper track when the consumer clicks an merchandise within the checklist. Do not forget that the track.xml format file included an onClick
attribute. We’ll use the strategy listed there to retrieve the tag within the Exercise
.
Step 3
Again in the principle Exercise
class, within the onCreate
methodology after sorting the checklist, create a brand new occasion of the Adapter
class and set it on the ListView
:
1 |
SongAdapter songAdt = new SongAdapter(this, songList); |
2 |
songView.setAdapter(songAdt); |
Whenever you run the app, it ought to current the checklist of songs on the system, clicking them will trigger the app to throw an exception in the meanwhile, however we are going to implement the press handler within the subsequent tutorial.
Conclusion
We have now set the app as much as learn songs from the consumer system. Within the subsequent half, we are going to start playback when the consumer selects a track utilizing the MediaPlayer
class. We’ll implement playback utilizing a Service
class so that it’s going to proceed because the consumer interacts with different apps. Lastly, we are going to use a MediaController
class to provide the consumer management over playback.