2010-09-09 3 views
0

Как настроить звук в качестве мелодии звонка с длинным нажатием кнопки?Android Как установить звук в качестве мелодии звонка с длинным нажатием кнопки

На данный момент он работает только на sound4 но не sound5

пакет com.test.soundboard;

импорт java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import android.view.ContextMenu.ContextMenuInfo;
импорт android.widget.Button;
import android.widget.Toast; импорт android.app.Activity; импорт android.content.ContentValues; импорт android.content.Intent; import android.net.Uri; import android.os.Bundle; импорт android.provider.MediaStore; импорт android.view.ContextMenu; импорт android.view.MenuItem; импорт 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; 
} 

// КОГДА LONG нажатых кнопок ВОСПИТАТЬ Контекстное меню SAVE AS RINGTONE ИЛИ УВЕДОМЛЕНИЕ

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

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

// КОНТЕКСТ МУЖЧИНЫ U ДЛЯ КНОПКА 1 @Override
общественного недействительными (меню ContextMenu, View v, ContextMenuInfo menuInfo) onCreateContextMenu {
super.onCreateContextMenu (меню, v, menuInfo);
menu.setHeaderTitle ("Сохранить как ...");
menu.add (0, v.getId(), 0, «Ringtone»);
menu.add (0, v.getId(), 0, «Уведомление»);
}

@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 (интермедиат 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 etcc ..) Many Thankyou's – lucy

+1

Я не собираюсь писать вашу программу для вас, я добавил некоторое объяснение, где каждый элемент должен быть. – stealthcopter

Смежные вопросы