Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java MediaPlayer播放和重播问题_Java_Android_Android Mediaplayer - Fatal编程技术网

Java MediaPlayer播放和重播问题

Java MediaPlayer播放和重播问题,java,android,android-mediaplayer,Java,Android,Android Mediaplayer,我正试图建立一个媒体播放器的声音,可以播放和重放多次希望。但是我在第一次播放音频时遇到了这个错误: 08-23 14:48:52.613: E/MediaPlayer(24194): error (1, -2147483648) 08-23 14:48:52.613: V/Preschool Basics(24194): Prepare failed.: status=0x1 我调用剧本的代码是: btnPlay = (Button) findViewById(R.id.soundBu

我正试图建立一个媒体播放器的声音,可以播放和重放多次希望。但是我在第一次播放音频时遇到了这个错误:

08-23 14:48:52.613: E/MediaPlayer(24194): error (1, -2147483648)
08-23 14:48:52.613: V/Preschool Basics(24194): Prepare failed.: status=0x1
我调用剧本的代码是:

    btnPlay = (Button) findViewById(R.id.soundButton);
    btnStop = (Button) findViewById(R.id.stopButton);

    mpSound = MediaPlayer.create(this, R.raw.a);
    mpSound.setLooping(false);
    btnPlay.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
                //mpSound.start();
                Uri uri = Uri.parse("android.resource://com.test.testing/" + R.raw.a);
                //Toast.makeText(getApplicationContext(), uri.toString(), 2000).show();
                playSong(uri.toString());
                btnPlay.setVisibility(View.GONE);
                btnStop.setVisibility(View.VISIBLE);
                btnStop.setOnClickListener(stopSound);
        }
    });

View.OnClickListener stopSound = new View.OnClickListener() {
    public void onClick(View v) {
        if (mpSound != null) {
            mpSound.stop();
            //mpSound.release();
            btnPlay.setVisibility(View.VISIBLE);
            btnStop.setVisibility(View.GONE);
        }
    }
};
playSong()
功能是:

    private void playSong(String songPath) {
        try {

                mpSound.reset();
                mpSound.setDataSource(songPath);
                mpSound.prepare();
                mpSound.start();

                //Stop the song and replace button
                mpSound.setOnCompletionListener(new OnCompletionListener() {
                        public void onCompletion(MediaPlayer arg0) {
                            mpSound.stop();
                            btnPlay.setVisibility(View.VISIBLE);
                            btnStop.setVisibility(View.GONE);
                        }

                });

        } catch (IOException e) {
                Log.v(getString(R.string.app_name), e.getMessage());
        }
}
我的声音位于
res/raw/a.mp3

当我按下
btnPlay
按钮时,显示的是
btnStop
按钮,但没有播放任何内容

我希望让用户玩、停、玩等等。我怎样才能做到呢

日志:

