2010-07-23 15 views
1

Ce que j'ai ici une activité réelle simple avec deux boutons. Lorsque vous appuyez sur chacun d'eux, il émet un son. Lorsque j'appuie sur le premier bouton et le maintenez enfoncé, un menu contextuel s'affiche, demandant à l'utilisateur s'il veut enregistrer le son en tant que sonnerie ou notification. Cela fonctionne parfaitement sur le premier bouton.Android: Problème avec l'utilisation de plusieurs menus contextuels

Le son du second bouton est activé lorsqu'il est enfoncé. Lorsque vous appuyez longuement sur le bouton, le menu contextuel s'affiche ... MAIS il enregistre le premier fichier audio en tant que sonnerie/notification PAS la seconde ...

Est-ce que quelqu'un pourrait donner un aperçu de la raison pour laquelle le deuxième menu contextuel n'est pas disponible? t fonctionne correctement?

package com.my.app; 

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 One extends Activity implements OnClickListener{ 

    private SoundManager mSoundManager; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.one); 

     mSoundManager = new SoundManager(); 
     mSoundManager.initSounds(getBaseContext()); 
     mSoundManager.addSound(1, R.raw.blah); 
     mSoundManager.addSound(2, R.raw.rofl); 


//BUTTONS PLAY SOUND WHEN PRESSED 

     View SoundButton1 = findViewById(R.id.Sound1); 
     SoundButton1.setOnClickListener(this); 

     View SoundButton2 = findViewById(R.id.Sound2); 
     SoundButton2.setOnClickListener(this); 
} 

      public void onClick(View v) { 
       switch (v.getId()) { 

       case R.id.Sound1: 
     mSoundManager.playSound(1); 
       break; 

      case R.id.Sound2: 
    mSoundManager.playSound(2); 
       break; 
    } 

//WHEN LONG PRESSED BUTTONS BRING UP CONTEXT MENU FOR SAVE AS RINGTONE OR NOTIFICATION 

     Button SoundButton11 = (Button) findViewById(R.id.Sound1); 
     registerForContextMenu(SoundButton11); 

     Button SoundButton22 = (Button) findViewById(R.id.Sound2); 
     registerForContextMenu(SoundButton22); 
    } 
//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.blah)){ 
      // 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 (savenot(R.raw.blah)){ 
      // 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(); 
      } 




//CONTEXT MENU FOR BUTTON 2 
    } 

    public void onCreateContextMenu1(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"); 
    } 

    public boolean onContextItemSelected1(MenuItem item) { 
     if(item.getTitle()=="Ringtone"){function11(item.getItemId());} 
     else if(item.getTitle()=="Notification"){function21(item.getItemId());} 
     else {return false;} 
    return true; 
    } 

    public void function11(int id){ 
     if (savering(R.raw.rofl)){ 
      // 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 function21(int id){ 
     if (savenot(R.raw.rofl)){ 
      // 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="HahaSound"+".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; 
     } 

    public boolean savenot(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/notifications/"; 
     String filename="HahaSound"+".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, "HahaSoundSound"); 
     values.put(MediaStore.MediaColumns.MIME_TYPE, "audio/ogg"); 
     values.put(MediaStore.Audio.Media.ARTIST, "cssounds "); 
     values.put(MediaStore.Audio.Media.IS_RINGTONE, false); 
     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(k.getAbsolutePath()), values); 

     return true; 
     } 
} 

MISE À JOUR DEPUIS étole PRISES

//BUTTON 1 

     View SoundButton1 = findViewById(R.id.Sound1); 
     SoundButton1.setOnClickListener(this); 

     View SoundButton2 = findViewById(R.id.Sound2); 
     SoundButton2.setOnClickListener(this); 
} 

      public void onClick(View v) { 
       switch (v.getId()) { 

       case R.id.Sound1: 
     mSoundManager.playSound(1); 
       break; 

      case R.id.Sound2: 
     mSoundManager.playSound(2); 
       break; 
       } 

       Button SoundButton11 = (Button) findViewById(R.id.Sound1); 
       registerForContextMenu(SoundButton11); 

       Button SoundButton22 = (Button) findViewById(R.id.Sound2); 
       registerForContextMenu(SoundButton22); 
      } 

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.setHeaderTitle("Save as..."); 
     menu.add(0, MENU_RINGTONE, 0, "Ringtone"); 
     menu.add(0, MENU_NOTIFICATION, 0, "Notification"); 
} 

    public boolean onContextItemSelected(MenuItem item) { 
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     long SoundButton11 = info.id; 
     switch (item.getItemId()) { 
    case MENU_RINGTONE: 
     if (savering(R.raw.schwing)){ 
      // 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(); 
      } 
      break; 
    case MENU_NOTIFICATION: 
     if (savenot(R.raw.schwing)){ 
      // 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(); 
      } 
      break; 
    } 
     return false; 


    } 

