2010-09-09 424 views
0

如何將聲音設置爲長按按鈕上的鈴聲?Android如何在長按按鈕上設置聲音作爲鈴聲

在它僅適用於sound4但不sound5

包com.test.soundboard的那一刻;

import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import android.view.ContextMenu.ContextMenuInfo;
import android.widget.Button;
import android.widget.Toast; import android.app.Activity; import android.content.ContentValues; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.ContextMenu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener;

公共類SoundBoardTest延伸活動實現OnClickListener {

private SoundManager mSoundManager; 

@Override 公共無效的onCreate(捆綁savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main);

mSoundManager = new SoundManager(); 
    mSoundManager.initSounds(getBaseContext()); 
    mSoundManager.addSound(1, R.raw.sound4); 
    mSoundManager.addSound(2, R.raw.sound5); 

//按鈕播放聲音時按下該按鈕

View SoundButton4 = findViewById(R.id.SoundButton4); 
    SoundButton4.setOnClickListener(this); 

    View SoundButton5 = findViewById(R.id.SoundButton5); 
    SoundButton5.setOnClickListener(this); 

}

 public void onClick(View v) { 
      switch (v.getId()) { 

      case R.id.SoundButton4: 
    mSoundManager.playSound(1); 
      break; 

     case R.id.SoundButton5: 
mSoundManager.playSound(2); 
      break; 
} 

//當使用長按鈕觸動提出來供儲存爲鈴聲上下文菜單或通知

Button SoundButton4 = (Button) findViewById(R.id.SoundButton4); 
    registerForContextMenu(SoundButton4); 

    Button SoundButton5 = (Button) findViewById(R.id.SoundButton5); 
    registerForContextMenu(SoundButton5); 
} 

// CONTEXT MEN U FOR BUTTON 1 @Override
public void onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
menu.setHeaderTitle(「Save as ...」);
menu.add(0,v.getId(),0,「Ringtone」);
menu.add(0,v.getId(),0,「Notification」);
}

@Override 
public boolean onContextItemSelected(MenuItem item) { 
    if(item.getTitle()=="Ringtone"){function1(item.getItemId());} 
    else if(item.getTitle()=="Notification"){function2(item.getItemId());} 
    else {return false;} 
return true; 
} 

public void function1(int id){ 
    if (savering(R.raw.sound4)){ 
     // Code if successful 
     Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show(); 
     } 
     else 
     { 
     // Code if unsuccessful 
     Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show(); 
     } 

} 
public void function2(int id){ 
    if (savering(R.raw.sound4)){ 
     // Code if successful 
     Toast.makeText(this, "Saved as Notification", Toast.LENGTH_SHORT).show(); 
     } 
     else 
     { 
     // Code if unsuccessful 
     Toast.makeText(this, "Failed - Check your SDCard", Toast.LENGTH_SHORT).show(); 
     }  


} 

公共布爾savering(INT ressound){
字節[]緩衝= NULL;
InputStream fIn = getBaseContext()。getResources()。openRawResource(ressound);
int size = 0;

try { 
    size = fIn.available(); 
    buffer = new byte[size]; 
    fIn.read(buffer); 
    fIn.close(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    return false; 
    } 

    String path="/sdcard/media/audio/ringtones/"; 
    String filename="soundtest4"+".ogg"; 

    boolean exists = (new File(path)).exists(); 
    if (!exists){new File(path).mkdirs();} 

    FileOutputStream save; 
    try { 
    save = new FileOutputStream(path+filename); 
    save.write(buffer); 
    save.flush(); 
    save.close(); 
    } catch (FileNotFoundException e) { 
    // TODO Auto-generated catch block 
    return false; 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    return false; 
    }  

    sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://"+path+filename))); 

    File k = new File(path, filename); 

    ContentValues values = new ContentValues(); 
    values.put(MediaStore.MediaColumns.DATA, k.getAbsolutePath()); 
    values.put(MediaStore.MediaColumns.TITLE, "HahaSound"); 
    values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg"); 
    values.put(MediaStore.Audio.Media.ARTIST, "cssounds "); 
    values.put(MediaStore.Audio.Media.IS_RINGTONE, true); 
    values.put(MediaStore.Audio.Media.IS_NOTIFICATION, false); 
    values.put(MediaStore.Audio.Media.IS_ALARM, true); 
    values.put(MediaStore.Audio.Media.IS_MUSIC, false); 

    //Insert it into the database 
    this.getContentResolver().insert(MediaStore.Audio.Media.getContentUriForPath(k.getAbsolutePath()), values); 

    return true; 
    } 

}

回答

0

這是因爲你保存到文件的設置靜態每次都保存R.raw.sound4(你寫savering(R.raw.sound4))。您需要使用您傳遞給它的變量(ressound)並使用它來決定保存哪個文件。

要做到這一點,最好的辦法可能是創造聲音的陣列(或它們的引用)像這樣(這正好在你的java文件開始與可變減速的其餘部分):

int[] soundArray = {R.raw.sound1,R.raw.sound2,R.raw.sound3}; // etc... 

哪你會添加到SoundManager類像這樣(這正好你在哪裏手動添加的聲音)

for (int i=0; i<soundArray.length; i++){ // Loops over the sound array 
    mSoundManager.addSound(i, soundArray[i]); // Adds sounds to sound manager 
    } 

然後你savering功能將使用傳遞的參數知道哪些文件進行保存。 (這正好在那裏你以前稱爲函數)

savering(soundArray[ressound]); 
+0

我真的不明白我應該在哪裏添加你提到的代碼,請你能不能用什麼SoundBoardTest.java代碼和SoundManager.java的代碼實際上是再次回覆, (有10個聲音,sound1,sound2等..) 許多Thankyou的 – lucy 2010-09-09 12:40:30

+1

我不會爲你寫程序,我已經添加了一些解釋每個項目應該在哪裏。 – stealthcopter 2010-09-09 13:40:12