Проблема с медиаплеером в андроид студии - PullRequest
0 голосов
/ 18 декабря 2018

Я не могу заставить медиаплеер воспроизводить музыку в моем приложении.Мне удалось заставить его работать над другим проектом, но я не могу реализовать его правильно в текущем.Каждый раз, когда я нажимаю на вкладку для музыки, происходит сбой приложения и выводится сообщение об ошибке ниже.Любая помощь будет оценена.Спасибо!

package com.example.android.japaneselanguageapp;

public class Word {

    /*Default translation for the word*/
    private String jDefaultTranslation;
    /*Japanese translation for the word*/
    private String jJapaneseTranslation;

    /*Image resource ID for the word*/
    private int jimageResourceId = NO_IMAGE;

    /*Constant to set no image state */
    private static final int NO_IMAGE = -1;

    /*resource id for word*/
    private int mAudioId;




               public Word(String defaultTranslation, String japaneseTranslation, int audioResourceId){

                    jDefaultTranslation = defaultTranslation;
                    jJapaneseTranslation = japaneseTranslation;
                    mAudioId = audioResourceId;

                }

                /*Overloaded Constructor for everything needing images*/
                public Word(String defaultTranslation, String japaneseTranslation, int imageResourceId, int audioResourceId){

                    jDefaultTranslation = defaultTranslation;
                    jJapaneseTranslation = japaneseTranslation;
                    jimageResourceId = imageResourceId;
                    mAudioId = audioResourceId;
                }

            public int getaudioResourceId(){
                    return mAudioId;

                }


    package com.example.android.japaneselanguageapp;

    import android.media.MediaPlayer;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ListView;


    import java.util.ArrayList;

    public class NumbersActivity extends AppCompatActivity {

        private MediaPlayer mMediaPlayer;

        /*listener will be triggered when mediaplayer finishes*/
        private MediaPlayer.OnCompletionListener mCompletionListener = new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mediaPlayer) {
                // Now that the sound file has finished playing, release the media player resources.
                releaseMediaPlayer();
            }
        };

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

            /*Create an array list of words*/
            final ArrayList<Word> words = new ArrayList<>();

            /* the last parameter is switched by added audio files to raw folder and declaring*/
            words.add(new Word("One", "Ichi", R.drawable.japanese_flag, R.raw.outkast));

     WordAdapter adapter = new WordAdapter(this, words);

            ListView listView = findViewById(R.id.list);

            listView.setAdapter(adapter);


            // Register the onClick listener with the implementation above
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    Word word = words.get(position);

                    /*releases if currently existing, to play new media*/
                    releaseMediaPlayer();

                    mMediaPlayer = MediaPlayer.create(NumbersActivity.this, word.getaudioResourceId());
                    mMediaPlayer.start();

                    mMediaPlayer.setOnCompletionListener(mCompletionListener);

                }});
        }

        @Override
        protected void onStop() {
            super.onStop();
            /*when activity is stopped, releases media player so there isn't any sound being played*/
            releaseMediaPlayer();
        }


        /* releases mediaplayer*/
        private void releaseMediaPlayer() {
            // If the media player is not null, then it may be currently playing a sound.
            if (mMediaPlayer != null) {
                mMediaPlayer.release();
                mMediaPlayer = null;
            }
        }
    }




                The log cat error below:



                    E/MediaPlayerNative: error (1, -2147483648)
                    D/MediaPlayer: create failed:
                        java.io.IOException: Prepare failed.: status=0x1
                            at android.media.MediaPlayer._prepare(Native Method)
                            at android.media.MediaPlayer.prepare(MediaPlayer.java:1282)
                            at android.media.MediaPlayer.create(MediaPlayer.java:983)
                            at android.media.MediaPlayer.create(MediaPlayer.java:954)
                            at com.example.android.japaneselanguageapp.NumbersActivity$2.onItemClick(NumbersActivity.java:83)
                            at android.widget.AdapterView.performItemClick(AdapterView.java:318)
                            at android.widget.AbsListView.performItemClick(AbsListView.java:1159)
                            at android.widget.AbsListView$PerformClick.run(AbsListView.java:3136)
                            at android.widget.AbsListView$3.run(AbsListView.java:4052)
                            at android.os.Handler.handleCallback(Handler.java:873)
                            at android.os.Handler.dispatchMessage(Handler.java:99)
                            at android.os.Looper.loop(Looper.java:193)
                            at android.app.ActivityThread.main(ActivityThread.java:6669)
                            at java.lang.reflect.Method.invoke(Native Method)
                            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
                    D/AndroidRuntime: Shutting down VM
                    E/AndroidRuntime: FATAL EXCEPTION: main
                        Process: com.example.android.japaneselanguageapp, PID: 17776
                        java.lang.NullPointerException: Attempt to invoke virtual method 'void android.media.MediaPlayer.start()' on a null object reference
                            at com.example.android.japaneselanguageapp.NumbersActivity$2.onItemClick(NumbersActivity.java:84)
                            at android.widget.AdapterView.performItemClick(AdapterView.java:318)
                            at android.widget.AbsListView.performItemClick(AbsListView.java:1159)
                            at android.widget.AbsListView$PerformClick.run(AbsListView.java:3136)
                            at android.widget.AbsListView$3.run(AbsListView.java:4052)
                            at android.os.Handler.handleCallback(Handler.java:873)
                            at android.os.Handler.dispatchMessage(Handler.java:99)
                            at android.os.Looper.loop(Looper.java:193)
                            at android.app.ActivityThread.main(ActivityThread.java:6669)
                            at java.lang.reflect.Method.invoke(Native Method)
                            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
                    Application terminated.

