Click here to Skip to main content
15,881,840 members
Please Sign up or sign in to vote.
1.20/5 (2 votes)
See more:
this my manifest:
HTML
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    package="com.playmusic.ghufron"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk>
        android:minSdkVersion="9"
        android:targetSdkVersion="19" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    
    

    <application>
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity>
            android:name="com.playmusic.ghufron.MainActivity"
            android:label="@string/app_name" 
            android:launchMode="singleTop"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name="com.playmusic.ghufron.MusicService" />
            
       
    </application>

</uses-sdk></manifest>



this my mainActivity.java

Java
package com.playmusic.ghufron;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import com.playmusic.ghufron.MusicService.MusicBinder;



import android.net.Uri;
import android.os.Bundle;
import android.os.IBinder;
import android.app.Activity;
import android.content.ComponentName;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.database.Cursor;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import android.widget.MediaController.MediaPlayerControl;



public class MainActivity extends Activity implements MediaPlayerControl {

	//song list variables
	private ArrayList<song> songList;
	private ListView songView;

	//service
	private MusicService musicSrv;
	private Intent playIntent;
	//binding
	private boolean musicBound=false;

	//controller
	private MusicController controller;

	//activity and playback pause flags
	private boolean paused=false, playbackPaused=false;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		//retrieve list view
		songView = (ListView)findViewById(R.id.song_list);
		//instantiate list
		songList = new ArrayList<song>();
		//get songs from device
		getSongList();
		//sort alphabetically by title
		Collections.sort(songList, new Comparator<song>(){
			public int compare(Song a, Song b){
				return a.getTitle().compareTo(b.getTitle());
			}
		});
		//create and set adapter
		SongAdapter songAdt = new SongAdapter(this, songList);
		songView.setAdapter(songAdt);

		//setup controller
		setController();
	}

	//connect to the service
	private ServiceConnection musicConnection = new ServiceConnection(){

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			MusicBinder binder = (MusicBinder)service;
			//get service
			musicSrv = binder.getService();
			//pass list
			musicSrv.setList(songList);
			musicBound = true;
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			musicBound = false;
		}
	};

	//start and bind the service when the activity starts
	@Override
	protected void onStart() {
		super.onStart();
		if(playIntent==null){
			playIntent = new Intent(this, MusicService.class);
			bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
			startService(playIntent);
		}
	}

	//user song select
	public void songPicked(View view){
		musicSrv.setSong(Integer.parseInt(view.getTag().toString()));
		musicSrv.playSong();
		if(playbackPaused){
			setController();
			playbackPaused=false;
		}
		controller.show(0);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		//menu item selected
		switch (item.getItemId()) {
		case R.id.action_shuffle:
			musicSrv.setShuffle();
			break;
		case R.id.action_end:
			stopService(playIntent);
			musicSrv=null;
			System.exit(0);
			break;
		}
		return super.onOptionsItemSelected(item);
	}

	//method to retrieve song info from device
	public void getSongList(){
		//query external audio
		ContentResolver musicResolver = getContentResolver();
		Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
		Uri musicUri2= android.provider.MediaStore.Audio.Media.INTERNAL_CONTENT_URI;
	
		Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
		Cursor musicCursor2 = musicResolver.query(musicUri, null, null, null, null);
		//iterate over results if valid
		if(musicCursor2!=null && musicCursor2.moveToFirst()){
			//get columns
			int titleColumn2 = musicCursor2.getColumnIndex
					(android.provider.MediaStore.Audio.Media.TITLE);
			int idColumn2 = musicCursor2.getColumnIndex
					(android.provider.MediaStore.Audio.Media._ID);
			int artistColumn2 = musicCursor2.getColumnIndex
					(android.provider.MediaStore.Audio.Media.ARTIST);
			//add songs to list
			do {
				long thisId = musicCursor2.getLong(idColumn2);
				String thisTitle = musicCursor2.getString(titleColumn2);
				String thisArtist = musicCursor2.getString(artistColumn2);
				songList.add(new Song(thisId, thisTitle, thisArtist));
			} 
			while (musicCursor.moveToNext());
		
		if(musicCursor!=null && musicCursor.moveToFirst()){
			//get columns
			int titleColumn = musicCursor.getColumnIndex
					(android.provider.MediaStore.Audio.Media.TITLE);
			int idColumn = musicCursor.getColumnIndex
					(android.provider.MediaStore.Audio.Media._ID);
			int artistColumn = musicCursor.getColumnIndex
					(android.provider.MediaStore.Audio.Media.ARTIST);
			//add songs to list
			do {
				long thisId = musicCursor.getLong(idColumn);
				String thisTitle = musicCursor.getString(titleColumn);
				String thisArtist = musicCursor.getString(artistColumn);
				songList.add(new Song(thisId, thisTitle, thisArtist));
			} 
			while (musicCursor.moveToNext());
		}}
	}

	@Override
	public boolean canPause() {
		return true;
	}

	@Override
	public boolean canSeekBackward() {
		return true;
	}

	@Override
	public boolean canSeekForward() {
		return true;
	}

	@Override
	public int getAudioSessionId() {
		return 0;
	}

	@Override
	public int getBufferPercentage() {
		return 0;
	}

	@Override
	public int getCurrentPosition() {
		if(musicSrv!=null && musicBound && musicSrv.isPng())
			return musicSrv.getPosn();
		else return 0;
	}

	@Override
	public int getDuration() {
		if(musicSrv!=null && musicBound && musicSrv.isPng())
			return musicSrv.getDur();
		else return 0;
	}

	@Override
	public boolean isPlaying() {
		if(musicSrv!=null && musicBound)
			return musicSrv.isPng();
		return false;
	}

	@Override
	public void pause() {
		playbackPaused=true;
		musicSrv.pausePlayer();
	}

	@Override
	public void seekTo(int pos) {
		musicSrv.seek(pos);
	}

	@Override
	public void start() {
		musicSrv.go();
	}

	//set the controller up
	private void setController(){
		controller = new MusicController(this);
		//set previous and next button listeners
		controller.setPrevNextListeners(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				playNext();
			}
		}, new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				playPrev();
			}
		});
		//set and show
		controller.setMediaPlayer(this);
		controller.setAnchorView(findViewById(R.id.song_list));
		controller.setEnabled(true);
	}

	private void playNext(){
		musicSrv.playNext();
		if(playbackPaused){ 
			setController();
			playbackPaused=false;
		}
		controller.show(0);
	}

	private void playPrev(){
		musicSrv.playPrev();
		if(playbackPaused){
			setController();
			playbackPaused=false;
		}
		controller.show(0);
	}

	@Override
	protected void onPause(){
		super.onPause();
		paused=true;
	}

	@Override
	protected void onResume(){
		super.onResume();
		if(paused){
			setController();
			paused=false;
		}
	}

	@Override
	protected void onStop() {
		controller.hide();
		super.onStop();
	}

	@Override
	protected void onDestroy() {
		stopService(playIntent);
		musicSrv=null;
		super.onDestroy();
	}

}


