Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.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
Android 安卓:为什么我不能在点击按钮后播放声音?_Android_Audio_Android Ndk_Media Player - Fatal编程技术网

Android 安卓:为什么我不能在点击按钮后播放声音?

Android 安卓:为什么我不能在点击按钮后播放声音?,android,audio,android-ndk,media-player,Android,Audio,Android Ndk,Media Player,我已经做了,如果用户点击按钮,然后声音播放。但现在我听不到一些点击后的声音。我不知道为什么 这是我用来播放声音的代码 代码: 单击几下后,我在logcat中得到了这种类型的错误消息: 日志: 我认为问题在于你没有等到第一次完成(或停止)才开始第二次。。 完成后,请尝试收听上一个,然后启动下一个。。您可以使用setOnCompletionListener 类似问题: 代码: package ooo.iii; import java.io.IOException; i

我已经做了,如果用户点击按钮,然后声音播放。但现在我听不到一些点击后的声音。我不知道为什么

这是我用来播放声音的代码

代码:

单击几下后,我在logcat中得到了这种类型的错误消息:

日志:


我认为问题在于你没有等到第一次完成(或停止)才开始第二次。。 完成后,请尝试收听上一个,然后启动下一个。。您可以使用setOnCompletionListener

类似问题:

代码:

    package ooo.iii;

    import java.io.IOException;


    import android.app.Activity;
    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

    public class Test_audioActivity extends Activity { 
        /** Called when the activity is first created. */
        Button btn;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        setContentView(R.layout.main); 
            setContentView(R.layout.main);
            btn=(Button)findViewById(R.id.ss);

            btn.setOnClickListener(new OnClickListener() { 

                @Override
                public void onClick(View v) {
                    playSound(R.raw.musi);

                }
            });

        }



    public void playSound(int resources){
        try{
        boolean mStartPlaying = true;
        MediaPlayer  mPlayer=null;
    if (mStartPlaying==true){

          mPlayer = new MediaPlayer();
        Uri uri = Uri.parse("android.resource://ooo.iii/" + resources);

            mPlayer.setDataSource(getApplicationContext(),uri);
            mPlayer.prepare();
            mPlayer.start();

    } 
    else{
       //   stopPlaying();
        //rePlay.setText("Replay");
        mPlayer.release();
        mPlayer = null;
    }
    mStartPlaying = !mStartPlaying;


    } 
    catch (IOException e){
        Log.e("ERR", "prepare() failed");
    }
    }



}
您需要更改:

1-来源@res/raw/musi。。给你的

2-res/layout/main.xml处的按钮id从ss到您的

3-Uri=Uri.parse(“android。resource://ooo.iii/“+资源);将包名修改为您的包名

就这些。。我在真实设备上进行了测试,多次单击,在仍在播放的前一个设备上获得了新的声音

您需要释放()媒体播放器,否则资源不会释放,您很快就会耗尽内存(因为您下次会再次分配它们)。 所以,我认为你可以玩两次甚至三次。。。但不是很多次没有释放资源


建议在不再使用MediaPlayer对象后,立即调用release(),以便立即释放与MediaPlayer对象关联的内部播放器引擎使用的资源。资源可能包括单例资源,如硬件加速组件,调用release()失败可能会导致MediaPlayer对象的后续实例退回到软件实现或完全失败。

MediaPlayer的设计不适合您尝试使用它的方式。这就是你面临问题的原因


MediaPlayer是`当您播放小音效时,这不是一个好的选择,因为用户可以很快单击多个按钮,并且您必须为所有按钮创建一个MP对象,而不是在您单击按钮时同步进行。选择SoundPool类,该类允许您在内存中加载较小的声音,您可以随时播放这些声音,而不会像在mediaplayer中那样感觉到任何延迟。这是一个很好的教程:

我也遇到了同样的问题,我使用OnCompletionListener中的release()方法解决了这个问题:

MediaPlayer mp = MediaPlayer.create(getApplicationContext(), resource);
        mp.start();
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
            }
        });

我明白你的意思,但如果你想再玩一次,即使它没有停下来,那么?在这种情况下。。使用mediaplayer的另一个实例。。重点是,如果它忙于其他事情,就不要使用同一个对象。好的,它对我有用吗?我的意思是,如果我连续单击同一个按钮,那么?我想是的,将mPlayer作为局部变量比类成员实例更容易。。因此,无论何时调用playSound(..),都将使用另一个版本的变量…抱歉,RAJU。。你错了,我现在在我的设备上进行了测试,它可以正常工作。。我将在我的答案中包含的代码作为更新…如果可以,请使用soundPool。在处理能力较低的手机上,多个MediaPlayer实例将开始滞后。我遇到了这个问题,不得不改用SoundPool
    package ooo.iii;

    import java.io.IOException;


    import android.app.Activity;
    import android.media.MediaPlayer;
    import android.net.Uri;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;

    public class Test_audioActivity extends Activity { 
        /** Called when the activity is first created. */
        Button btn;
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        setContentView(R.layout.main); 
            setContentView(R.layout.main);
            btn=(Button)findViewById(R.id.ss);

            btn.setOnClickListener(new OnClickListener() { 

                @Override
                public void onClick(View v) {
                    playSound(R.raw.musi);

                }
            });

        }



    public void playSound(int resources){
        try{
        boolean mStartPlaying = true;
        MediaPlayer  mPlayer=null;
    if (mStartPlaying==true){

          mPlayer = new MediaPlayer();
        Uri uri = Uri.parse("android.resource://ooo.iii/" + resources);

            mPlayer.setDataSource(getApplicationContext(),uri);
            mPlayer.prepare();
            mPlayer.start();

    } 
    else{
       //   stopPlaying();
        //rePlay.setText("Replay");
        mPlayer.release();
        mPlayer = null;
    }
    mStartPlaying = !mStartPlaying;


    } 
    catch (IOException e){
        Log.e("ERR", "prepare() failed");
    }
    }



}
MediaPlayer mp = MediaPlayer.create(getApplicationContext(), resource);
        mp.start();
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
            @Override
            public void onCompletion(MediaPlayer mp) {
                mp.release();
            }
        });