Autore Topic: BEEP  (Letto 2511 volte)

Offline antongiove

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    STAR B63M
  • Sistema operativo:
    win
BEEP
« il: 01 Dicembre 2011, 18:43:16 CET »
0
Sto comiciando solo ora a cimentarmi con android e ho una domanda banale alla quale non ho trovato finora risposta.
Esiste la possibilita di far fare dei BEEP al telefono con un semplice comando senza dover usare un mp3 esterno?
Se si, come si deve fare? Sto cercando di fare un giochino che da una stringa di caratteri "... --- ..." (codice morse) esegua i relativi BEEP.
Grazie

Offline Download

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
Re:BEEP
« Risposta #1 il: 02 Dicembre 2011, 17:02:33 CET »
0
A parte il fatto che il titolo del Thread mi pare poco significativo. Sorvolando, di per se non mi risulta che i cellulari abbiano uno speaker (il cicalino del pc per intenderci) che ti permetta di far eseguire dei Bip. Potresti però vedere se tra i suoni di sistema di default c'è un qualche file audio contenente il suono che desideri. Ma credo sia più veloce e sicuro (per un esecuzione certa del Bip da parte dell'app) aggiungere all'applicazione un file con il Bip che vuoi te.

Qui trovi la documentazione ufficiale android per l'esecuzione del suono da Uri locale o da Url:
Media Playback | Android Developers

Offline antongiove

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    STAR B63M
  • Sistema operativo:
    win