this my Logcat:

W/dalvikvm(22608): VFY: unable to resolve virtual method 163: Landroid/app/Notification$Builder;.build ()Landroid/app/Notification;<br />
I/Adreno200-EGLSUB(22608): <configwindowmatch:2081 xmlns:configwindowmatch="#unknown">: Format RGBA_8888.<br />
D/memalloc(22608): /dev/pmem: Mapped buffer base:0x51e75000 size:3702784 offset:3088384 fd:69<br />
D/memalloc(22608): /dev/pmem: Mapped buffer base:0x52356000 size:614400 offset:0 fd:74<br />
D/memalloc(22608): /dev/pmem: Mapped buffer base:0x52516000 size:1228800 offset:614400 fd:77<br />
E/MediaPlayer(22608): Uri is  content://media/external/audio/media/45<br />
D/MediaPlayer(22608): http youtube = false, scheme = content<br />
E/MediaPlayer(22608): Uri is  content://media/internal/audio/media/45<br />
D/MediaPlayer(22608): http youtube = false, scheme = content<br />
E/MediaPlayer(22608): attachNewPlayer called in state 2<br />
E/MUSIC SERVICE(22608): Error setting data source<br />
E/MUSIC SERVICE(22608): java.lang.IllegalStateException<br />
E/MUSIC SERVICE(22608): 	at android.media.MediaPlayer.setDataSource(Native Method)<br />
E/MUSIC SERVICE(22608): 	at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1000)<br />
E/MUSIC SERVICE(22608): 	at android.media.MediaPlayer.setDataSource(MediaPlayer.java:863)<br />
E/MUSIC SERVICE(22608): 	at android.media.MediaPlayer.setDataSource(MediaPlayer.java:812)<br />
E/MUSIC SERVICE(22608): 	at com.playmusic.ghufron.MusicService.playSong(MusicService.java:109)<br />
E/MUSIC SERVICE(22608): 	at com.playmusic.ghufron.MainActivity.songPicked(MainActivity.java:105)<br />
E/MUSIC SERVICE(22608): 	at java.lang.reflect.Method.invokeNative(Native Method)<br />
E/MUSIC SERVICE(22608): 	at java.lang.reflect.Method.invoke(Method.java:511)<br />
E/MUSIC SERVICE(22608): 	at android.view.View$1.onClick(View.java:3052)<br />
E/MUSIC SERVICE(22608): 	at android.view.View.performClick(View.java:3528)<br />
E/MUSIC SERVICE(22608): 	at android.view.View$PerformClick.run(View.java:14235)<br />
E/MUSIC SERVICE(22608): 	at android.os.Handler.handleCallback(Handler.java:605)<br />
E/MUSIC SERVICE(22608): 	at android.os.Handler.dispatchMessage(Handler.java:92)<br />
E/MUSIC SERVICE(22608): 	at android.os.Looper.loop(Looper.java:137)<br />
E/MUSIC SERVICE(22608): 	at android.app.ActivityThread.main(ActivityThread.java:4424)<br />
E/MUSIC SERVICE(22608): 	at java.lang.reflect.Method.invokeNative(Native Method)<br />
E/MUSIC SERVICE(22608): 	at java.lang.reflect.Method.invoke(Method.java:511)<br />
E/MUSIC SERVICE(22608): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)<br />
E/MUSIC SERVICE(22608): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)<br />
E/MUSIC SERVICE(22608): 	at dalvik.system.NativeStart.main(Native Method)<br />
D/MediaPlayer(22608): start() mUri is content://media/internal/audio/media/45<br />
I/Adreno200-EGLSUB(22608): <configwindowmatch:2081>: Format RGBA_8888.<br />
D/memalloc(22608): /dev/pmem: Mapped buffer base:0x52742000 size:2670592 offset:2547712 fd:80<br />
D/memalloc(22608): /dev/pmem: Mapped buffer base:0x52a0e000 size:2904064 offset:2781184 fd:86<br />
D/memalloc(22608): /dev/pmem: Mapped buffer base:0x52cd3000 size:3026944 offset:2904064 fd:89<br />
E/MediaPlayer(22608): Uri is  content://media/external/audio/media/45<br />
D/MediaPlayer(22608): http youtube = false, scheme = content<br />
E/MediaPlayer(22608): Uri is  content://media/internal/audio/media/45<br />
D/MediaPlayer(22608): http youtube = false, scheme = content<br />
E/MediaPlayer(22608): attachNewPlayer called in state 2<br />
E/MUSIC SERVICE(22608): Error setting data source<br />
E/MUSIC SERVICE(22608): java.lang.IllegalStateException<br />
E/MUSIC SERVICE(22608): 	at android.media.MediaPlayer.setDataSource(Native Method)<br />
E/MUSIC SERVICE(22608): 	at android.media.MediaPlayer.setDataSource(MediaPlayer.java:1000)<br />
E/MUSIC SERVICE(22608): 	at android.media.MediaPlayer.setDataSource(MediaPlayer.java:863)<br />
E/MUSIC SERVICE(22608): 	at android.media.MediaPlayer.setDataSource(MediaPlayer.java:812)<br />
E/MUSIC SERVICE(22608): 	at com.playmusic.ghufron.MusicService.playSong(MusicService.java:109)<br />
E/MUSIC SERVICE(22608): 	at com.playmusic.ghufron.MusicService.playNext(MusicService.java:209)<br />
E/MUSIC SERVICE(22608): 	at com.playmusic.ghufron.MusicService.onCompletion(MusicService.java:127)<br />
E/MUSIC SERVICE(22608): 	at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1763)<br />
E/MUSIC SERVICE(22608): 	at android.os.Handler.dispatchMessage(Handler.java:99)<br />
E/MUSIC SERVICE(22608): 	at android.os.Looper.loop(Looper.java:137)<br />
E/MUSIC SERVICE(22608): 	at android.app.ActivityThread.main(ActivityThread.java:4424)<br />
E/MUSIC SERVICE(22608): 	at java.lang.reflect.Method.invokeNative(Native Method)<br />
E/MUSIC SERVICE(22608): 	at java.lang.reflect.Method.invoke(Method.java:511)<br />
E/MUSIC SERVICE(22608): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)<br />
E/MUSIC SERVICE(22608): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)<br />
E/MUSIC SERVICE(22608): 	at dalvik.system.NativeStart.main(Native Method)<br />
D/MediaPlayer(22608): start() mUri is content://media/internal/audio/media/45<br />
D/MediaPlayer(22608): pause() mUri is content://media/internal/audio/media/45<br />
<br />

