【问题标题】:Play sound on android在安卓上播放声音
【发布时间】:2014-05-16 06:31:42
【问题描述】:
package gal.doron.ballinthehole;

import android.media.MediaPlayer;

public class Bricks 
{
    Brick[][] bricks;
    public Bricks(int rows, int cols, float brickW, float brickH)
    {
        bricks = new Brick[rows][cols];
        float x=0,y=0;
        for(int i=0;i<rows;i++,y+=brickH)
        {
            x=0;
            for(int j=0;j<cols;j++,x+=brickW)
            {
                bricks[i][j] = new Brick(x, y, brickW, brickH, 1);
            }
        }
    }

    public boolean isHitAll()
    {
        for(int i=0;i<rows();i++)
        {
            for(int j=0;j<cols();j++)
            {
                if(bricks[i][j].getType()!=0 && bricks[i][j].getType()!=4)
                    return false;
            }
        }
        MediaPlayer mp = MediaPlayer.create(this, R.raw.hopa);
        mp.start();
        return true;
    }
}

大家好,当调用“isHitAll()”的函数为真时(当所有的砖都被击中时),你能帮我播放声音(在我的例子中是声音 cal “hopa”)吗?

这是我的尝试.. 我在这一行中收到错误“MediaPlayer mp = MediaPlayer.create(this, R.raw.hopa);”
“MediaPlayer 类型中的方法 crate(Context, int) 不适用于参数 (Brick,int)”。

对不起我的英语,谢谢!

【问题讨论】:

    标签: android audio


    【解决方案1】:

    您收到错误The method crate(Context, int) in the type MediaPlayer is not applicable for the arguments (Brick,int)。因为您不能传递需要Context 的“Brick”类型的对象。由于Brick 不是,也没有扩展或实现Activity,所以它无法引用当前ActivityContext

    一种可能的解决方案是将Context 字段添加到您的Brick 类,然后使用Getter/Setter 在您的MainActivityOnCreate 中设置Context 字段。然后你想用 Context 字段构造 MediaPlayer。

    例子:

    package gal.doron.ballinthehole;
    
    import android.media.MediaPlayer;
    Context context;
    public class Bricks 
    
    {
        Brick[][] bricks;
        public Bricks(int rows, int cols, float brickW, float brickH)
        {
        bricks = new Brick[rows][cols];
        float x=0,y=0;
        for(int i=0;i<rows;i++,y+=brickH)
        {
            x=0;
            for(int j=0;j<cols;j++,x+=brickW)
            {
                bricks[i][j] = new Brick(x, y, brickW, brickH, 1);
            }
        }
    }
    
    public boolean isHitAll()
    {
        for(int i=0;i<rows();i++)
        {
            for(int j=0;j<cols();j++)
            {
                if(bricks[i][j].getType()!=0 && bricks[i][j].getType()!=4)
                    return false;
            }
        }
        MediaPlayer mp = MediaPlayer.create(context, R.raw.hopa);
        mp.start();
        return true;
    }
    
     public void setContext(Context context){
     this.context = context;
    }
    public Context getContext(Context context){
      return this.context;
    }
    

    }

    在你的MainActivity

      protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Brick.setContext(getContext());
    }
    

    【讨论】:

      【解决方案2】:

      MediaPlayer 需要一个 Activity 的上下文才能被创建。创建一个扩展 Application 的类并将应用程序上下文存储在公共静态变量中是很有帮助的。您也可以像这样将 Activity 的上下文传递给“Bricks”类构造函数:

      编辑:由于您不是从活动中调用此类,因此您应该尝试创建一个名为 MyApplication 或其他名称的新类并将其声明如下:

      public class MyApplication extends Application {
      
          public static Context context;
      
          onCreate() {
              super.onCreate();
      
      
              context = getApplicationContext();
      
          }
      
      }
      

      编辑:然后在 Bricks 中,在创建 MediaPlayer 时使用应用程序上下文。

        public class Bricks 
        {
      
        MediaPlayer mp;
      
        Brick[][] bricks;
        public Bricks(int rows, int cols, float brickW, float brickH)
        {
      
            mp = MediaPlayer.create(MyApplication.context, R.raw.hopa);
            bricks = new Brick[rows][cols];
            float x=0,y=0;
            for(int i=0;i<rows;i++,y+=brickH)
            {
                x=0;
                for(int j=0;j<cols;j++,x+=brickW)
                {
                    bricks[i][j] = new Brick(x, y, brickW, brickH, 1);
                }
            }
        }
      
        public boolean isHitAll()
        {
            for(int i=0;i<rows();i++)
            {
                for(int j=0;j<cols();j++)
                {
                    if(bricks[i][j].getType()!=0 && bricks[i][j].getType()!=4)
                        return false;
                }
            }
      
            mp.start();
            return true;
        }
      }
      

      希望这会有所帮助!

      【讨论】:

      • 能否请您附上您的 MainActivity 的代码?或者任何类调用 Bricks = new Bricks(...)?如果可能的话,还有你得到的错误?
      • 尝试在代码的前面声明 MediaPlayer,然后在构造函数中创建它。请立即查看编辑后的代码。您是否遇到同样的错误?
      猜你喜欢
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 2014-06-20
      • 1970-01-01
      • 1970-01-01
      • 2018-11-18
      • 2011-02-20
      相关资源
      最近更新 更多