2013-09-21 53 views
0

我對Android應用程序開發相當新穎,我試圖從/ res/raw文件夾隨機播放.mp3。Android:OnClick隨機播放.mp3來自/ res /原始文件

FIXED我到目前爲止,但我遇到了FileNotFoundException。

FIXED只有在第一次點擊時播放隨機聲音,之後聲音纔會相同,除非重新打開應用程序。

NEW ISSUE現在播放隨機聲音,但是當我多次單擊按鈕聲音開始播放時,仍然在日誌中獲得「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):開始()MURI爲空

回答

0

這裏有幾個問題。

首先,在Field上調用toString()將爲您提供對象實例的字符串表示形式,例如"public static final int com.lena.button.R$raw.laptopkeyboard1",這不是很有用。據推測,你想要getInt()

其次,原始資源不是資產,因此您不使用openFd()。相反,請使用靜態的create()方法創建MediaPlayer實例,傳入int即可從getInt()傳入您的Field

三,反思慢。請不要多做一次。使用R.raw.class.getFields()一次,緩存結果。或者,更好的是,考慮不使用反射可言,而是使用自己的文字的Java int[]

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

(在你自己的聲音的資源替代,當然)

+0

謝謝!我用它自己的文字Java int [] 第一次點擊播放隨機聲音現在,當我再次單擊該按鈕時,它會播放相同的聲音。有沒有辦法重置按鈕點擊? – LenaSanch

+0

在日誌中顯示「MediaPlayer(4282):start()mUri爲空」這是什麼意思? – LenaSanch

+0

@LenaSanch:「有沒有辦法重置按鈕點擊?」 - '創建()'一個新的'MediaPlayer',AFAIK。 – CommonsWare