Access control of Activity in Service Android - android

I am new to android. i know that we can not access control of activity from service. But i want to change the ImageSource of the button whenever i call the method of the service.
here is the method that i created in service :
public void play()
{
if (mp.isPlaying()) {
if (mp != null) {
mp.pause();
// Changing button image to play button
btnPlay.setImageResource(R.drawable.btn_play); // not allowed
}
} else {
// Resume song
if (mp != null) {
mp.start();
// Changing button image to pause button
btnPlay.setImageResource(R.drawable.btn_pause); // not allowed
}
}
}
in activity i am calling this method on play button click. How to implement this functionality in service. how can i change the image source of the button. Please clear my doubt. Thanx.

Create custom event object for those events and register your activity as listener.
Note: Don't forget to unregister it because it might cause a memory leak.

Try this code
public class MainActivity extends Activity
{
/** Called when the activity is first created. */
public static MainActivity mThis;
#Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mThis = this;
}
}
public void play()
{
Button btnPlay=((Button)MainActivity.mThis.findViewById(R.id.btnPlay));
if (mp.isPlaying()) {
if (mp != null) {
mp.pause();
// Changing button image to play button
btnPlay.setImageResource(R.drawable.btn_play);
}
} else {
// Resume song
if (mp != null) {
mp.start();
// Changing button image to pause button
btnPlay.setImageResource(R.drawable.btn_pause);
}
}

Related

Music keeps running

I have a sound on my app and when I play it and then press the home button, the app keeps running at the background ( I know it because the song keeps going.. ) How can I stop the app and the music?
here's my music code:
SoundPool sp = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
int iTmp = sp.load(getBaseContext(), R.raw.windows_8_notify, 1);
sp.play(iTmp, 1, 1, 0, 0, 1);
MediaPlayer mPlayer = MediaPlayer.create(getBaseContext(), R.raw.windows_8_notify);
mPlayer.start();
mPlayer.setLooping(true);
Button btn_show = (Button) findViewById(R.id.show_popup);
btn_show.setOnClickListener(new OnClickListener() {
#Override
public void onClick(View arg0) {
if (p != null)
showPopup(FirstActivity.this, p);
} }); }
In your Main Activity just override the onPause method, if you want to restart the music when you re-enter the app, the logic should go into your onResume method.
http://developer.android.com/reference/android/app/Activity.html for more info on the activity class that you must extend to create your android app.
class myActivity extends Activity {
#Override
public onCreate(Bundle savedInstanceState) {
// setup your app here
}
#Override
protected void onPause() {
// stop or pause your music here
// other "clean up"
}
#Override
protected void onResume() {
// app is now to the forground set things back up that might have been removed in onPause
}
}
stop the player inside the onStop activity callback method
#Override
protected void onStop() {
super.onStop();
if(mPlayer!=null && mPlayer.isPlaying())
mPlayer.stop();
}

Media Player start stop start