C'est ce que « ai depuis la lecture de votre dernière réponse. J'essaie juste de le faire fonctionner sur le premier bouton avant d'essayer de passer au suivant. Mais avec votre code que je reçois un avertissement sous SoundButton11 « La variable locale SoundButton11 est jamais lu » Je suis confus parce que j'ai ...

Button SoundButton11 = (Button) findViewById(R.id.Sound1); 
        registerForContextMenu(SoundButton11); 

J'ai aussi essayé Sound1 et cela ne fonctionne pas non plus. Aucune suggestion?

+0

Quel gâchis vous avez là: S Anyway ... qui est 'onCreateContextMenu1' supposé être? – Cristian

Répondre

2

2 choses sur votre code ....

1) Il n'y a pas fonction appelée onCreateContextMenu1 vous n'êtes pas primordial donc ... Alors le premier onCreateContextMenu est appelé.

2)

menu.add(0, v.getId(), 0, "Ringtone"); 
     menu.add(0, v.getId(), 0, "Notification"); 

Vous assignant à la fois élément de menu (contexte) le même id ... ils ont idéalement être différents. Sinon, comment les identifieriez-vous? Je suis surpris qu'il fonctionne réellement pour vous, en utilisant des titres.

voici ce que vous devez faire ...

final int MENU_RINGTONE = 0; 
final int MENU_NOTIFICATION = 1; 

public void onCreateContextMenu(ContextMenu menu, View v, 
      ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.add(0, MENU_RINGTONE, 0, "Ringtone"); 
     menu.add(0, MENU_NOTIFICATION, 0, "Notification"); 
} 

public boolean onContextItemSelected(MenuItem item) { 
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     long buttonId = info.id; 
     switch (item.getItemId()) { 
    case MENU_RINGTONE: 
      function1(buttonId); 
      break; 
    case MENU_NOTIFICATION: 
      function2(buttonId); 
      break; 
    } 
} 

vous n'avez pas besoin function12 supplémentaire, funtion11, function21, function22 ... vous pouvez les généraliser ... mais je laisse cela jusqu'à vous .

+0

C'est aussi pourquoi @Override est si utile - il vous dit clairement que vous ne surchargez pas quelque chose même si vous pensez que vous l'êtes. – EboMike

+0

le v.getId() a été passé afin que le bouton qui a été pressé peut être identifié. La méthode que vous fournissez est beaucoup plus propre :) – stealthcopter

+0

Merci beaucoup d'avoir jeté un coup d'oeil à cela pour moi, désolé je suis juste en train de contourner pour essayer de résoudre ce problème. Quoi qu'il en soit, j'essayais le code que vous avez recommandé mais j'ai rencontré un petit problème. Une idée de ce que j'ai mal fait? – brybam

0

Vérifiez les commentaires, je quittais ci-dessous ...

public boolean onContextItemSelected(MenuItem item) { 
     AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
     long SoundButton11 = info.id; //THIS IS THE UNUSED VARIABLE! 
     switch (item.getItemId()) { 
    case MENU_RINGTONE: 
     if (savering(R.raw.schwing)){ //this should change based on what button was pressed... 
      // 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(); 
      } 
      break; 
    case MENU_NOTIFICATION: 
     if (savenot(R.raw.schwing)){ //this should change based on what button was pressed... 
      // 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(); 
      } 
      break; 
    } 
     return false; 

    } 

Je suppose que ceci est quelque chose sur les lignes que vous voulez ... avant vous faites cela assurez-vous SoundButton1(& 2) sont des variables d'instance afin qu'ils puissent être accessible dans toutes les fonctions de votre activité.

//UNTESTED CODE! 
    public boolean onContextItemSelected(MenuItem item) { 
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
      long SoundButton11 = info.id; //THIS IS THE UNUSED VARIABLE! 
      int resId = (SoundButton11 == SoundButton1.getId())? R.raw.schwing : R.raw.rolf; 
      switch (item.getItemId()) { 
    case MENU_RINGTONE: 
       if (savering(resId)){ //use resId instead... 
        // Code if successful 
        Toast.makeText(this, "Saved as Ringtone", Toast.LENGTH_SHORT).show(); 
        } 
        else 
.....