Неожиданное поведение MediaPlayer Android - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь транслировать mp3-файл из inte rnet. Приложение успешно запущено, но показывает непредвиденное поведение. Воспроизведение не воспроизводит звук, кнопка воспроизведения не меняет свой значок. Воспроизведение останавливается после отображения сообщения «Пожалуйста, подождите», когда ожидается воспроизведение файла при нажатии на значок воспроизведения.

Вот мой код:

MainActivity. java

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageButton;
import android.widget.SeekBar;
import android.widget.TextView;

import java.util.concurrent.TimeUnit;

import dyanamitechetan.vusikview.VusikView;

public class MainActivity extends AppCompatActivity implements MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener {

    ImageButton imageButton;
    SeekBar seekBar;
    TextView textView;

    VusikView musicView;

    MediaPlayer mediaPlayer;
    int mediaFileLength;
    int realTimeLength;
    final Handler handler = new Handler();

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

        musicView = findViewById(R.id.musicView);

        seekBar = findViewById(R.id.seekbar);
        seekBar.setMax(99);
        seekBar.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if(mediaPlayer.isPlaying()){
                    SeekBar seekBar = (SeekBar) view;
                    int playPosition = (mediaFileLength/100)*seekBar.getProgress();
                    mediaPlayer.seekTo(playPosition);
                }
                return false;
            }
        });

        imageButton = findViewById(R.id.btn_play_pause);
        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                final ProgressDialog mDialog = new ProgressDialog(MainActivity.this);

                AsyncTask<String,String,String>mp3Play = new AsyncTask<String, String, String>() {

                    @Override
                    protected void onPreExecute(){
                        mDialog.setMessage("Please wait");
                        mDialog.show();
                    }

                    @Override
                    protected String doInBackground(String... strings) {
                        try {
                            mediaPlayer.setDataSource(strings[0]);
                            mediaPlayer.prepare();
                        }
                        catch (Exception ex){

                        }
                        return "";
                    }

                    @Override
                    protected void onPostExecute(String s) {
                        mediaFileLength = mediaPlayer.getDuration();
                        realTimeLength = mediaFileLength;
                        if(!mediaPlayer.isPlaying()){
                            mediaPlayer.start();
                            imageButton.setImageResource(R.drawable.ic_pause);
                        } else {
                            mediaPlayer.pause();
                            imageButton.setImageResource(R.drawable.ic_play);
                        }
                        updateSeekBar();
                        mDialog.dismiss();
                    }
                };

                mp3Play.execute("https://soundcloud.com/theastonshuffle/nasa-feat-kanye-west-santogold-lykke-li-gifted-aston-shuffle-long-mix");

                musicView.start();
            }
        });

        mediaPlayer = new MediaPlayer();
        mediaPlayer.setOnBufferingUpdateListener(this);
        mediaPlayer.setOnCompletionListener(this);

    }

    private void updateSeekBar() {
        seekBar.setProgress((int)((float)mediaPlayer.getCurrentPosition() / mediaFileLength*100));

        if(mediaPlayer.isPlaying()){
            Runnable updater = new Runnable() {
                @Override
                public void run() {
                    updateSeekBar();
                    realTimeLength-=1000;
                    textView.setText(String.format("%d:%d", TimeUnit.MILLISECONDS.toMinutes(realTimeLength),
                            TimeUnit.MILLISECONDS.toSeconds(realTimeLength) -
                            TimeUnit.MILLISECONDS.toSeconds(TimeUnit.MILLISECONDS.toMinutes(realTimeLength))));
                }
            };
            handler.postDelayed(updater,1000);
        }
    }

    @Override
    public void onBufferingUpdate(MediaPlayer mediaPlayer, int i) {
        seekBar.setSecondaryProgress(i);
    }

    @Override
    public void onCompletion(MediaPlayer mediaPlayer) {

        imageButton.setImageResource(R.drawable.ic_play);
        musicView.stopNotesFall();
    }
}

Activity_main. xml

 <dyanamitechetan.vusikview.VusikView
        android:id="@+id/musicView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

    <RelativeLayout
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/textTimer"
            android:layout_centerHorizontal="true"
            android:text="00:00"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <ImageButton
            android:layout_below="@id/textTimer"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/btn_play_pause"
            android:src="@drawable/ic_play"/>

        <SeekBar
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/btn_play_pause"
            android:id="@+id/seekbar"/>
    </RelativeLayout>

1 Ответ

0 голосов
/ 01 апреля 2020

ваше приложение подключено Inte rnet?, пожалуйста, проверьте манифест это добавить inte * разрешение 1005 * Вы можете использовать метод mediaplay.setdataSource (url); непосредственно для загрузки и установить mediaplay.prepareAsync (); использовать асинхронный метод для загрузки музыки Не нужно использовать AsyncTask

...