【问题标题】:Android: OnClick play random .mp3 from /res/raw fileAndroid:OnClick 播放来自 /res/raw 文件的随机 .mp3
【发布时间】:2013-09-27 02:56:50
【问题描述】:

我对 Android 应用程序开发相当陌生,我正在尝试播放 /res/raw 文件夹中的随机 .mp3。

FIXED到目前为止我有这个,但我遇到了 FileNotFoundException。

FIXED 仅在第一次点击时播放随机声音,之后除非重新打开应用程序,否则它是相同的声音。

新问题现在播放随机声音,但是当我多次单击该按钮时,声音开始同时播放,并且仍然在日志中收到“start() mUri is null”消息。

更新代码

MediaPlayer player;
int soundIndex;
AssetFileDescriptor descriptor;

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

}


/**
 * gets a random index from an array of sounds
 * 
 * @return
 */
public int getRandomSoundIndex(){

    int soundIndex;
    int[] sound = SOUNDZ;

    Random random = new Random();
    soundIndex = random.nextInt(sound.length);

    return sound[soundIndex];
}

/**
 * Plays that random sound on button click
 * @param button
 */
public void playRandomSound(View button){

    //where button is physically located
    button = (Button) findViewById(R.id.button1);

    //get random sound index
    soundIndex = getRandomSoundIndex();

    //make media player
    player = MediaPlayer.create(this, soundIndex);

    //play sound
    player.start();

}

这是日志:


09-21 17:42:32.528: D/MediaPlayer(4282): start() mUri 为空

【问题讨论】:

    标签: java android android-mediaplayer filenotfoundexception


    【解决方案1】:

    这里有一些问题。

    首先,在Field 上调用toString() 将为您提供对象实例的字符串表示形式,例如"public static final int com.lena.button.R$raw.laptopkeyboard1",这不是很有用。大概,你想要getInt()

    其次,原始资源不是资产,因此您不要使用openFd()。相反,使用静态 create() 方法创建您的 MediaPlayer 实例,将您从 getInt() 获得的 int 传递到您的 Field

    第三,反射慢。请不要多次这样做。使用R.raw.class.getFields()一次,缓存结果。或者,更好的是,考虑完全不使用反射,而是使用您自己的文字 Java int[]

    static int[] SOUNDZ={R.raw.boom, R.raw.chaka, R.raw.laka};
    

    (当然是用你自己的声音资源代替)

    【讨论】:

    • 谢谢!我让它在第一次单击时使用我自己的文字 Java int[] 播放随机声音现在,当我再次单击该按钮时,它会播放相同的声音。有没有办法重置按钮点击?
    • 在日志中显示“MediaPlayer(4282): start() mUri is null”这是什么意思?
    • @LenaSanch:“有没有办法重置按钮点击?” -- create() 一个新的 MediaPlayer,AFAIK。
    猜你喜欢
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 2020-04-16
    相关资源
    最近更新 更多