如何长按按钮将声音设为铃声?
目前它仅适用于sound4但不适用于sound5
package 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;
public class SoundBoardTest extends Activity implements OnClickListener{
private SoundManager mSoundManager;
@Override
public void onCreate(Bundle 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);
//BUTTONS PLAY SOUND WHEN PRESSED
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;
}
//WHEN LONG PRESSED BUTTONS BRING UP CONTEXT MENU FOR SAVE AS RINGTONE OR NOTIFICATION
Button SoundButton4 = (Button) findViewById(R.id.SoundButton4);
registerForContextMenu(SoundButton4);
Button SoundButton5 = (Button) findViewById(R.id.SoundButton5);
registerForContextMenu(SoundButton5);
}
//CONTEXT MENU 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();
}
}
public boolean savering(int ressound){
byte[] buffer=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 :(得分: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]);