and this my music service:
Java
package com.playmusic.ghufron;

import java.util.ArrayList;
import java.util.Random;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.ContentUris;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.IBinder;
import android.os.PowerManager;
import android.util.Log;



public class MusicService extends Service implements 
MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener,
MediaPlayer.OnCompletionListener {

	//media player
	private MediaPlayer player;
	//song list
	private ArrayList<song> songs;
	//current position
	private int songPosn;
	//binder
	private final IBinder musicBind = new MusicBinder();
	//title of current song
	private String songTitle="";
	//notification id
	private static final int NOTIFY_ID=1;
	//shuffle flag and random
	private boolean shuffle=false;
	private Random rand;

	public void onCreate(){
		//create the service
		super.onCreate();
		//initialize position
		songPosn=0;
		//random
		rand=new Random();
		//create player
		player = new MediaPlayer();
		//initialize
		initMusicPlayer();
	}

	public void initMusicPlayer(){
		//set player properties
		player.setWakeMode(getApplicationContext(), 
				PowerManager.PARTIAL_WAKE_LOCK);
		player.setAudioStreamType(AudioManager.STREAM_MUSIC);
		//set listeners
		player.setOnPreparedListener(this);
		player.setOnCompletionListener(this);
		player.setOnErrorListener(this);
	}

	//pass song list
	public void setList(ArrayList<song> theSongs){
		songs=theSongs;
	}

	//binder
	public class MusicBinder extends Binder {
		MusicService getService() { 
			return MusicService.this;
		}
	}

	//activity will bind to service
	@Override
	public IBinder onBind(Intent intent) {
		return musicBind;
	}

	//release resources when unbind
	@Override
	public boolean onUnbind(Intent intent){
		player.stop();
		player.release();
		return false;
	}

	//play a song
	public void playSong(){
		//play
		player.reset();
		//get song
		Song playSong = songs.get(songPosn);
		//get title
		songTitle=playSong.getTitle();
		//get id
		long currSong = playSong.getID();
		//set uri
		Uri trackUri = ContentUris.withAppendedId(
				android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
				currSong);
		Uri trackUri2 = ContentUris.withAppendedId(android.provider.MediaStore.Audio.Media.INTERNAL_CONTENT_URI,currSong);
		//set the data source
		try{ 
			player.setDataSource(getApplicationContext(), trackUri);
			player.setDataSource(getApplicationContext(),trackUri2);
		}
		catch(Exception e){
			Log.e("MUSIC SERVICE", "Error setting data source", e);
		}
		player.prepareAsync(); 
	}

	//set the song
	public void setSong(int songIndex){
		songPosn=songIndex;	
	}

	@Override
	public void onCompletion(MediaPlayer mp) {
		//check if playback has reached the end of a track
		if(player.getCurrentPosition()>0){
			mp.reset();
			playNext();
		}
	}

	@Override
	public boolean onError(MediaPlayer mp, int what, int extra) {
		Log.v("MUSIC PLAYER", "Playback Error");
		mp.reset();
		return false;
	}

	@SuppressWarnings("deprecation")
	@Override
	public void onPrepared(MediaPlayer mp) {
		//start playback
		mp.start();
		//notification
		Intent notIntent = new Intent(this, MainActivity.class);
		notIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
		PendingIntent pendInt = PendingIntent.getActivity(this, 0,
				notIntent, PendingIntent.FLAG_UPDATE_CURRENT);

		Notification.Builder builder = new Notification.Builder(this);

		builder.setContentIntent(pendInt)
		.setSmallIcon(R.drawable.play)
		.setTicker(songTitle)
		.setOngoing(true)
		.setContentTitle("Playing")
		.setContentText(songTitle);
		Notification ya =
			    (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) ?
			        builder.build() : builder.getNotification();
		startForeground(NOTIFY_ID, ya);
		
	}

	//playback methods
	public int getPosn(){
		return player.getCurrentPosition();
	}

	public int getDur(){
		return player.getDuration();
	}

	public boolean isPng(){
		return player.isPlaying();
	}

	public void pausePlayer(){
		player.pause();
	}

	public void seek(int posn){
		player.seekTo(posn);
	}

	public void go(){
		player.start();
	}

	//skip to previous track
	public void playPrev(){
		songPosn--;
		if(songPosn<0) songPosn=songs.size()-1;
		playSong();
	}

	//skip to next
	public void playNext(){
		if(shuffle){
			int newSong = songPosn;
			while(newSong==songPosn){
				newSong=rand.nextInt(songs.size());
			}
			songPosn=newSong;
		}
		else{
			songPosn++;
			if(songPosn>=songs.size()) songPosn=0;
		}
		playSong();
	}

	@Override
	public void onDestroy() {
		stopForeground(true);
	}

	//toggle shuffle
	public void setShuffle(){
		if(shuffle) shuffle=false;
		else shuffle=true;
	}

}
Posted
Updated 6-Jun-14 8:57am
v3

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900