开发者

Android How to set a sound as ringtone with long press on button

How do i set the sound as ringtone with long press on the button?

At the moment it only works on sound4 but not 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());}  
开发者_StackOverflow中文版        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;  
    }
}


This is because your saving to file is setup statically to save R.raw.sound4 each time (you have written savering(R.raw.sound4) ). You need use the variable you have passed to it (ressound) and use it to decide which file to save.

The best way to do this is probably to create an array of sounds (or references to them) like so (This goes at start of your java file with rest of variable decelerations):

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

Which you'd add to the soundManager like so (This goes where you were adding the sounds manually)

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

Then your savering function would use the passed argument to know which file to save. (This goes where you previously called the function)

  savering(soundArray[ressound]);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