Autore Topic: Context menu associato a diversi bottoni  (Letto 959 volte)

Offline grishnackh86

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy W
  • Play Store ID:
    Stefano+Paolessi
  • Sistema operativo:
    OpenSuse 12.3
Context menu associato a diversi bottoni
« il: 28 Ottobre 2012, 12:17:31 CET »
0
Ciao ho cercato nel forum e su google ma non sono riuscito a trovare una soluzione. Premetto che mi sto avvicinando ora alla programmazione e ancora non ho ben chiare alcune cose su java.
Espongo il problema:
In pratica ho una semplice applicazione che riproduce suoni al click dei vari bottoni, adesso sto cercando di aggiungere la possibilità di salvare i suoni come suonerie attraverso un context menu. Sono riuscito a salvare i suoni ma quello che mi risulta difficoltoso è associare i file suono ai context menu dei vari bottoni (spero che si capisca)

Vi lascio il codice e vi ringrazio anticipatamente

qui creo i miei array uno per i suoni, uno per i bottoni e uno per gli ids
Codice (Java): [Seleziona]
public class SoundActivity extends Activity {
        MediaPlayer mp = null;
       
        final int[] soundArray = {R.raw.applausi,R.raw.suono2,...};

        int[] ids = { R.id.zero, R.id.uno, R.id.due, R.id.tre, R.id.quattro, R.id.cinque, R.id.sei, R.id.sette
                 , R.id.otto, R.id.nove, R.id.dieci, R.id.undici, R.id.dodici, R.id.tredici, R.id.quattordici, R.id.quindici,
                 R.id.sedici, R.id.diciasette, R.id.diciotto, R.id.diciannove, R.id.venti, R.id.ventuno, R.id.ventidue,
                 R.id.ventitre, R.id.ventiquattro, R.id.venticinque, R.id.ventisei, R.id.ventisette, R.id.ventotto, R.id.ventinove};
        final Button[] buttons = new Button[ids.length];
   
questo è il codice per riprodurre suoni diversi per ogni pulsante
Codice (Java): [Seleziona]
        @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.scrollbar);
               
                View.OnClickListener btn = new View.OnClickListener() {
                          public void onClick(View view) {
                                  if (mp != null) {
                                        mp.reset();
                                        mp.release();
                                  }
                                  for (int j = 0; j < buttons.length; j++){
                                          if (buttons[j].getId() == view.getId()){
                                                  int index=j;
                                                  mp = MediaPlayer.create(getBaseContext(), soundArray[index]);
                                                  break;
                                          }
                                  }
                                 mp.start();
                          }
                        };
                        for (int i = 0; i < ids.length; i++) {
                            buttons[i] = (Button)findViewById(ids[i]);
                            buttons[i].setOnClickListener(btn);
                            registerForContextMenu(buttons[i]);
                        }              
                        }
   
creo il mio context menu
Codice (Java): [Seleziona]
         @Override  
    public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {  
        super.onCreateContextMenu(menu, v, menuInfo);  
     menu.setHeaderTitle("Salva come:");  
     menu.add(0, v.getId(), 0, "Suoneria");
     }

     @Override  
    public boolean onContextItemSelected(MenuItem item) {
        if(item.getTitle()=="Suoneria"){function1(item.getItemId());}
        else {return false;}
        return true;
    }