1 Ответ

0 голосов
/ 19 декабря 2018

Я знаю, что вы исправили свою проблему, но на всякий случай я хочу поделиться с вами этим классом.Это вспомогательный класс, который позволяет воспроизводить звук в любом месте вашего приложения.

Итак, это класс:

package com.oyduts.blindtest.Helpers;

import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.media.MediaPlayer;
import android.os.CountDownTimer;
import android.widget.Toast;

import java.io.Console;
import java.io.IOException;
import java.io.InputStream;

public class MediaManager
{
    private static MediaPlayer _mediaPlayer;
    private static Context _context;
    private static int _pausedAt;
    private static CountDownTimer _countDownTimer;

    public static Bitmap GetBitmapFromAssets(Context c, String filename)
    {
        AssetManager am = c.getAssets();
        InputStream is = null;
        try
        {
            is = am.open(filename);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return BitmapFactory.decodeStream(is);
    }

    public static void InitMediaPlayer(Context c)
    {
        _context = c;
        _mediaPlayer = new MediaPlayer();
    }
    public static void LoadMusic(String filePath)
    {
        try
        {
            _mediaPlayer.reset();
            AssetFileDescriptor afd = _context.getAssets().openFd(filePath);
            _mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getDeclaredLength());
            _mediaPlayer.prepare();
            afd.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            Toast.makeText(_context, "Couldn't load the music, please check your data folder.", Toast.LENGTH_SHORT).show();
        }
    }
    public static void PauseMusic()
    {
        try
        {
            if (_mediaPlayer != null && _mediaPlayer.isPlaying())
            {
                _pausedAt = _mediaPlayer.getCurrentPosition();
                _mediaPlayer.pause();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public static void PlayMusic()
    {
        try
        {
            if (_mediaPlayer != null && !_mediaPlayer.isPlaying()) _mediaPlayer.start();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public static void ResumeMusic()
    {
        try
        {
            if (_mediaPlayer != null && !_mediaPlayer.isPlaying())
            {
                _mediaPlayer.seekTo(_pausedAt);
                _mediaPlayer.start();
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public static void StopMusic()
    {
        try
        {
            if (_mediaPlayer != null && _mediaPlayer.isPlaying()) _mediaPlayer.stop();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    public static void ReleaseMusic()
    {
        try
        {
            if (_mediaPlayer != null) _mediaPlayer.release();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

И есть пример того, как его использовать:

Сначала запустите проигрыватель в вашем методе onCreate:

// Init mediaplayer
MediaManager.InitMediaPlayer(this);

Затем, если вы хотите загрузить звук перед его фактическим воспроизведением:

MediaManager.LoadMusic("your_file_path");

Затем вы можете воспроизводить музыкуиспользуя:

MediaManager.PlayMusic();

Чтобы остановить музыку:

MediaManaer.StopMusic();

Вы также можете возобновить музыку (например, в методе onResume):

MediaManager.ResumeMusic();

И наконец, не забудьте в конце освободить плеер:

MediaManager.ReleaseMusic();

Вы также можете изменить этот класс в соответствии со своими потребностями.

РЕДАКТИРОВАТЬ Кстати, ваши аудио файлы должны быть в папке активов вашего приложения

С наилучшими пожеланиями

...