首页 > 解决方案 > android studio中的媒体播放器问题

问题描述

我似乎无法让媒体播放器在我的应用程序中播放音乐。我设法让它在另一个项目上工作,但似乎无法在当前项目中正确实施。每次我单击音乐标签时,都会导致应用程序崩溃并打印出下面的错误消息。任何帮助,将不胜感激。谢谢!

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.

标签: javaandroidandroid-studioandroid-mediaplayer

解决方案


我知道你解决了你的问题,但以防万一我想和你分享这门课。它是一个帮助类,允许您在应用程序的任何位置播放声音。

所以这是类:

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();

你也可以修改这个类来满足你的需要。

编辑 顺便说一句,您的音频文件应该在您的应用程序的资产文件夹中

此致


推荐阅读