Android Как установить звук в качестве мелодии звонка при долгом нажатии на кнопку - PullRequest
1 голос
/ 09 сентября 2010

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

На данный момент он работает только на 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;  
    }
}

1 Ответ

0 голосов
/ 09 сентября 2010

Это потому, что ваше сохранение в файл настроено статически для сохранения R.raw.sound4 каждый раз (вы написали сохранение (R.raw.sound4)).Вам нужно использовать переменную, которую вы ей передали (перезвонить), и использовать ее, чтобы решить, какой файл сохранить.

Лучший способ сделать это, вероятно, создать массив звуков (или ссылок на них), например, так (Это происходит в начале вашего 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(soundArray[ressound]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...