Могу ли я сделать одну функцию для всех видов деятельности, чтобы воспроизводить, приостанавливать музыку

#android #android-studio #android-activity #singleton #android-music-player

Вопрос:

Первое Занятие

 package com.example.birthdaywish;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {


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

    
    public void wishButton(View view) {
        final EditText editText = findViewById(R.id.editTextTextPersonName);
        String name = editText.getText().toString();

        Intent intent =  new Intent(this, screen2.class);
        intent.putExtra("name", name);



        startActivity(intent);

        MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.happy_birthday_song);
        mediaPlayer.start(); // no need to call prepare(); create() does that for you




    }

}
 

Выше приведено мое первое занятие. В котором я воспроизводил музыку при нажатии кнопки, в то же время нажатие кнопки также откроет второе действие.

Второе Мероприятие

 package com.example.birthdaywish;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import org.w3c.dom.Text;

public class screen2 extends AppCompatActivity {


    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_screen2);
        TextView enteredName = findViewById(R.id.textView2);
        String name = getIntent().getStringExtra("name");
        enteredName.setText("Happy Birthday "  name);


    }



    public void displayMessage(View view) {
      
        

    }
}
 

Теперь, когда нажата кнопка отображения сообщения, я хочу остановить музыку, которая воспроизводится в первом действии. Или я могу сделать это любым другим способом, например, создать общую функцию для музыкального проигрывателя, имеющую метод запуска и остановки, и я могу вызывать их всякий раз, когда захочу запустить или остановить музыку в любом действии?

Ответ №1:

Я вижу два варианта:

  1. Сделайте MediaPlayer статический объект.
  2. Рассмотрите возможность внедрения единого деятельностного подхода. У вас будет два фрагмента и общий ViewModel доступ, к которым вы сможете получить доступ MediaPlayer .

Комментарии:

1. Сэр, я новичок, и это мой первый проект. Я начал изучать разработку Android, перейдя в проект. Итак, вы можете предоставить мне код?

Ответ №2:

Создайте класс Utils, в котором вы создадите глобальный метод воспроизведения и приостановки музыкального проигрывателя.

В этом классе Utils:

 private static MediaPlayer mediaPlayer;
private static int seek_position;

public static void playMedia(Context context, int music) {
    if (mediaPlayer.isPlaying() amp;amp; mediaPlayer != null) {
        mediaPlayer.stop();
        mediaPlayer.release();
    }
    mediaPlayer = MediaPlayer.create(context, music);
    try {
        mediaPlayer.prepare();
    } catch (IOException e) {
        e.printStackTrace();
    }
    mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
        @Override
        public void onPrepared(MediaPlayer mp) {
            mediaPlayer.start();
        }
    });
}
 

Используйте этот метод всякий раз, когда вы хотите воспроизвести носитель таким образом:

 Utils.playMedia(this, R.raw.happy_birthday_song);
 

Теперь, если вы хотите реализовать функции глобальной паузы, возобновления и остановки, используйте это (создайте эти методы в одном классе Utils).

 public static void pauseMedia(Context context) {
    if (mediaPlayer.isPlaying() amp;amp; mediaPlayer != null) {
        seek_position = mediaPlayer.getCurrentPosition();
        mediaPlayer.pause();
    }
}

public static void resumeMedia(Context context) {
    if (!mediaPlayer.isPlaying() amp;amp; mediaPlayer != null) {
        mediaPlayer.seekTo(seek_position);
        mediaPlayer.start();
    }
}

public static void stopMedia(Context context) {
    if (mediaPlayer.isPlaying() amp;amp; mediaPlayer != null) {
        mediaPlayer.stop();
    }
}
 

Используйте эти методы везде, где вы хотите, в своем приложении, просто вызывая их, как первый метод.

ПРИМЕЧАНИЕ : Разница здесь между pause() amp; stop() заключается в том , что вам нужно снова подготовить медиаплеер, если вы используете stop() , в то pause() время как это не требуется.