简体   繁体   中英

Playing audio file using android media player

In my app, i'm using media player to play a single audio file (12 mb). The app contains three activities ManiActivity, MWlyrics, About. Audio is playing in MainActivity, the problem is when i switch between these activities..the audio stops playing.

 public class MainActivity extends AppCompatActivity {
        private MediaPlayer mp;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mp = MediaPlayer.create(this, R.raw.abc);
            getSupportActionBar().setElevation(0);
            ImageView imageView = (ImageView)findViewById(R.id.main_img_lm);
            Glide.with(this).load(R.drawable.lm)
                    .thumbnail(0.5f)
                    .into(imageView);




            }




            //play song method

        public void playSong (View v){
            mp.start();

        }

          //pause song method

        public void pauseSong (View v){
            mp.pause();
        }


          //stop song method

        public void stopSong (View v){
            mp.stop();
            mp = MediaPlayer.create(this, R.raw.abc);

            }

          // main menu
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            getMenuInflater().inflate(R.menu.menur, menu);

            menu.add(0, 1, 1, menuIconWithText(getResources().getDrawable(R.drawable.ic_rate), getResources().getString(R.string.rate_us)));
            menu.add(0, 2, 2, menuIconWithText(getResources().getDrawable(R.drawable.ic_apps), getResources().getString(R.string.more_apps)));
            menu.add(0, 3, 3, menuIconWithText(getResources().getDrawable(R.drawable.ic_share), getResources().getString(R.string.share_app)));
            menu.add(0, 4, 4, menuIconWithText(getResources().getDrawable(R.drawable.ic_info), getResources().getString(R.string.about)));
            menu.add(0, 5, 5, menuIconWithText(getResources().getDrawable(R.drawable.ic_exit), getResources().getString(R.string.exit)));
            return true;
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {


            switch (item.getItemId()) {

                    case 1:
                        Toast.makeText(MainActivity.this, "redirecting to rate us and review page page", Toast.LENGTH_SHORT).show();
                    return true;

                    case 2:
                        Toast.makeText(MainActivity.this, "thank you for using", Toast.LENGTH_SHORT).show();
                    return true;

                    case 3:
                        Toast.makeText(MainActivity.this, "sharing app..", Toast.LENGTH_SHORT).show();
                    return true;

                    case 4:
                        Toast.makeText(MainActivity.this, "about this app", Toast.LENGTH_SHORT).show();
                        Intent j = new Intent(this,About.class);
                        startActivity(j);
                        return true;

                    case 5:
                       finish();
                       mp.release();
                       return true;

                    case R.id.mdwtid:
                    Intent i = new Intent(this,MWLyrics.class);
                    startActivity(i);
                    return true;


            }

            return super.onOptionsItemSelected(item);
        }




        private CharSequence menuIconWithText(Drawable r, String title) {

            r.setBounds(0, 0, r.getIntrinsicWidth(), r.getIntrinsicHeight());
            SpannableString sb = new SpannableString("    " + title);
            ImageSpan imageSpan = new ImageSpan(r, ImageSpan.ALIGN_BOTTOM);
            sb.setSpan(imageSpan, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            return sb;
        }
    }

App Details..

MainActiviy - displays album image and [play, pause , and stop] images.

Mwlyrics - displays song lyrics.

About - display app info.

How to resolve this..

  1. How to continue playing audio while switching between other activities without any interruption.

  2. How to use this audio file efficiently in app .. considering memory.

when testing app on my mobile (moto one power, android pie) , i noticed that the Frequency (sometimes running 40 % ), and Maximum Usage 170 mb. What does it exactly mean. I'm new to android development and i need some suggestions about this.

You need to use service for this. You can check below code

class BackgroundAudioService extends Service implements OnCompletionListener {
  MediaPlayer mediaPlayer;

  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }

  @Override
  public void onCreate() {
    mediaPlayer = MediaPlayer.create(this, R.raw.s);// raw/s.mp3
    mediaPlayer.setOnCompletionListener(this);
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    if (!mediaPlayer.isPlaying()) {
      mediaPlayer.start();
    }
    return START_STICKY;
  }

  public void onDestroy() {
    if (mediaPlayer.isPlaying()) {
      mediaPlayer.stop();
    }
    mediaPlayer.release();
  }

  public void onCompletion(MediaPlayer _mediaPlayer) {
    stopSelf();
  }

}