I am making a new android sound application. I made a clickable button to play sound when I click on it. But I also want it to stop playing sound when I click for the second time. That part works fine now here is the problem, when I click again on button to play sound again, it doesn't play it, Media player is completely stopped. I was looking on forums but I can't seem to find an answer that could help me.
Here is my Activity:
MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;
#Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.prvi);
final MediaPlayer mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
final MediaPlayer mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);
Button dugme = (Button) findViewById(R.id.dugme);
dugme.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (mpButtonClick1.isPlaying()) {
mpButtonClick1.stop();
mpButtonClick1.reset();
}
else {
mpButtonClick1.start();
}
}
});
When I try to write mpButtonClick1.prepare(); I get error Unhandled Exception Type IOE exception
Try to use pause instead of stop.
Reason: if you pause the MediaPlayer, then you can resume it later. However, if you use stop, almost any other method won't work and you will have to prepare the MediaPlayer again (or create a new one).
More info: here and here
PS: don't forget to release the memory when you finish using the resources.
Try this:
You should use only one mediaplayer object
public class PlayaudioActivity extends Activity {
private MediaPlayer mp;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button b = (Button) findViewById(R.id.button1);
Button b2 = (Button) findViewById(R.id.button2);
final TextView t = (TextView) findViewById(R.id.textView1);
b.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
stopPlaying();
mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
mp.start();
}
});
b2.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
stopPlaying();
mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);
mp.start();
}
});
}
private void stopPlaying() {
if (mp != null) {
mp.stop();
mp.release();
mp = null;
}
}
}
Change your class with below code:
remove reset();.
init well all components:
MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;
#Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.prvi);
mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);
Button dugme = (Button) findViewById(R.id.dugme);
dugme.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (mpButtonClick1.isPlaying()) {
mpButtonClick1.stop();
}
else {
mpButtonClick1.start();
}
}
});
You're calling mpButtonClick1.reset() after mpButtonClick1.stop() - don't do that:
if (mpButtonClick1.isPlaying()) {
mpButtonClick1.stop();
mpButtonClick1.reset(); //<--------- calling reset(), remove this line
}
The docs for reset() say:
Resets the MediaPlayer to its uninitialized state. After calling this method, you will have to initialize it again by setting the data source and calling prepare().
Remove mpButtonClick1.reset() and it should work.
Keep in mind that MediaPlayer works as a state machine, which means that if you call methods in the wrong order, you'll get problems. Please read about MediaPlayer here and here.
Hey please use following
for stop -> media player
mp.seekTo(0);
mp.pause();
again for start just call
mp.start();
In my experience when I need to play multiple times and I may need to stop one play to start another play, (like in the case of multiple buttons), I just create another player, making sure that I release the resources for the previous one. To stop just use
mediaPlayer.stop();
But for play use something like this (adapt the logging to your specific needs) to create/recreate your player:
private boolean createMediaPlayer()
{
if (mediaPlayer!=null)
{
if(mediaPlayer.isPlaying())
{
mediaPlayer.stop();
mediaPlayer.reset();
mediaPlayer.release();
mediaPlayer=null;
}
}
mediaPlayer = new MediaPlayer();
mediaPlayer.setVolume(1f, 1f);
try
{
mediaPlayer.setAudioStreamType(Interop.PRIMARY_STREAM);
mediaPlayer.setDataSource(m_soundFile);
mediaPlayer.prepare();
return true;
// Interop.logDebug(TAG + "-loadAudio: SUCCESS" + m_soundFile);
} catch (Exception e)
{
Interop.logError(TAG + "-LoadAudio for Clic Sound: audioPlayer prepare failed for current file: " + m_soundFile);
Interop.logError(TAG + "-Exception: " , e);
return false;
}
}
and than use
if (createMediaPlayer())
mediaPlayer.start();
this will ensure proper release of the resources used by the media player.
A simple solution is to Use pause instead of stop and the seek to the beginning of the song.
I know that this question is quite old but recently while learning Android, I also got stuck at this point and found a very simple solution which I'd like to share with everyone.
Instead of trying to stop or reset the media, you can just seek back to the starting position.
mediaPlayer.seekTo(0);
For reference, I am also posting my code below:
public class MainActivity extends AppCompatActivity {
MediaPlayer mp;
public void play(View view) {
mp.start();
}
public void pause(View view) {
mp.pause();
}
public void stop(View view) {
// this seeks to the beginning of the file
mp.seekTo(0);
}
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mp = MediaPlayer.create(this, R.raw.sample_audio);
}
}

How to stop audio from playing when back button is pressed?

Hi all here is my code:
final ImageView imageView = (ImageView) findViewById(R.id.Image7);
imageView.setImageResource(mFullSizeIds[position]);
imageView.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
MediaPlayer mp = MediaPlayer.create(Audio.this,mAudio[position]);
mp.start();
}
});
Now this code works fine to play the audio when the user taps the image, however when I want to exit this activity and go to a different activity, the audio track is still playing, even when I press the home key the audio is still playing. How can I prevent this from happening?
Is there a way to stop the track from playing when the user taps the image again or presses the back/home button?
Add
#Override
public void onBackPressed ()
{
if (mp != null)
mp.stop();
super.onBackPressed();
}
and
#Override
public void onPause ()
{
if (mp != null)
{
mp.pause();
mp.stop();
}
super.onPause();
}
Create an onStop in the activity and make mp a class variable although I always create/prefer media player helper class for this sort of stuff. Then call mp.stop()/pause on onStop.
private MediaPlayer mp = null;
#Override
public void onStop() {
super.onStop();
if (mp != null) {
mp.stop();
}
}
then you just create it with removing the MediaPlayer before mp:
mp = MediaPlayer.create(Audio.this,mAudio[position]);
Override the onBackPressed method, and stop your MediaPlayer object, which is mp.

how to stop the playing sound from interface by main activity?