08-23 15:41:20.761: E/AndroidRuntime(29438): FATAL EXCEPTION: main
08-23 15:41:20.761: E/AndroidRuntime(29438): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.test.testing/com.test.testing.AlpDisplay}: java.lang.NullPointerException
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2222)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2356)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.app.ActivityThread.access$600(ActivityThread.java:150)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.os.Looper.loop(Looper.java:137)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.app.ActivityThread.main(ActivityThread.java:5195)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at java.lang.reflect.Method.invokeNative(Native Method)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at java.lang.reflect.Method.invoke(Method.java:511)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at dalvik.system.NativeStart.main(Native Method)
08-23 15:41:20.761: E/AndroidRuntime(29438): Caused by: java.lang.NullPointerException
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.content.ContextWrapper.getResources(ContextWrapper.java:89)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:78)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.media.MediaPlayer.create(MediaPlayer.java:824)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at com.test.testing.MusicPlayer.<init>(MusicPlayer.java:13)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at com.test.testing.AlpDisplay.<init>(AlpDisplay.java:45)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at java.lang.Class.newInstanceImpl(Native Method)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at java.lang.Class.newInstance(Class.java:1319)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.app.Instrumentation.newActivity(Instrumentation.java:1054)
08-23 15:41:20.761: E/AndroidRuntime(29438):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
08-23 15:41:20.761: E/AndroidRuntime(29438):    ... 11 more
08-23 15:41:20.761:E/AndroidRuntime(29438):致命异常:main
08-23 15:41:20.761:E/AndroidRuntime(29438):java.lang.RuntimeException:无法实例化活动组件信息{com.test.testing/com.test.testing.AlpDisplay}:java.lang.NullPointerException
08-23 15:41:20.761:E/AndroidRuntime(29438):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2222)
08-23 15:41:20.761:E/AndroidRuntime(29438):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2356)
08-23 15:41:20.761:E/AndroidRuntime(29438):在android.app.ActivityThread.access$600(ActivityThread.java:150)
08-23 15:41:20.761:E/AndroidRuntime(29438):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
08-23 15:41:20.761:E/AndroidRuntime(29438):位于android.os.Handler.dispatchMessage(Handler.java:99)
08-23 15:41:20.761:E/AndroidRuntime(29438):在android.os.Looper.loop(Looper.java:137)
08-23 15:41:20.761:E/AndroidRuntime(29438):位于android.app.ActivityThread.main(ActivityThread.java:5195)
08-23 15:41:20.761:E/AndroidRuntime(29438):位于java.lang.reflect.Method.Invokenactive(本机方法)
08-23 15:41:20.761:E/AndroidRuntime(29438):位于java.lang.reflect.Method.invoke(Method.java:511)
08-23 15:41:20.761:E/AndroidRuntime(29438):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
08-23 15:41:20.761:E/AndroidRuntime(29438):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
08-23 15:41:20.761:E/AndroidRuntime(29438):在dalvik.system.NativeStart.main(本机方法)
08-23 15:41:20.761:E/AndroidRuntime(29438):由以下原因引起:java.lang.NullPointerException
08-23 15:41:20.761:E/AndroidRuntime(29438):位于android.content.ContextWrapper.getResources(ContextWrapper.java:89)
08-23 15:41:20.761:E/AndroidRuntime(29438):在android.view.ContextThemeWrapper.getResources(ContextThemeWrapper.java:78)
08-23 15:41:20.761:E/AndroidRuntime(29438):在android.media.MediaPlayer.create(MediaPlayer.java:824)上
08-23 15:41:20.761:E/AndroidRuntime(29438):在com.test.testing.MusicPlayer(MusicPlayer.java:13)
08-23 15:41:20.761:E/AndroidRuntime(29438):位于com.test.testing.AlpDisplay(AlpDisplay.java:45)
08-23 15:41:20.761:E/AndroidRuntime(29438):位于java.lang.Class.newInstanceImpl(本机方法)
08-23 15:41:20.761:E/AndroidRuntime(29438):位于java.lang.Class.newInstance(Class.java:1319)
08-23 15:41:20.761:E/AndroidRuntime(29438):在android.app.Instrumentation.newActivity(Instrumentation.java:1054)上
08-23 15:41:20.761:E/AndroidRuntime(29438):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
08-23 15:41:20.761:E/AndroidRuntime(29438):。。。还有11个

这可以做得简单得多。我已经测试了这段代码,它正在工作:

MusicPlayer.java

public class MusicPlayer
{
    private final int songResId = R.raw.your_song;
    private final MediaPlayer mediaPlayer;

    public MusicPlayer(Context context)
    {
        mediaPlayer = MediaPlayer.create(context, songResId);
        mediaPlayer.setLooping(true);
    }

    public void setPlaying(boolean isPlaying)
    {
        if (isPlaying)
        {
            mediaPlayer.start();
        }
        else
        {
            mediaPlayer.stop();
        }
    }

    public void release()
    {
        mediaPlayer.stop();
        mediaPlayer.release();
    }
}
用法(从您的
活动中)

确保你理解


对于我推荐的歌曲,OGG格式(最大压缩)比MP3格式要好,因为它通常占用的空间少50%,而且质量难以区分。例如,您可以使用转换文件。

在我测试代码之前,应该在我的
活动下的代码
哪一部分也会进入
停止按钮
?我仅在onDestroy和onBackPressed函数期间调用
release()
。如果我想为不同的按钮播放不同的文件,我还可以向MusicLayer传递一些信息吗?在停止按钮侦听器中,您只需调用
MusicLayer.setPlaying(false)
(并隐藏您的按钮或其他您想做的事情)。在您的
onPause()
方法中,您应该调用
release()
,因为您的
活动
不再可见,因此您不想播放音乐,您想释放与
MediaPlayer
相关的资源。我可以将我的代码发布到网上供您查看吗?我做了更改,但现在我的应用是FC。对不起,强制关闭,它说无法实例化活动。你可以发布。但是我发布的代码确实应该有效。粘贴堆栈跟踪。
MusicPlayer musicPlayer = new MusicPlayer(this);
musicPlayer.setPlaying(true);  // play
musicPlayer.setPlaying(false); // stop
musicPlayer.setPlaying(true);  // play from the beginning    
musicPlayer.release();         // when done using MusicPlayer