You can start service like this

public class Test extends Activity implements OnClickListener {

  Button startPlaybackButton, stopPlaybackButton;
  Intent playbackServiceIntent;

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    startPlaybackButton = (Button) this.findViewById(R.id.StartPlaybackButton);
    stopPlaybackButton = (Button) this.findViewById(R.id.StopPlaybackButton);

    startPlaybackButton.setOnClickListener(this);
    stopPlaybackButton.setOnClickListener(this);

    playbackServiceIntent = new Intent(this, BackgroundAudioService.class);
  }

  public void onClick(View v) {
    if (v == startPlaybackButton) {
      startService(playbackServiceIntent);
      finish();
    } else if (v == stopPlaybackButton) {
      stopService(playbackServiceIntent);
      finish();
    }
  }
}

Please check the below utility class code to play the audio from anywhere in your code with all option start,stop,release sound adjust etc...

class AudioPlayer {
    private var mPlayer: MediaPlayer? = null
    companion object{
        var mContext:Context?= null
        var audioplayer : AudioPlayer?= null
        fun getInstance(context: Context): AudioPlayer {
            this.mContext = context;
            if(audioplayer == null){
                audioplayer = AudioPlayer()
            }
            return audioplayer!!
        }
    }

    fun getPlayer():MediaPlayer?{
        return mPlayer
    }

    fun adjustSound(){
        try {
            val am: AudioManager =
                mContext!!.getSystemService(Context.AUDIO_SERVICE) as AudioManager

            initVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
            maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

//        am.setStreamVolume(
//            AudioManager.STREAM_MUSIC,
//            am.getStreamMaxVolume(AudioManager.STREAM_MUSIC),
//            0
//        )
//
//        am.adjustVolume(AudioManager.ADJUST_SAME, AudioManager.FLAG_PLAY_SOUND)
        }catch (e:Exception){
            e.printStackTrace()
        }
    }