I am beginner at Android App I have new app which call html files from assets file one of the task on this app is when user selected check box input to value "on" the mp3 play and when user goout from app as press back button or press home button the sound stopped and close the app. I did my interface between html and main activity to call java methods at html. When I added my code to stop the sound it does not play . I tried to add this line of code in main activity oncreate method .
mp= MediaPlayer.create(mContext,R.raw.sound);
the sound stopped when press back or home or turnoff buttons . but the sound work when i open the app but this what i doesnot need i need this is when user select the checkbox . so how can i do it .
#Override
protected void onPause()
{
super.onPause();
if(mp.isPlaying())
mp.pause(); //stop the sound
}
#Override
protected void onResume()
{
super.onResume();
mp.start();
}
public class WebAppInterface {
Context mContext;
private MediaPlayer mp;
/** Instantiate the interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
/** Show a toast from the web page */
#JavascriptInterface
public void playsound(String value ) {
if (value.equals("on")) {
mp= MediaPlayer.create(mContext,R.raw.sound);
mp.setLooping(true);
mp.start();
}
else
{ mp.stop();}
}
}
I am assuming the issue is that the sound plays regardless whether you have selected the checkbox or not. A way to fix this would be to confirm whether the checkbox is checked or not in the onResume() method, instead of just starting regardless.
public class WebAppInterface extends Ramadan {
Context mContext;
private MediaPlayer mp;
private static boolean checked = false;
/** Instantiate the interface and set the context */
WebAppInterface(Context c) {
mContext = c;
}
/** Show a toast from the web page */
#JavascriptInterface
public void playsound(String value , MediaPlayer mp ) {
if (value.equals("on")) {
checked = true;
mp= MediaPlayer.create(mContext,R.raw.sound);
mp.setLooping(true);
mp.start();
}
else
{
checked = false;
mp.stop();
}
}
}
in your main class:
#Override
protected void onPause()
{
super.onPause();
if(mp.isPlaying())
mp.pause(); //stop the sound
}
#Override
protected void onResume()
{
super.onResume();
if(WebAppInterface.checked)
{
mp.start();
}
}

How to PLAY/STOP mediaplayer again?

I'm using a button "music" with 2 actions PLAY and STOP , when I click for the first time the music is played , then when I click again it's stopped. However when I click for the second time all actions PLAY/ STOP don't work .
public class Home extends Activity {
boolean isMediaOn=false;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageButton music=(ImageButton)findViewById(R.id.music);
final MediaPlayer sound=MediaPlayer.create(Accueil.this,R.raw.star);
music.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// play
if(isMediaOn==false)
{
System.out.println("PLAY");
sound.start();
music.setImageResource(R.drawable.music);
isMediaOn=true;
}
// stop
else
{
System.out.println("STOP");
if(sound.isPlaying()){
sound.reset();
sound.stop();
}
music.setImageResource(R.drawable.no_music);
isMediaOn=false;
}
}
});
Here is a screenshot of my logcat :
You're only allowed to call stop() when the player is in state STARTED, PREPARED, PAUSED or PLAYBACK_COMPLETE. Your reset() call is putting it back into IDLE state, causing stop() to fail.
You probably want to use pause(), as in sound.pause();
The pause() method pauses playback and maintains all other player states (such as file that's being played, location in file, etc).
In http://developer.android.com/reference/android/media/MediaPlayer.html#stop it is clearly stated that
'Once in the Stopped state, playback cannot be started until prepare() or prepareAsync() are called to set the MediaPlayer object to the Prepared state again.'
public class Home extends Activity {
boolean isMediaOn=false;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ImageButton music=(ImageButton)findViewById(R.id.music);
final MediaPlayer sound=MediaPlayer.create(Accueil.this,R.raw.star);
music.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
// play
if(isMediaOn==false)
{
System.out.println("PLAY");
try {
sound.prepare();
} catch (Exception e) {
Log.d(Settings.debug, e.toString());
}
sound.start();
music.setImageResource(R.drawable.music);
isMediaOn=true;
}
// stop
else
{
System.out.println("STOP");
if(sound.isPlaying()){
sound.reset();
sound.stop();
}
music.setImageResource(R.drawable.no_music);
isMediaOn=false;
}
}
});
Try this, hope this helps you.
final ImageButton music=(ImageButton)findViewById(R.id.music);
final MediaPlayer sound=MediaPlayer.create(Accueil.this,R.raw.star);
music.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if(sound.isPlaying()){
sound.stop();
music.setImageResource(R.drawable.no_music);
} else {
sound.start();
music.setImageResource(R.drawable.music);
}
});

Categories

Resources