non capisco come dovrei impostare questo codice in modo che il metodo saveas si adatti dinamicamente al suono associato al bottone
Codice (Java): [Seleziona]
    public void function1(int id){
        if (saveas(R.raw.applauso)){  
        Toast.makeText(this, "Il File è stato salvato correttamente", Toast.LENGTH_LONG).show();
                // se la suoneria viene salvata appare questo messaggio  
        }  
        else  
        {  
        Toast.makeText(this, "Non è stato possibile salvare il file", Toast.LENGTH_LONG).show();
                // se la suoneria non viene salvata  
        }
    }
           
                //Salva il file nella cartella Ringtones
           public boolean saveas(int ressound){  
                         byte[] buffer=null;  
                         InputStream fIn = getBaseContext().getResources().openRawResource(ressound);  
                         int size=50;  
                         //buffer del file da copiare
                         try {  
                          size = fIn.available();  
                          buffer = new byte[size];  
                          fIn.read(buffer);  
                          fIn.close();  
                         } catch (IOException e) {  
                                 // TODO Auto-generated catch block  
                          return false;  
                         }  
                         //risalgo alla cartella RINGTONES e creo il nome/percorso file
                         File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_RINGTONES);
                         //nome del file
                         String pathsoundname = getString(ressound);
                         String soundname = pathsoundname.substring(8);
                         String filename = soundname;
                         File file = new File(path, filename);
                         //path.mkdirs();  Ensure the directory exists
                                         
                         boolean exists = (path).exists();  
                         if (!exists){path.mkdirs();}  
                         
                         //Salva il file
                         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://"+file)));  
                         
                                         
                         ContentValues values = new ContentValues();  
                         values.put(MediaStore.MediaColumns.DATA, file.getAbsolutePath());  
                         values.put(MediaStore.MediaColumns.TITLE, "suoni_app");  
                         values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mp3");  
                         values.put(MediaStore.Audio.Media.ARTIST, "cssounds ");  
                         values.put(MediaStore.Audio.Media.IS_RINGTONE, true);  
                         values.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);  
                         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(file.getAbsolutePath()), values);  
                         
                         return true;  
        }

Visto che ci sono vi faccio un'altra domanda per ricavare il nome del file ho utilizzato un metodo che ad occhio non penso sia elegantissimo
Codice (Java): [Seleziona]
String pathsoundname = getString(ressound);
                         String soundname = pathsoundname.substring(8);
                         String filename = soundname;
ci sono metodi migliori?

Offline grishnackh86

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy W
  • Play Store ID:
    Stefano+Paolessi
  • Sistema operativo:
    OpenSuse 12.3
Re:Context menu associato a diversi bottoni
« Risposta #1 il: 02 Novembre 2012, 12:07:18 CET »
0
Ok ho risolto mi è bastato replicare (nel OnCreateContextMenu) ciò che avevo fatto nel OnClick ...
Quindi ho creato una variabile a cui assegnare il suono a seconda del bottone premuto, e infine ho richiamato saveas(soundId)

Offline pilesco

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
Re:Context menu associato a diversi bottoni
« Risposta #2 il: 11 Settembre 2014, 20:06:42 CEST »
0
ciao scusami potresti postarmi la soluzione al problema dato che ho lo stesso problema??? te ne sarei grato

Offline grishnackh86

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Galaxy W
  • Play Store ID:
    Stefano+Paolessi
  • Sistema operativo:
    OpenSuse 12.3
Re:Context menu associato a diversi bottoni
« Risposta #3 il: 12 Settembre 2014, 15:02:52 CEST »
0
Questo dovrebbe essere il punto che ti interessa
Codice (Java): [Seleziona]
@Override
    public boolean onContextItemSelected(android.view.MenuItem item) {
        if(item.getTitle()=="Salva Suoneria"){function1(item.getItemId());}
        else if (item.getTitle()=="Condividi") {function2(item.getItemId());}
        else {return false;}
        return true;
         }
    public void function1(int id){
        if (saveas(soundArray[id])){
                Toast.makeText(getActivity(), "Il File è stato impostato come suoneria", Toast.LENGTH_LONG).show();
                // se la suoneria viene salvata
                }  
        else {  
                Toast.makeText(getActivity(), soundArray[id] + "Non è stato possibile salvare il file", Toast.LENGTH_LONG).show();
                // se la suoneria non viene salvata  
        }
    }      
//Salva il file nella cartella
           public boolean saveas(int ressound){ //qui inserisci il codice per salvare....
 }
 public void function2(int id){
                     //codice per la condivisione
}
       

Offline danko74

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Note
  • Sistema operativo:
    Windows 7
Re:Context menu associato a diversi bottoni
« Risposta #4 il: 06 Novembre 2014, 19:45:30 CET »
0
scusa sto provando a emulare il tuo codice ma a me mi dà errore in questo punto:


save= new FileOutputStream(path+filename) <----ma come và popolato il campo??Tu hai scritto path+filename.Io sono alle prime armi e forse manca qualcosa nella sintassi?


" The constructor FileOutputStream(int) is  undefined"



Grazie

Post unito: 07 Novembre 2014, 01:20:22 CET
Grazie ho risolto...
« Ultima modifica: 07 Novembre 2014, 01:20:22 CET da danko74, Reason: Merged DoublePost »