    fun initMediaPlayer(uriAudio: Uri) {
        try {
//            if (mPlayer == null) {
//                releaseMediaPlayer()
                adjustSound()
//                mPlayer = MediaPlayer()
                mPlayer = MediaPlayer.create(mContext, myUri(uriAudio))
                if (Build.VERSION.SDK_INT >= 21) {
                    val audioAttributes: AudioAttributes =
                        AudioAttributes.Builder()
                            .setUsage(AudioAttributes.USAGE_MEDIA)
                            .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                            .build()
                    mPlayer!!.setAudioAttributes(audioAttributes)
                } else {
                    mPlayer!!.setAudioStreamType(AudioManager.STREAM_MUSIC)
                }
//            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
    var initVolume : Int = 0
    var maxVolume : Int = 0
    var volumes:Float = -1f
    fun setVolume(progress:Float){
        try {
            volumes =
                (1 - Math.log((100 - progress).toDouble()) / Math.log(100.0)).toFloat()
            if(mPlayer!=null) {
                mPlayer!!.setVolume(volumes, volumes)
            }
        }catch (e:java.lang.Exception){
            e.printStackTrace()
        }
    }

    fun getVolume():Float{
        if(volumes < 0.0){
            volumes = 1.0f
        }
        return volumes
    }

    interface PlayerProgress{
        fun onProgressUpdate(progress:Int)
        fun onComplete(progress:Int)
    }
     var isprePared : Boolean = false
    fun initMediaPlayer(uriAudio: Uri,isAdjusSound:Boolean,playerProgress: PlayerProgress) {
        isprePared = false
        try {
            if(isAdjusSound){
                adjustSound()
            }

//            mPlayer = MediaPlayer()
            mPlayer = MediaPlayer.create(mContext, myUri(uriAudio))
//            try {
//                mPlayer!!.prepare()
//            } catch (e: IOException) {
//                e.printStackTrace()
//            }
//            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//                val speed = 0.25f
//                mPlayer!!.setPlaybackParams(mPlayer!!.getPlaybackParams().setSpeed(speed))
//            }

//            if(isAdjusSound) {
//                val volume = (initVolume / maxVolume).toFloat()
//                mPlayer!!.setVolume(volume, volume)
//            }

            if (Build.VERSION.SDK_INT >= 21) {
                val audioAttributes: AudioAttributes =
                    AudioAttributes.Builder()
//                        .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
//                        .setLegacyStreamType(AudioManager.STREAM_MUSIC)
                        .setUsage(AudioAttributes.USAGE_MEDIA)
                        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
                        .build()
                mPlayer!!.setAudioAttributes(audioAttributes)
            } else {
                mPlayer!!.setAudioStreamType(AudioManager.STREAM_MUSIC)
            }

            mPlayer!!.setOnBufferingUpdateListener(OnBufferingUpdateListener{ mediaPlayer: MediaPlayer, i: Int ->
                if(playerProgress!=null) {
                    playerProgress.onProgressUpdate(i)
                }
            })

            mPlayer!!.setOnCompletionListener {
                if(playerProgress!=null) {
                    playerProgress.onComplete(0)
                }
            }

            mPlayer!!.setOnBufferingUpdateListener(OnBufferingUpdateListener{ mediaPlayer: MediaPlayer, i: Int ->
                if(playerProgress!=null) {
                    playerProgress.onProgressUpdate(i)
                }
            })
            mPlayer!!.setOnPreparedListener() {
               isprePared = true
            }

        } catch (e:IllegalStateException) {
            e.printStackTrace();
        }catch (e: Exception) {
            e.printStackTrace()
        }
    }

    fun myUri(originalUri: Uri): Uri? {
        var returnedUri: Uri? = null
        returnedUri = if (originalUri.scheme == null) {
            Uri.fromFile(File(originalUri.getPath()))
            // or you can just do -->
            // returnedUri = Uri.parse("file://"+camUri.getPath());
        } else {
            originalUri
        }
        return returnedUri
    }


    fun playMediaPlayer() {
        try {
            if (mPlayer != null && !mPlayer!!.isPlaying/* && isprePared*/) {
                mPlayer!!.start()
            }
        }catch (e:IllegalStateException) {
            e.printStackTrace();
        }catch (e:java.lang.Exception){
            e.printStackTrace()
        }
    }

    fun seektoMediaPlayer(msec:Int) {
        try {
            if (mPlayer != null/*  && isprePared*/) {
                mPlayer!!.seekTo(msec)
            }
        }catch (e:java.lang.Exception){
            e.printStackTrace()
        }
    }

    fun pauseMediaPlayer() {
        try {
            if (mPlayer != null/*  && isprePared*/) {
                mPlayer!!.pause()
            }
        }catch (e:java.lang.Exception){
            e.printStackTrace()
        }
    }

    fun prepareMeidaPlayer(uriAudio: Uri) {
        try {
            if (mPlayer != null) {
                mPlayer!!.setDataSource(mContext!!, uriAudio)
                mPlayer!!.prepare()
            }
        } catch (e: IOException) {
            e.printStackTrace()
        }
    }

    fun stopMediaPlayer(completstop:Boolean) {
        try {
            if (mPlayer != null) {
                if (completstop) {
                    mPlayer!!.stop()
                } else {
                    mPlayer!!.pause()
                    mPlayer!!.seekTo(0)
                }
            }
        }catch (e:Exception){
            e.printStackTrace()
        }
    }

    fun releaseMediaPlayer(reset: Boolean) {
        try {
            if (mPlayer != null) {
                if(reset){
                    mPlayer!!.reset()
                    mPlayer!!.stop()
                }
                mPlayer!!.release()
                mPlayer = null
            }
        } catch (e: Exception) {
            e.printStackTrace()
        }
    }
}

you can call like this

    AudioPlayer.getInstance(this)
                .initMediaPlayer(Uri.parse(url), false, object : AudioPlayer.PlayerProgress {
                    override fun onProgressUpdate(progress: Int) {
//                        musicDialog.dismiss()
                    }

                    override fun onComplete(progress: Int) {
                        musicDialog.dismiss()
                    }
                })
            AudioPlayer.getInstance(this).playMediaPlayer()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM