By pressing the Play button more than once the sound plays simultaneously

1

My problem is this: I have an Android application that runs a Player, containing a "play" button, after the click appears "stop" and executes the sound.

It works in a Navigation Drawer, so far so good and runs right, when I open another screen through the side menu and re-open the player, the button appears again "play", and if I click again on the "play" begins to play another simultaneous sound, which was actually to the "stop" button is visible so that you can stop playing. Has anyone experienced this and has the solution? '

MainActivity.java

package com.teste.com.myapplication;

import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.design.widget.NavigationView;
import android.support.v4.app.NavUtils;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.content.Intent;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener, FragmentoRadio.OnFragmentInteractionListener{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);


    }

    @Override
    public void onBackPressed() {
        //Configuração do botão Voltar
        Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @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) {
        // 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.
        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        boolean FragmentTransaction = false;
        Fragment fragment = null;


        if (id == R.id.nav_radio) {
            // Handle the camera action
            Intent upIntent = NavUtils.getParentActivityIntent(this);
            fragment = new FragmentoRadio();
            FragmentTransaction = true;
        } else if (id == R.id.nav_gallery) {


        } else if (id == R.id.nav_slideshow) {


        } else if (id == R.id.nav_manage) {


        } else if (id == R.id.nav_share) {


        } else if (id == R.id.nav_send) {


        }

        if(FragmentTransaction) {
            getSupportFragmentManager().beginTransaction()
                    .replace(R.id.content_main, fragment)
                    .commit();

            item.setChecked(true);
            getSupportActionBar().setTitle(item.getTitle());
        }
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    @Override
    public void onFragmentInteraction(Uri uri) {

    }

}

FragmentoRadio

package com.teste.com.myapplication;

import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ToggleButton;

import java.io.IOException;


/**
 * A simple {@link Fragment} subclass.
 * Activities that contain this fragment must implement the
 * {@link FragmentoRadio.OnFragmentInteractionListener} interface
 * to handle interaction events.
 */
public class FragmentoRadio extends Fragment {

    private ToggleButton playPauseButton;
    private String STREAM_URL = "http://173.236.30.162:8119";
    private OnFragmentInteractionListener mListener;
    private MediaPlayer mp;
    private View view;

    public FragmentoRadio() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        mp = new MediaPlayer();
        view = inflater.inflate(R.layout.fragmento_radio, container, false);

        playPauseButton = (ToggleButton) view.findViewById(R.id.playPauseButton);

        playPauseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // Perform action on clicks
                if (playPauseButton.isChecked()) { // Checked - Pause icon visible
                    playPauseButton.setBackgroundResource(R.drawable.layout_button_stop);
                    mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    try {
                        mp.reset();
                        mp.setDataSource(STREAM_URL);
                        mp.prepareAsync();
                        mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
                            @Override
                            public void onPrepared(MediaPlayer mp) {
                                mp.start();

                            }
                        });
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                } if (mp.isPlaying() == true){ // Unchecked - Play icon visible
                    playPauseButton.setBackgroundResource(R.drawable.layout_button_play);
                    if (playPauseButton.isChecked()){

                    }else{
                        mp.stop();
                    }
                }
            }
        });
        return view;
    }


    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p/>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
}

Layout
radio_rapture

<!-- TODO: Update blank fragment layout -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background"
    android:id="@+id/content_main"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.teste.myapplication.MainActivity"
    tools:showIn="@layout/app_bar_main">
    <ToggleButton
        android:layout_width="210dp"
        android:layout_height="210dp"
        android:background="@drawable/layout_button_play"
        android:layout_weight="0.42"
        android:layout_alignWithParentIfMissing="false"
        android:id="@+id/playPauseButton"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="47dp"
        android:textOff=" "
        android:textOn=" "/>
</RelativeLayout>

    
asked by anonymous 17.03.2016 / 05:27

1 answer

0

Good morning, this is occurring because you are creating more than one instance of MediaPlayer. In this case ideally you create a Service to keep only one instance of MediaPlayer that will be running in Background in your application and then 'Bind' with the View being shown to the user.

The Android documentation shows you how to do this: link , Here's a simple example: link

    
17.03.2016 / 13:05