I'm currently working on Media Player. All is done except that i have .mp3 files in android emulator external storage. What i want to know is, how can i include all those .mp3 files to the .apk so that when i install the the app on phone, the files automatically transfer either on internal or external storage of the device.
I've gone through this issue but couldn't find best possible answer anywhere.
Please help me!
this is my code
VoiceService.java
package com.example.soundplayer;
import android.app.Service;
import java.util.ArrayList;
import android.content.ContentUris;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Binder;
import android.os.PowerManager;
import android.util.Log;
import android.content.Intent;
import android.os.IBinder;
import java.util.Random;
import android.app.Notification;
import android.app.PendingIntent;
import com.example.soundplayer.Voice;
public class VoiceService extends Service implements
MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener,
MediaPlayer.OnCompletionListener{
//media player
private MediaPlayer player;
//song list
private ArrayList<Voice> songs;
//current position
private int songPosn;
private boolean shuffle=false;
private Random rand;
private String songTitle;
private static final int NOTIFY_ID=1;
private final IBinder musicBind = new MusicBinder();
public void onCreate()
{
//create the service
super.onCreate();
//initialize position
songPosn=0;
//create player
player = new MediaPlayer();
initMusicPlayer();
rand=new Random();
}
public void setShuffle(){
if(shuffle) shuffle=false;
else shuffle=true;
}
public void initMusicPlayer()
{
player.setWakeMode(getApplicationContext(),
PowerManager.PARTIAL_WAKE_LOCK);
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setOnPreparedListener(this);
player.setOnCompletionListener(this);
player.setOnErrorListener(this);
}
public void setList(ArrayList<Voice> theSongs){
songs=theSongs;
}
public class MusicBinder extends Binder
{
VoiceService getService() {
return VoiceService.this;
}
}
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return musicBind;
}
public boolean onUnbind(Intent intent){
player.stop();
player.release();
return false;
}
public void playSong(){
//play a song
player.reset();
//get song
Voice playSong = songs.get(songPosn);
songTitle=playSong.getTitle();
//get id
long currSong = playSong.getID();
//set uri
Uri trackUri = ContentUris.withAppendedId(
android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
currSong);
try
{
player.setDataSource(getApplicationContext(), trackUri);
}
catch(Exception e)
{
Log.e("MUSIC SERVICE", "Error setting data source", e);
}
player.prepareAsync();
}
public void setSong(int songIndex){
songPosn=songIndex;
}
#Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
if(player.getCurrentPosition()>=0){
mp.reset();
playNext();
}
}
#Override
public void onDestroy() {
stopForeground(true);
}
#Override
public boolean onError(MediaPlayer mp, int what, int extra) {
// TODO Auto-generated method stub
mp.reset();
return false;
}
#Override
public void onPrepared(MediaPlayer mp) {
mp.start();
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 not = builder.build();
startForeground(NOTIFY_ID, not);
}
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();
}
public void playPrev(){
songPosn--;
if(songPosn>=0) songPosn=songs.size()-1;
playSong();
}
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();
}
}
MainActivity.java
package com.example.soundplayer;
import android.app.Activity;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import android.widget.MediaController.MediaPlayerControl;
import com.example.soundplayer.VoiceService.MusicBinder;
import android.net.Uri;
import android.content.ContentResolver;
import android.database.Cursor;
import android.widget.ListView;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.os.IBinder;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.view.MenuItem;
import android.view.View;
public class MainActivity extends Activity implements MediaPlayerControl{
private ArrayList<Voice> songList;
private ListView songView;
private VoiceService musicSrv;
private Intent playIntent;
private boolean musicBound=false;
private VoiceController controller;
private boolean paused=false, playbackPaused=false;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
songView = (ListView)findViewById(R.id.song_list);
songList = new ArrayList<Voice>();
getSongList();
Collections.sort(songList, new Comparator<Voice>(){
public int compare(Voice a, Voice b){
return a.getTitle().compareTo(b.getTitle());
}
});
SongAdapter songAdt = new SongAdapter(this, songList);
songView.setAdapter(songAdt);
setController();
}
private void setController(){
//set the controller up
controller = new VoiceController(this);
controller.setPrevNextListeners(new View.OnClickListener() {
#Override
public void onClick(View v) {
playNext();
}
}, new View.OnClickListener() {
#Override
public void onClick(View v) {
playPrev();
}
});
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);
}
//play previous
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();
}
//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;
}
};
#Override
public void onBackPressed() {
moveTaskToBack(true);
}
public void songPicked(View view){
musicSrv.setSong(Integer.parseInt(view.getTag().toString()));
musicSrv.playSong();
if(playbackPaused){
setController();
playbackPaused=false;
}
controller.show(0);
}
#Override
protected void onStart() {
super.onStart();
if(playIntent==null){
playIntent = new Intent(this, VoiceService.class);
bindService(playIntent, musicConnection, Context.BIND_AUTO_CREATE);
startService(playIntent);
}
}
public boolean onOptionsItemSelected(MenuItem item) {
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);
}
#Override
protected void onDestroy() {
stopService(playIntent);
musicSrv=null;
super.onDestroy();
}
public void getSongList() {
ContentResolver musicResolver = getContentResolver();
Uri musicUri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
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 Voice(thisId, thisTitle, thisArtist));
}
while (musicCursor.moveToNext());
}
}
#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 void start() {
// TODO Auto-generated method stub
musicSrv.go();
}
#Override
public void pause() {
// TODO Auto-generated method stub
playbackPaused=true;
musicSrv.pausePlayer();
}
#Override
public int getDuration() {
if(musicSrv!=null && musicBound && musicSrv.isPng())
return musicSrv.getDur();
else return 0;
}
#Override
public int getCurrentPosition() {
if(musicSrv!=null && musicBound && musicSrv.isPng())
return musicSrv.getPosn();
else return 0;
}
#Override
public void seekTo(int pos) {
// TODO Auto-generated method stub
musicSrv.seek(pos);
}
#Override
public boolean isPlaying() {
if(musicSrv!=null && musicBound)
return musicSrv.isPng();
return false;
}
#Override
public int getBufferPercentage() {
// TODO Auto-generated method stub
return 0;
}
#Override
public boolean canPause() {
// TODO Auto-generated method stub
return true;
}
#Override
public boolean canSeekBackward() {
// TODO Auto-generated method stub
return true;
}
#Override
public boolean canSeekForward() {
// TODO Auto-generated method stub
return true;
}
#Override
public int getAudioSessionId() {
// TODO Auto-generated method stub
return 0;
}
}
just copy your .mp3 files into res/raw folder and read them
mp = MediaPlayer.create(context, R.raw.fileName);
Related
Here is my code which is play song from the resources folder and now I am stuck with service so please help me.....
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mHandler=new Handler();
seekBar=findViewById(R.id.seekBar);
mp=MediaPlayer.create(MainActivity.this,R.raw.ed);
final int Duration=mp.getDuration();
Media Player Prepared Listener.....
mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
#Override
public void onPrepared(MediaPlayer mp) {
seekBar.setMax(mp.getDuration());
updateSeekBar();
mp.start();
}
});
Runnable Thread for Seekbar.....
runnable=new Runnable() {
#Override
public void run() {
updateSeekBar();
}
};
Phone State Listener for Incoming and Outgoing Calls.....
PhoneStateListener phoneStateListener = new PhoneStateListener() {
#Override
public void onCallStateChanged(int state, String incomingNumber) {
if (state == TelephonyManager.CALL_STATE_RINGING) {
mp.pause();
} else if(state == TelephonyManager.CALL_STATE_IDLE) {
mp.start();
} else if(state == TelephonyManager.CALL_STATE_OFFHOOK) {
mp.pause();
}
super.onCallStateChanged(state, incomingNumber);
}
};
TelephonyManager mgr = (TelephonyManager)
getSystemService(TELEPHONY_SERVICE);
if(mgr != null) {
mgr.listen(phoneStateListener,
PhoneStateListener.LISTEN_CALL_STATE);
}
}
Seek Bar Update Method....
private void updateSeekBar() {
seekBar.setProgress(mp.getCurrentPosition());
mHandler.postDelayed(runnable, 100);
}
}
Now, it's my service code.......
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;
public class MyMusicService extends Service {
On Create method of service....
#Override
public void onCreate() {
super.onCreate();
}
On start method of service....
#Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
On Destroy method of service....
#Override
public void onDestroy() {
super.onDestroy();
}
Binder of Service.....
#Nullable
#Override
public IBinder onBind(Intent intent) {
return null;
}
}
see i have added the code of service which is work for me.
you can try this code for your need
package com.example.musicplayer;
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;
/*
* This is demo code to accompany the Mobiletuts+ series:
* Android SDK: Creating a Music Player
*
*/
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);
//set the data source
try{
player.setDataSource(getApplicationContext(), trackUri);
}
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;
}
#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 not = builder.build();
startForeground(NOTIFY_ID, not);
}
//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;
}
}
OR
if you want to learn from scratch then
follow this link to learn and create your self too.
http://code.tutsplus.com/tutorials/create-a-music-player-on-android-project-setup--mobile-22764
http://code.tutsplus.com/tutorials/create-a-music-player-on-android-song-playback--mobile-22778
http://code.tutsplus.com/tutorials/create-a-music-player-on-android-user-controls--mobile-22787
i hope it helps you.
thanks.
I'm not very experienced in Android, but I'm trying to make a Media Playback Service. My Start and Stop are working, but Pause/Play aren't. I've tried many different ways, but always unsuccessful.
When I pause and press play again, it starts from 0 or give me an error:
11-02 18:50:57.971 2043-2043/? E/MediaPlayer﹕ start called in state 2
11-02 18:50:57.971 2043-2043/? E/MediaPlayer﹕ error (-38, 0)
11-02 18:50:57.975 2043-2043/? E/MediaPlayer﹕ Error (-38,0)
Here is my Main Activity:
package my.package;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
Button btnStartSvc;
Button btnStopSvc;
Button btnPauseSvc;
Button btnResumeSvc;
private static final String TAG = "MyService";
private static final String TAG_LINK = "link";
private static final String TAG_PAUSE = "PAUSE";
private static final String TAG_STOP = "STOP";
private static final String TAG_ACTION = "ACTION";
private String pause = "pause";
private String stop = "stop";
private String link;
Context context;
boolean playPause;
private boolean initialStage = true;
MediaPlayer mediaPlayer = null;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnStartSvc = (Button) findViewById(R.id.btnStartSvc);
btnStopSvc = (Button) findViewById(R.id.btnStopSvc);
btnPauseSvc = (Button) findViewById(R.id.btnPauseSvc);
btnResumeSvc = (Button) findViewById(R.id.btnResumeSvc);
link = "http://stats.jovemnerd.com.br/nc489alta.mp3";
context = this;
mediaPlayer = new MediaPlayer();
btnStartSvc.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
startSvc();
}
});
btnStopSvc.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
stopSvc();
}
});
btnPauseSvc.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
pauseSvc();
}
});
btnResumeSvc.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
resumeSvc();
}
});
}
public void resumeSvc(){
Intent i = new Intent(this,MyService.class);
i.putExtra("action", "my.package.action.RESUME");
startService(i);
}
public void pauseSvc(){
Intent i = new Intent(this,MyService.class);
i.putExtra("action", "my.package.action.PAUSE");
startService(i);
}
public void startSvc(){
Log.d(TAG, "Start");
Intent i = new Intent(this, MyService.class);
i.putExtra("action", "my.package.action.PLAY");
i.putExtra(TAG_LINK, link);
startService(i);
}
public void stopSvc(){
initialStage = true;
playPause=false;
Log.d(TAG, "Stop");
Intent i = new Intent(this, MyService.class);
stopService(i);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Service:
package my.package;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.wifi.WifiManager;
import android.os.IBinder;
import android.os.PowerManager;
import android.util.Log;
import java.io.IOException;
import java.net.URISyntaxException;
public class MyService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener {
private static final String ACTION_PLAY = "my.package.action.PLAY";
private static final String ACTION_PAUSE = "my.package.action.PAUSE";
private static final String ACTION_STOP = "my.package.action.STOP";
private static final String ACTION_RESUME = "my.package.action.RESUME";
private static final String TAG = "MyService";
private static final String TAG_LINK = "link";
private static final String TAG_PAUSE = "PAUSE";
private static final String TAG_STOP = "STOP";
private static final String TAG_ACTION = "ACTION";
private String url = "";
private String teste = "http://stats.jovemnerd.com.br/nc489alta.mp3";
private String action;
MediaPlayer mediaPlayer = null;
WifiManager.WifiLock wifiLock;
boolean playPause;
private boolean initialStage = true;
public MyService() {
}
#Override
public void onCreate() {
super.onCreate();
}
#Override
public int onStartCommand(Intent intent, int flags, int startId) {
teste = intent.getStringExtra("action");
Log.d("Work: ", teste);
if (intent.getStringExtra("action").equals(ACTION_PLAY)) {
mediaPlayer = new MediaPlayer();
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
url = intent.getStringExtra(TAG_LINK);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setOnPreparedListener(this);
try {
mediaPlayer.setDataSource(url);
} catch (IOException e) {
e.printStackTrace();
}
if (!playPause) {
//btnPlayPause.setImageResource(R.drawable.ic_pause_white);
if (initialStage) {
Log.d("PLAY", "PLAY");
mediaPlayer.prepareAsync();
wifiLock = ((WifiManager) getSystemService(Context.WIFI_SERVICE))
.createWifiLock(WifiManager.WIFI_MODE_FULL, "mylock");
wifiLock.acquire();
} else if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
//seekBar.setMax((int) finalTime);
}
playPause = true;
initialStage = false;
}
} else if (intent.getStringExtra("action").equals(ACTION_PAUSE)){
Log.d("PAUSE", "PAUSE");
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
if(mediaPlayer != null) {
mediaPlayer.reset();
mediaPlayer.release();
}
playPause = false;
initialStage = false;
mediaPlayer = null;
}
} /*else if (intent.getStringExtra("action").equals(ACTION_RESUME)){
if (!mediaPlayer.isPlaying())
mediaPlayer.start();
}*/
//url = intent.getStringExtra(TAG_LINK);
/*mediaPlayer = new MediaPlayer();
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);*/
Log.d(TAG, "Start Command");
return super.onStartCommand(intent, flags, startId);
}
#Override
public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "Player Started");
mediaPlayer.start();
initialStage = false;
}
#Override
public void onCompletion(MediaPlayer mp) {
Log.d("Completed: ", "ok");
}
#Override
public void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
mediaPlayer.release();
Log.d(TAG, "Stop Command" + action);
}
wifiLock.release();
initialStage = true;
playPause = false;
}
public void pausePlayer(){
if(mediaPlayer != null){
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer = null;
}}
#Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
throw new UnsupportedOperationException("Not yet implemented");
}
}
Manifest:
<service
android:name="my.package.MyService"
android:enabled="true"
android:exported="true" >
</service>
*Service is inside <Application>
I hope you can help me. Thx.
I have the code of a radio stream app from this site radio stream example, but when i want to stop the stream it restarts. The only way to stop it is exit the app and get back to the app via the "recent apps" button or notification screen.
Can someone help me with the code?
StreamService.java
package id.pratama.example.streamingaudio.service;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Toast;
import java.io.IOException;
import id.pratama.example.streamingaudio.MainActivity;
import id.pratama.example.streamingaudio.R;
/**
* Created by pratama on 4/22/14.
*/
public class StreamService extends Service implements
MediaPlayer.OnCompletionListener,
MediaPlayer.OnPreparedListener,
MediaPlayer.OnErrorListener,
MediaPlayer.OnBufferingUpdateListener {
/**
* for educational only
*/
// public static final String URL_STREAM = "http://jkt.jogjastreamers.com:8000/jisstereo?s=02766";
// radio UNISI
public static final String URL_STREAM = "http://202.162.32.23:8000";
// notification
private static final int NOTIFICATION_ID = 1;
private PhoneStateListener phoneStateListener;
private TelephonyManager telephonyManager;
private boolean isPausedInCall = false;
private NotificationCompat.Builder builder;
//intent
private Intent bufferIntent;
public static final String BROADCAST_BUFFER = "id.pratama.example.streamingaudio.broadcastbuffer";
private MediaPlayer mediaPlayer = new MediaPlayer();
#Override
public void onCreate() {
super.onCreate();
Log.d("create", "service created");
bufferIntent = new Intent(BROADCAST_BUFFER);
mediaPlayer.setOnCompletionListener(this);
mediaPlayer.setOnPreparedListener(this);
mediaPlayer.setOnErrorListener(this);
mediaPlayer.setOnBufferingUpdateListener(this);
mediaPlayer.reset();
}
#Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("play", "play streaming");
telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
phoneStateListener = new PhoneStateListener() {
#Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_OFFHOOK:
case TelephonyManager.CALL_STATE_RINGING:
if (mediaPlayer != null) {
pauseMedia();
isPausedInCall = true;
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if (mediaPlayer != null) {
if (isPausedInCall) {
isPausedInCall = false;
playMedia();
}
}
break;
}
}
};
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
initNotification();
mediaPlayer.reset();
/**
* play media
*/
if (!mediaPlayer.isPlaying()) {
try {
Log.d("streamm", "" + URL_STREAM);
mediaPlayer.setDataSource(URL_STREAM);
// sent to UI radio is buffer
sendBufferingBroadcast();
mediaPlayer.prepareAsync();
} catch (IllegalArgumentException e) {
Log.d("error", e.getMessage());
} catch (IllegalStateException e) {
Log.d("error", e.getMessage());
} catch (IOException e) {
Log.d("error", e.getMessage());
}
}
return START_STICKY;
}
#Override
public IBinder onBind(Intent intent) {
return null;
}
#Override
public void onBufferingUpdate(MediaPlayer mediaPlayer, int i) {
}
#Override
public void onCompletion(MediaPlayer mediaPlayer) {
stopMedia();
stopSelf();
}
#Override
public boolean onError(MediaPlayer mediaPlayer, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
Toast.makeText(this, "Error not valid playback", Toast.LENGTH_SHORT).show();
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
Toast.makeText(this, "Error server died", Toast.LENGTH_SHORT).show();
break;
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
Toast.makeText(this, "Error unknown", Toast.LENGTH_SHORT).show();
break;
}
return false;
}
#Override
public void onPrepared(MediaPlayer mediaPlayer) {
// sent to UI, audio has buffered
sendBufferCompleteBroadcast();
playMedia();
}
private void pauseMedia() {
if (mediaPlayer.isPlaying())
mediaPlayer.pause();
}
private void playMedia() {
if (!mediaPlayer.isPlaying()) {
mediaPlayer.start();
}
}
private void stopMedia() {
if (mediaPlayer.isPlaying())
mediaPlayer.stop();
}
/**
* sent buffering
*/
private void sendBufferingBroadcast() {
bufferIntent.putExtra("buffering", "1");
sendBroadcast(bufferIntent);
}
/**
* sent buffering complete
*/
private void sendBufferCompleteBroadcast() {
bufferIntent.putExtra("buffering", "0");
sendBroadcast(bufferIntent);
}
#Override
public void onDestroy() {
super.onDestroy();
Log.d("tag", "remove notification");
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
mediaPlayer.release();
}
if (phoneStateListener != null) {
telephonyManager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE);
}
cancelNotification();
}
/**
* show notificaiton
*/
private void initNotification() {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent intent = PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), 0);
builder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("Stream Radio")
.setContentText("895 JIZ fm");
builder.setContentIntent(intent);
builder.setOngoing(true);
notificationManager.notify(NOTIFICATION_ID, builder.build());
}
/**
* cancel notification
*/
private void cancelNotification() {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(NOTIFICATION_ID);
builder.setOngoing(false);
}
}
MainActivity.java
package id.pratama.example.streamingaudio;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import id.pratama.example.streamingaudio.service.StreamService;
import id.pratama.example.streamingaudio.utils.Utils;
public class MainActivity extends ActionBarActivity implements View.OnClickListener {
private Intent serviceIntent;
private Button btnPlay;
private static boolean isStreaming = false;
private ProgressDialog pdBuff = null;
private boolean mBufferBroadcastIsRegistered;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnPlay = (Button) findViewById(R.id.btnPlay);
btnPlay.setOnClickListener(this);
serviceIntent = new Intent(this, StreamService.class);
isStreaming = Utils.getDataBooleanFromSP(this, Utils.IS_STREAM);
if (isStreaming)
btnPlay.setText("Stop");
}
#Override
public void onClick(View view) {
if (view == btnPlay) {
Log.d("playStatus", "" + isStreaming);
if (!isStreaming) {
btnPlay.setText("Stop");
startStreaming();
Utils.setDataBooleanToSP(this, Utils.IS_STREAM, true);
} else {
if (isStreaming) {
btnPlay.setText("Start");
Toast.makeText(this, "Stop Streaming..", Toast.LENGTH_SHORT).show();
stopStreaming();
isStreaming = false;
Utils.setDataBooleanToSP(this, Utils.IS_STREAM, false);
}
}
}
}
#Override
protected void onPause() {
super.onPause();
if (mBufferBroadcastIsRegistered) {
unregisterReceiver(broadcastBufferReceiver);
mBufferBroadcastIsRegistered = false;
}
}
#Override
protected void onResume() {
super.onResume();
if (!mBufferBroadcastIsRegistered) {
registerReceiver(broadcastBufferReceiver, new IntentFilter(
StreamService.BROADCAST_BUFFER));
mBufferBroadcastIsRegistered = true;
}
}
private void startStreaming() {
Toast.makeText(this, "Start Streaming..", Toast.LENGTH_SHORT).show();
stopStreaming();
try {
startService(serviceIntent);
} catch (Exception e) {
}
}
private void stopStreaming() {
try {
stopService(serviceIntent);
} catch (Exception e) {
}
}
private BroadcastReceiver broadcastBufferReceiver = new BroadcastReceiver() {
#Override
public void onReceive(Context context, Intent bufferIntent) {
showProgressDialog(bufferIntent);
}
};
private void showProgressDialog(Intent bufferIntent) {
String bufferValue = bufferIntent.getStringExtra("buffering");
int bufferIntValue = Integer.parseInt(bufferValue);
switch (bufferIntValue) {
case 0:
if (pdBuff != null) {
pdBuff.dismiss();
}
break;
case 1:
pdBuff = ProgressDialog.show(MainActivity.this, "",
"Streaming...", true);
break;
}
}
}
finally figured it out myself!
edit the MainActivity.java and use this code
package id.pratama.example.streamingaudio;
import android.app.ProgressDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import id.pratama.example.streamingaudio.service.StreamService;
import id.pratama.example.streamingaudio.utils.Utils;
public class MainActivity extends ActionBarActivity implements View.OnClickListener {
private Intent serviceIntent;
private Button btnPlay;
private static boolean isStreaming;
private ProgressDialog pdBuff = null;
private boolean mBufferBroadcastIsRegistered;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnPlay = (Button) findViewById(R.id.btnPlay);
btnPlay.setOnClickListener(this);
serviceIntent = new Intent(this, StreamService.class);
isStreaming = Utils.getDataBooleanFromSP(this, Utils.IS_STREAM);
if (isStreaming)
btnPlay.setText("Stop");
}
#Override
public void onClick(View view) {
if (view == btnPlay) {
Log.d("playStatus", "" + isStreaming);
if (!isStreaming) {
btnPlay.setText("Stop");
startStreaming();
isStreaming = true;
Utils.setDataBooleanToSP(this, Utils.IS_STREAM, true);
} else {
if (isStreaming) {
btnPlay.setText("Start");
Toast.makeText(this, "Stop Streaming..", Toast.LENGTH_SHORT).show();
stopStreaming();
isStreaming = false;
Utils.setDataBooleanToSP(this, Utils.IS_STREAM, false);
}
}
}
}
#Override
protected void onPause() {
super.onPause();
if (mBufferBroadcastIsRegistered) {
unregisterReceiver(broadcastBufferReceiver);
mBufferBroadcastIsRegistered = false;
}
}
#Override
protected void onResume() {
super.onResume();
if (!mBufferBroadcastIsRegistered) {
registerReceiver(broadcastBufferReceiver, new IntentFilter(
StreamService.BROADCAST_BUFFER));
mBufferBroadcastIsRegistered = true;
}
}
private void startStreaming() {
Toast.makeText(this, "Start Streaming..", Toast.LENGTH_SHORT).show();
stopStreaming();
try {
startService(serviceIntent);
} catch (Exception e) {
}
}
private void stopStreaming() {
try {
stopService(serviceIntent);
} catch (Exception e) {
}
}
private BroadcastReceiver broadcastBufferReceiver = new BroadcastReceiver() {
#Override
public void onReceive(Context context, Intent bufferIntent) {
showProgressDialog(bufferIntent);
}
};
private void showProgressDialog(Intent bufferIntent) {
String bufferValue = bufferIntent.getStringExtra("buffering");
int bufferIntValue = Integer.parseInt(bufferValue);
switch (bufferIntValue) {
case 0:
if (pdBuff != null) {
pdBuff.dismiss();
}
break;
case 1:
pdBuff = ProgressDialog.show(MainActivity.this, "",
"Streaming...", true);
break;
}
}
}
I have a problem when using MediaPlayer to play video from url.
The follow of program : create an activity to play video -> press Home button -> back to app.
The requirement is video play from start, when press Home button video continuos play(only audio), and when back to app, video must play continuous(combine movie and audio).
The first, I created a MediaPlayer variable to play video. When Home button is pressed, MediaPlayer play continuous. But when back to app, video cannot displayed(black screen). So, I created other MediaPlayer variable to solved this issue. But when I using seekTo() function to seek second MediaPlayer to position of first MediaPlayer, this function is working incorrect.
import java.io.IOException;
import com.example.videotest.R;
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnBufferingUpdateListener;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.OnSeekCompleteListener;
import android.media.MediaPlayer.OnVideoSizeChangedListener;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Toast;
public class PlayVideoActivity extends Activity implements OnClickListener,SurfaceHolder.Callback, FGMediaController.MediaPlayerControl {
SurfaceView videoSurface,videoSurfaceFullscreen,videoSurfaceSmallsceen;
MediaPlayer player, backupPlayer;
FGMediaController controller;
LinearLayout llControllerBar;
public boolean isFullscreen = false;
int videoDuration;
int videoCurrent;
SurfaceHolder viewHolder = null;
boolean isPaused = false;
String videoUrl = "http://cdn-smatopi.tv-bank.com/movie/867/867-32/867-32-2015042306-D3/hls/hls3/867-32-2015042306-D3-HLS3.m3u8";
Button btnSeek, btnRelease;
int currentPos = 30000;
boolean videoPrepared = false;
boolean backupPrepared = false;
boolean mVideoSizeIsSet = false;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.playvideo);
btnSeek = (Button) findViewById(R.id.btnSeek);
btnRelease = (Button) findViewById(R.id.btnRelease);
videoSurface = (SurfaceView)findViewById(getResources().getIdentifier("vvVideo", "id", getPackageName()));
SurfaceHolder videoHolder = videoSurface.getHolder();
videoHolder.addCallback(this);
player = new MediaPlayer();
backupPlayer = new MediaPlayer();
controller = new FGMediaController(this);
try {
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.setDataSource(this, Uri.parse(videoUrl));
player.prepareAsync();
//backupPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//backupPlayer.setDataSource(this, Uri.parse(videoUrl));
//backupPlayer.prepareAsync();
} catch (Exception e) {
e.printStackTrace();
}
btnSeek.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.e("Huhu",currentPos + "");
backupPlayer.seekTo(currentPos);
}
});
btnRelease.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
backupPlayer.stop();
backupPlayer.release();
}
});
player.setOnBufferingUpdateListener(new OnBufferingUpdateListener() {
public void onBufferingUpdate(MediaPlayer mp, int percent) {
}
});
player.setOnPreparedListener(new OnPreparedListener() {
#Override
public void onPrepared(MediaPlayer mp) {
controller.setMediaPlayer(PlayVideoActivity.this);
controller.setAnchorView((FrameLayout) findViewById(PlayVideoActivity.this.getResources().getIdentifier("videoSurfaceContainer", "id", PlayVideoActivity.this.getPackageName())));
player.start();
}
});
}
#Override
public void onDestroy(){
//backupPlayer.release();
player.release();
super.onDestroy();
}
#Override
public void onResume(){
Log.e("Surface Created","OnResume");
super.onResume();
}
// Implement SurfaceHolder.Callback
#Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
#Override
public void surfaceCreated(SurfaceHolder holder) {
Log.e("Surface Created","Surface Created! " + holder);
if(viewHolder != null){
viewHolder = holder;
backupPlayer = new MediaPlayer();
try {
backupPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
backupPlayer.setDataSource(this, Uri.parse(videoUrl));
backupPlayer.prepareAsync();
backupPlayer.setDisplay(holder);
backupPlayer.setOnPreparedListener(new OnPreparedListener() {
#Override
public void onPrepared(MediaPlayer mp) {
backupPrepared = true;
backupPlayer.start();
}
});
backupPlayer.setOnVideoSizeChangedListener(new OnVideoSizeChangedListener() {
#Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height) {
// TODO Auto-generated method stub
if (width == 0 || height == 0){
Toast.makeText(getApplicationContext(),"Width = 0 Height = 0"+ mp.getDuration(), Toast.LENGTH_LONG).show();
}else{
if(backupPrepared){
backupPrepared = false;
currentPos = player.getCurrentPosition();
player.reset();
Toast.makeText(getApplicationContext(),"Seek To "+ backupPlayer.getCurrentPosition() + " | " + backupPlayer.isPlaying() + "|" + currentPos, Toast.LENGTH_LONG).show();
Log.e("Huhu","Seek To "+ backupPlayer.getCurrentPosition() + " | " + backupPlayer.isPlaying() + "|" + currentPos);
backupPlayer.seekTo(currentPos); // If you set currentPos = 20000ms or 30000ms backupPlayer can to seek, but if you set currentPos = 10000ms backupPlayer cannot seek !
}
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}else{
player.setDisplay(holder);
}
}
#Override
public void surfaceDestroyed(SurfaceHolder holder) {
Log.e("Surface Created","surfaceDestroyed! " + player.getCurrentPosition());
viewHolder = holder;
}
// End MediaPlayer.OnPreparedListener
// Implement VideoMediaController.MediaPlayerControl
#Override
public boolean canPause() {
return true;
}
#Override
public boolean canSeekBackward() {
return true;
}
#Override
public boolean canSeekForward() {
return true;
}
#Override
public int getBufferPercentage() {
return 0;
}
#Override
public int getCurrentPosition() {
//Log.printLog(Log.ERROR, "CURRENT :"+player.getCurrentPosition());
int current = 0;
try{
current = player.getCurrentPosition();
}catch(Exception e){
e.printStackTrace();
}
return current;
}
#Override
public int getDuration() {
int duration = 0;
try{
duration = player.getDuration();
}catch(Exception e){
e.printStackTrace();
}
return duration;
}
#Override
public boolean isPlaying() {
boolean isPlaying = false;
try{
isPlaying = player.isPlaying();
}catch(Exception e){
e.printStackTrace();
}
return isPlaying;
}
#Override
public void pause() {
player.pause();
}
#Override
public void seekTo(int i) {
player.seekTo(i);
}
#Override
public void start() {
player.start();
}
#Override
public boolean isFullScreen() {
return isFullscreen;
}
#Override
public void toggleFullScreen() {
// TODO Auto-generated method stub
}
#Override
public void doBackPressed() {
// TODO Auto-generated method stub
}
#Override
public void onClick(View v) {
}
}
Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 8 years ago.
Improve this question
This my logcat
MediaPlayer(5424): Uri is content://media/external/audio/media/2325
MediaPlayer(5424): http youtube = false, scheme = content
MediaPlayer(5424): Uri is content://media/internal/audio/media/2325
MediaPlayer(5424): http youtube = false, scheme = content
MediaPlayer(5424): Couldn't open file on client side, trying server side
MediaPlayer(5424): attachNewPlayer called in state 2
MUSIC SERVICE(5424): Error setting data source
MUSIC SERVICE(5424): java.lang.IllegalStateException
MUSIC SERVICE(5424): at android.media.MediaPlayer._setDataSource(Native Method)
MUSIC SERVICE(5424): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:981)
MUSIC SERVICE(5424): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:966)
MUSIC SERVICE(5424): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:878)
MUSIC SERVICE(5424): at android.media.MediaPlayer.setDataSource(MediaPlayer.java:812)
MUSIC SERVICE(5424): at com.playmusic.ghufron.MusicService.playSong(MusicService.java:109)
MUSIC SERVICE(5424): at com.playmusic.ghufron.MainActivity.songPicked(MainActivity.java:105)
MUSIC SERVICE(5424): at java.lang.reflect.Method.invokeNative(Native Method)
MUSIC SERVICE(5424): at java.lang.reflect.Method.invoke(Method.java:511)
MUSIC SERVICE(5424): at android.view.View$1.onClick(View.java:3052)
MUSIC SERVICE(5424): at android.view.View.performClick(View.java:3528)
MUSIC SERVICE(5424): at android.view.View$PerformClick.run(View.java:14235)
MUSIC SERVICE(5424): at android.os.Handler.handleCallback(Handler.java:605)
MUSIC SERVICE(5424): at android.os.Handler.dispatchMessage(Handler.java:92)
MUSIC SERVICE(5424): at android.os.Looper.loop(Looper.java:137)
MUSIC SERVICE(5424): at android.app.ActivityThread.main(ActivityThread.java:4424)
MUSIC SERVICE(5424): at java.lang.reflect.Method.invokeNative(Native Method)
MUSIC SERVICE(5424): at java.lang.reflect.Method.invoke(Method.java:511)
MUSIC SERVICE(5424): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
MUSIC SERVICE(5424): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
MUSIC SERVICE(5424): at dalvik.system.NativeStart.main(Native Method)
dalvikvm(5424): threadid=1: thread exiting with uncaught exception (group=0x40af89f0)
AndroidRuntime(5424): FATAL EXCEPTION: main
AndroidRuntime(5424): java.lang.NoSuchMethodError: android.app.Notification$Builder.build
AndroidRuntime(5424): at com.playmusic.ghufron.MusicService.onPrepared(MusicService.java:156)
AndroidRuntime(5424): at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1758)
AndroidRuntime(5424): at android.os.Handler.dispatchMessage(Handler.java:99)
AndroidRuntime(5424): at android.os.Looper.loop(Looper.java:137)
AndroidRuntime(5424): at android.app.ActivityThread.main(ActivityThread.java:4424)
AndroidRuntime(5424): at java.lang.reflect.Method.invokeNative(Native Method)
AndroidRuntime(5424): at java.lang.reflect.Method.invoke(Method.java:511)
AndroidRuntime(5424): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:817)
AndroidRuntime(5424): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:584)
AndroidRuntime(5424): at dalvik.system.NativeStart.main(Native Method)
dalvikvm(5653): VFY: unable to resolve virtual method 163: Landroid/app/Notification$Builder;.build ()Landroid/app/Notification;
Here my main activity 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;
Cursor musicCursor = musicResolver.query(musicUri, null, null, null, null);
//iterate over results if valid
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();
}
}
2.here my music service
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;
}
#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= builder.build();
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;
}
}
3.here my manifest
<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>
</manifest>
this my main_activity.xml
<LinearLayout xmlns:tools="http://schemas.android.com/tools"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#000000"
android:baselineAligned="true"
android:orientation="vertical"
tools:context=".MainActivity" >
<!-- song list -->
<LinearLayout
android:id="#+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#000000"
android:gravity="right" >
<TextView
android:id="#+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="#string/Noads" />
</LinearLayout>
<ListView
android:id="#+id/song_list"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="3.29"
android:longClickable="true" >
</ListView>
</LinearLayout>
here my song adapter
package com.playmusic.ghufron;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
public class SongAdapter extends BaseAdapter {
//song list and layout
private ArrayList<Song> songs;
private LayoutInflater songInf;
//constructor
public SongAdapter(Context c, ArrayList<Song> theSongs){
songs=theSongs;
songInf=LayoutInflater.from(c);
}
#Override
public int getCount() {
return songs.size();
}
#Override
public Object getItem(int arg0) {
return null;
}
#Override
public long getItemId(int arg0) {
return 0;
}
#Override
public View getView(int position, View convertView, ViewGroup parent) {
//map to song layout
LinearLayout songLay = (LinearLayout)songInf.inflate
(R.layout.song, parent, false);
//get title and artist views
TextView songView = (TextView)songLay.findViewById(R.id.song_title);
TextView artistView = (TextView)songLay.findViewById(R.id.song_artist);
//get song using position
Song currSong = songs.get(position);
//get title and artist strings
songView.setText(currSong.getTitle());
artistView.setText(currSong.getArtist());
//set position as tag
songLay.setTag(position);
return songLay;
}
}
explain: my app is working correctly but when i click list view it crashed but the music played and stop when i click ok!!!
The build() method was added in API level 16 (Android 4.1). You are probably trying to run your code on an older version of Android.
The getNotification() method is deprecated starting at API level 16, but is fine to use in older API levels >= 11.
Note: The entire Notification.Builder class was added in API level 11 (Honeycomb), so I assume that your app's minimum required API level is at least 11.
To fix your issue, you can use the following code.
Notification ya =
(android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.JELLY_BEAN) ?
builder.build() : builder.getNotification();