Re:BEEP
« Risposta #2 il: 02 Dicembre 2011, 17:44:10 CET »
0
Scusa per il nome ma non mi è venuto in mente niente di meglio.
Ho provato ad usare due file mp3, uno con beep lungo (linea) e uno con beep corto (punto) ma quando eseguo il comando dentro il loop di analisi della stringa per far suonare uno o l'altro, il risultato è scorretto perchè i suoni si sovrappongono o almeno credo.

                     for (int j = 0; j < Morse[indice].length(); j++) {
                        if (Morse[indice].charAt(j) == '.') {
                           punto.start();
                        }
                        if (Morse[indice].charAt(j) == '-') {
                           linea.start();
                        }
Ho provato anche a mettere dei ritardi tra uno e l'altro ma è comunque un disastro!!

Offline Download

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
Re:BEEP
« Risposta #3 il: 02 Dicembre 2011, 22:51:15 CET »
0
Usando due thread é normale si sobrappongano a meno che non li sincronizzi. Ti consiglio invece di creare un solo thread, che effettua un controllo su una stringa che gli passi, e a seconda se linea o punto esegue un suono differente con relativo delay. Ora sono dal cellulare, appena ho a disposizione un attimo di tempo al pc ti scrivo un po codice.

Offline antongiove

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    STAR B63M
  • Sistema operativo:
    win
Re:BEEP
« Risposta #4 il: 05 Dicembre 2011, 08:36:42 CET »
0
grazie mille, aspetto con ansia.

Offline Download

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
Re:BEEP
« Risposta #5 il: 05 Dicembre 2011, 09:49:04 CET »
0
Riesci a postami la tua classe? Così cerco di farti del codice su misura.

Offline antongiove

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    STAR B63M
  • Sistema operativo:
    win
Re:BEEP
« Risposta #6 il: 05 Dicembre 2011, 12:04:59 CET »
0
Così va bene?
Il programma consiste nello scorrere immagini che hanno la lettera dell'alfabeto e il relativo codice morse. Quando clicco vorrei sentire il morse corrispondente alla lettera.
      
     
Codice (Java): [Seleziona]
         
                 private Integer[] ImgidSopra = {
                 R.drawable.b_a,R.drawable.b_b,R.drawable.b_c,R.drawable.b_d, R.drawable.b_e, R.drawable.b_f, R.drawable.b_g, R.drawable.b_h, R.drawable.b_i, R.drawable.b_j, R.drawable.b_k, R.drawable.b_l, R.drawable.b_m, R.drawable.b_n, R.drawable.b_o, R.drawable.b_p, R.drawable.b_q, R.drawable.b_r, R.drawable.b_s, R.drawable.b_t, R.drawable.b_u, R.drawable.b_v, R.drawable.b_w, R.drawable.b_x, R.drawable.b_y, R.drawable.b_z,
                 R.drawable.b_0, R.drawable.b_1, R.drawable.b_2, R.drawable.b_3, R.drawable.b_4, R.drawable.b_5, R.drawable.b_6, R.drawable.b_7, R.drawable.b_8, R.drawable.b_9
                 };

                 private String[] Morse = {
                 ".-" , "-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",
                 "-----",".----","..---","...--","....-",".....","-....","--...","---..","----."
                 };

                MediaPlayer punto;
                MediaPlayer linea;               

                 @Override
                 public void onCreate(Bundle savedInstanceState) {
                         super.onCreate(savedInstanceState);
                         setContentView(R.layout.main);
                         
                         numFlag=ImgidSopra.length;

                         punto=MediaPlayer.create(this, R.raw.punto);
                         linea=MediaPlayer.create(this, R.raw.linea);

                        ......
       

                 imgView.setOnClickListener(new OnClickListener() {
                                public void onClick(View arg0) {
                                        // TODO Auto-generated method stub
                                        if (sw == 0) {
                                                indice++;
                                                if (indice >= numFlag) { indice=0; }
                                                imgView.setImageResource(ImgidSopra[indice]);
                                        } else {
                                                imgView.setImageResource(ImgidSopra[indice]);
                                                sw=0;
                                                // ESEGUE codice MORSE se menu morse attivo
                                                if ((swAudio == true){

                                                        for (int j = 0; j < Morse[indice].length(); j++) {
                                                                if (Morse[indice].charAt(j) == '.') {
                                                                                punto.start(); //suona
                                                                                for (int z = 0; z < 10000000; z++) {}  //ritardo suono
                                                                }
                                                                if (Morse[indice].charAt(j) == '-') {
                                                                                linea.start(); //suona                                                                         
                                                                                for (int z = 0; z < 10000000; z++) {}  //ritardo suono                                                                         
                                                                }
                                                        }
                                                }              
                                        }      

                                }
                               
                         })
« Ultima modifica: 05 Dicembre 2011, 14:30:37 CET da Ricky`, Reason: tasto code! »

Offline Download

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
Re:BEEP
« Risposta #7 il: 05 Dicembre 2011, 16:41:27 CET »
+1
Eccoti una classe esempio, ho commentato un pò, se hai bisogno di chiarimenti chiedi pure, e se ti va clicca su "Thanks" :)
Come puoi vedere ti ho dato la possibilità di passare stringe composte, o di singole porzioni di morse, le puoi concatenare con il ";"
o con il delimitatore che preferisci, basta che modifichi il codice.

Codice: [Seleziona]
import java.util.StringTokenizer;

import android.media.MediaPlayer;



public class MorseAudioThread extends Thread{

        MediaPlayer punto;
    MediaPlayer linea;
        public boolean _run;
        String codMorse;

        public MorseAudioThread(MediaPlayer _punto, MediaPlayer _linea){
                punto = _punto;
                linea = _linea;
                codMorse = ".-;--.";
                _run = false;
        }

        public void setCodeMorse(String _codMorse){
                codMorse = _codMorse;
        }

        public void setRunning(boolean run){
                _run = run;
        }
       
        public void run(){
                while(_run){//la variabile _run ti permette di decidere se il thread può o meno eseguire il run
                        //anche istanziando un oggetto al di fuori, tramite il metodo setRunning(boolean run);
                        if(!codMorse.equals("")){//controllo che la stringa non sia vuota
                                try {//definisco un try catch per utilizzare lo sleep();
                                        StringTokenizer st;//utilizzo uno stringtokenizer perchè la stringa potrebbe contenere più "lettere"
                                        st = new StringTokenizer(codMorse,";");//uso il punto e virgola come delimitatore
                                        while(st.hasMoreTokens()){//mi permette di scorrere i token finchè la stringa ne contiene
                                                String tok = st.nextToken();
                                                for(int i = 0;i<tok.length();i++){//per ogni token scorro carattere per carattere
                                                        if(tok.charAt(i) == '.'){
                                                                punto.start();
                                                        }
                                                        else if(tok.charAt(i) == '-'){
                                                                linea.start();
                                                        }
                                                        sleep(500);//fermo il thread per il tempo essenziale in modo tale da non accavallare i suoni
                                                }
                                                sleep(1000);//tra una lettera e l'altra metto una pausa più lunga
                                                //sono ingorante in fatto di morse, ma presumo che per una intelleggibilità si necessiti di una pausa tra un simbolo e l'altro
                                        }
                                } catch (Exception ex){
                                        ex.printStackTrace();
                                }
                        }
                }
        }
}

Offline antongiove

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    STAR B63M
  • Sistema operativo:
    win
Re:BEEP
« Risposta #8 il: 05 Dicembre 2011, 17:01:50 CET »
0
Grazie per la risposta (non so come fare per cliccare thanks:) )
E' un po complesso per le mie conoscenze di java ma adesso mi metto a cercare di capire un po e a fare qualche prova.
ancora grazie
ciao


Offline Download

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
Re:BEEP
« Risposta #9 il: 05 Dicembre 2011, 17:05:36 CET »
0
Il thanks è nell'intestazione della mia risposta, a destra di "« Risposta #7 il: Oggi alle 16:41 »" così metti in evidenza il post nel caso qualcuno abbia bisogno  :-)  Se hai bisogno perché non capisci qualche porzione di codice scrivi qua o in pm.
Ho preferito farti una classe un po' più solida ma funzionale, così si poteva adattare a una qualsiasi tua esigenza ^^

Offline antongiove

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    STAR B63M
  • Sistema operativo:
    win
Re:BEEP
« Risposta #10 il: 07 Dicembre 2011, 15:46:24 CET »
0
Un po in ritardo ma rieccomi. Scusa l'ignoaranza ma cosa vuol dire "scrivi in pm" ?
Ammetto l'ignoranza abissale ma capisco davvero poco di quanto hai scritto. Io sono un vecchio programmatore abituato a programmare in Cobol e Basic e sicuramente mi mancano molti riferimenti per capire questo nuovo linguaggio.
Ho provato ad importare il tuo codice in eclipse ma mi da errori e non ne vengo fuori. Ho provato ad usare il comando sleep che mi sembrava adatto al mio scopo ma, anche in questo caso, ho errori che non so risolvere. Insomma un disastro.
Nel frattempo però sono riuscito a getire la "vibrazione" al posto del suono e a trovare un ritardo che sul mio telefono riesce a far sentire il suono abbastanza correttamente (ma so già che su altri telefoni non funzionerà). Provo a postarti tutto il codice nella speranza che tu possa darmi qualche dritta ulteriore.
Ho anche un'altro problema che non so risolvere. Come si fa a gestire lo scorrimento delle bandiere avanti (destra) o indietro (sinistra). Io ho usato il click per andare verso destra ma non so come gestire il ritorno verso sinistra (infatti il codice che ho scritto l'ho commentato).
Poi mi piacerebbe modificare la sequenza delle bandiere contenuta nella gallery ma dopo aver cambiato il contenuto dell'array che contiene le bandiere, non so come fare a rivisualizzare la gallery modificata.
..... :)
Ho comprato un po di libri e sto cercando pian piano di venirne fuori, ma ti sarò grato dell'aiuto che potrai darmi.
Grazie

package sailingcards.ag1.antonio;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.os.Vibrator;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.media.MediaPlayer;
import sailingcards.ag1.hpa.R;

    public class SailingCardsActivity extends Activity {
   
       private int sw=0;
       private int selez=0;
       private Gallery gallery;
       private ImageView imgView;
       private Integer[] ImgidSopra = {
       R.drawable.b_a,R.drawable.b_b,R.drawable.b_c,R.drawable.b_d, R.drawable.b_e, R.drawable.b_f, R.drawable.b_g, R.drawable.b_h, R.drawable.b_i, R.drawable.b_j, R.drawable.b_k, R.drawable.b_l, R.drawable.b_m, R.drawable.b_n, R.drawable.b_o, R.drawable.b_p, R.drawable.b_q, R.drawable.b_r, R.drawable.b_s, R.drawable.b_t, R.drawable.b_u, R.drawable.b_v, R.drawable.b_w, R.drawable.b_x, R.drawable.b_y, R.drawable.b_z,
       R.drawable.b_ap,R.drawable.b_1r,R.drawable.b_2r,R.drawable.b_3r,R.drawable.b_0, R.drawable.b_1, R.drawable.b_2, R.drawable.b_3, R.drawable.b_4, R.drawable.b_5, R.drawable.b_6, R.drawable.b_7, R.drawable.b_8, R.drawable.b_9
       };
       private Integer[] ImgidSotto = {
       R.drawable.v_a,R.drawable.v_b,R.drawable.v_c,R.drawable.v_d, R.drawable.v_e, R.drawable.v_f, R.drawable.v_g, R.drawable.v_h, R.drawable.v_i, R.drawable.v_j, R.drawable.v_k, R.drawable.v_l, R.drawable.v_m, R.drawable.v_n, R.drawable.v_o, R.drawable.v_p, R.drawable.v_q, R.drawable.v_r, R.drawable.v_s, R.drawable.v_t, R.drawable.v_u, R.drawable.v_v, R.drawable.v_w, R.drawable.v_x, R.drawable.v_y, R.drawable.v_z,
       R.drawable.v_ap,R.drawable.v_1r,R.drawable.v_2r,R.drawable.v_3r,R.drawable.v_0, R.drawable.v_1, R.drawable.v_2, R.drawable.v_3, R.drawable.v_4, R.drawable.v_5, R.drawable.v_6, R.drawable.v_7, R.drawable.v_8, R.drawable.v_9
       };
       private String[] Morse = {
       ".-" , "-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..",
       "","","","","-----",".----","..---","...--","....-",".....","-....","--...","---..","----."
       };
          private static final long SPEED_BASE = 100;
        static final long DOT = SPEED_BASE;
        static final long DASH = SPEED_BASE * 3;
        static final long GAP = SPEED_BASE * 2;
       
        MediaPlayer punto;
             MediaPlayer linea;      
         
       private int indice=0, numFlag=0;
       private boolean swAudio=false;
       private boolean swVibra=false;      
      
       @Override
       public void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.main);
         
          numFlag=ImgidSopra.length;
            
               final Vibrator vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE);   
          punto=MediaPlayer.create(this, R.raw.punto);
          linea=MediaPlayer.create(this, R.raw.linea);


          imgView = (ImageView)findViewById(R.id.ImageView01);
          imgView.setImageResource(ImgidSopra[0]);
         
          gallery = (Gallery) findViewById(R.id.gallery);
          gallery.setAdapter(new AddImgAdp(this));

          gallery.setOnItemClickListener(new OnItemClickListener() {
             public void onItemClick(AdapterView parent, View v, int position, long id) {
                imgView.setImageResource(ImgidSopra[position]);
                indice=position;
                sw=0;
             }
            
          });

          //scorre verso sx
          imgView.setOnClickListener(new OnClickListener() {
            public void onClick(View arg0) {
               // TODO Auto-generated method stub
               if (sw == 0) {
                  indice++;
                  if (indice >= numFlag) { indice=0; }
                  imgView.setImageResource(ImgidSopra[indice]);
               } else {
                  imgView.setImageResource(ImgidSopra[indice]);
                  sw=0;
                  // ESEGUE codice MORSE se menu morse attivo
                  if ((swAudio == true) || (swVibra == true)) {

                      long[] pattern = new long[(Morse[indice].length()*2)+1];  // il numero di caratteri *2 + 1 è la lunghezza della matrice
                        pattern[0]=0;
                        int k=1;

                     for (int j = 0; j < Morse[indice].length(); j++) {
                        if (Morse[indice].charAt(j) == '.') {
                           pattern[k]= DOT;
                           k++;
                           pattern[k]= GAP;
                           k++;

                           if (swAudio == true) {                           
                              punto.start(); //suona
                              for (int z = 0; z < 15000000; z++) {}  //ritardo suono
                           }
                        }
                        if (Morse[indice].charAt(j) == '-') {
                           pattern[k]= DASH;
                           k++;
                           pattern[k]= GAP;
                           k++;
                           if (swAudio == true) {
                              linea.start(); //suona                              
                              for (int z = 0; z < 25000000; z++) {}  //ritardo suono
                           }
                        }
                     }
                           
                        if (swVibra == true) {
                        vibrator.vibrate(pattern , -1);
                     }
                  }      
               }   

            }
            
          });
         
          // apre la spiega ovvero il dietro dell'immagine
          imgView.setOnLongClickListener(new OnLongClickListener() {
               public boolean onLongClick(View arg0) {
                  if (sw==0) {
                     imgView.setImageResource(ImgidSotto[indice]);
                     sw=1;
                  }
                  return true;
               }
             });

//          //scorre verso dx
//          imgView.setOnLongClickListener(new OnLongClickListener() {
//               public boolean onLongClick(View arg0) {
//                  // TODO Auto-generated method stub
//                  if (sw == 0) {
//                     indice--;
//                     if (indice < 0) { indice=numFlag-1; }
//                     imgView.setImageResource(ImgidSopra[indice]);
//                  }
//                  return true;
//               }
//             });
//         

       }

       public class AddImgAdp extends BaseAdapter {
          int GalItemBg;
          private Context cont;

          public AddImgAdp(Context c) {
             cont = c;
             TypedArray typArray = obtainStyledAttributes(R.styleable.GalleryTheme);
             GalItemBg = typArray.getResourceId(R.styleable.GalleryTheme_android_galleryItemBackground, 0);
             typArray.recycle();
          }

          public int getCount() {
             return ImgidSopra.length;
             }

          public Object getItem(int position) {
             return position;
             }

          public long getItemId(int position) {
             return position;
             }

          public View getView(int position, View convertView, ViewGroup parent) {
             ImageView imgView = new ImageView(cont);
      
             imgView.setImageResource(ImgidSopra[position]);
             imgView.setLayoutParams(new Gallery.LayoutParams(120, 105));  //(80, 70));
             imgView.setScaleType(ImageView.ScaleType.FIT_XY);
             imgView.setBackgroundResource(GalItemBg);
      
             return imgView;
             }
      

       }

Offline Download

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
Re:BEEP
« Risposta #11 il: 07 Dicembre 2011, 16:11:18 CET »
0
Allora, per PM si intende Private Message :) comunque, tornando in topic, non vedo nessuna parte di codice in cui tu abbia implementato la classe che ti ho postato. Appena ho un attimo di tempo mi leggo bene il codice.
Mi puoi dire quali sono questi errori?

Piccola spiegazione:

Codice (Java): [Seleziona]
for (int z = 0; z < 25000000; z++)
questa porzione di per se non fa nulla, ne tanto meno crea ritardo.
Suppongo che tu abbia ragionato in un modo simile all'Assembly, dove con N esecuzioni di NOP potevi creare un ritardo pari al tempo in ms impiegato dal Microprocessore per l'esecuzione di una NOP moltiplicato per il numero di richiami.

Comunque sia, ti consiglio di leggerti un qualche tutorial sulla programmazione ad oggetti in Java :)

Offline antongiove

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    STAR B63M
  • Sistema operativo:
    win
Re:BEEP
« Risposta #12 il: 09 Dicembre 2011, 20:25:26 CET »
0

Sarà ma con quel ciclo il morse si sente altrimenti no.
In questi giorni ho finito una prima versione del programma e mi piacerebbe avere un tuo parere. E' una versione dimostrativa che non ti lascia fare più di una quindicina di click e parole più lunghe di 5 caratteri ma che sono sufficienti per verificare il funzionamento.
Questo è il link da cui scaricarla http://dl.dropbox.com/u/45880914/SailingCardsDemo.apk

Aspetto un tuo commento.

Offline antongiove

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    STAR B63M
  • Sistema operativo:
    win
Re:BEEP
« Risposta #13 il: 13 Dicembre 2011, 10:17:12 CET »
0
In questi giorni ho studiato e ho risolto i vari problemi che ti avevo sottoposto creando delle classi come da tue indicazioni. Ho postato al solito indirizzo la versione corretta (o almeno spero). ciao

Offline Download

  • Nuovo arrivato
  • *
  • Post: 15
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Ace
Re:BEEP
« Risposta #14 il: 13 Dicembre 2011, 10:21:01 CET »
0
Ottimo :) darò un occhiata, purtroppo non ho avuto tempo causa lavoro. Appena riuscirò darò uno sguardo al tuo lavoro!