2017-06-10 5 views
0

dans mon application de style texte à la parole Je peux définir la vitesse et la hauteur de la voix, ainsi que 2 variables pour les paramètres de hauteur d'échographie. Si je règle la vitesse et la hauteur et quitte le menu des paramètres tout va bien, Le problème est que si j'appuie sur le bouton de finition et l'analyseur de fréquence s'exécute et définit les variables ultrasonores les variables sont enregistrées dans l'éditeur de préférence au mauvais endroit, provoquant la vitesse et la hauteur à régler sur les valeurs d'échographie, j'ai essayé pendant 2 jours pour le réparer mais rien ne fonctionne, ci-dessous est le code pertinent, si vous avez besoin de plus, demandez, quelqu'un peut voir ce que je fais mal?éditeur de préférences partagées mélanger les valeurs

EDIT: voici un apk montrant le problème, allez dans le menu paramètres (de la barre d'outils en haut à droite) régler la vitesse et la hauteur, appuyez sur terminer, fermer l'application, ouvrez les paramètres et vous verrez les valeurs ridicules que la vitesse et la hauteur Canine Remote apk

pertinentes des variables initialisées au début de la classe:

public SharedPreferences appPreferences; 
boolean settingUp=false; 
int result = 0; 
int remote = 0; 
int settingLanguage=0; 
private float progress = (float) 1.0; 
private float progress2 = (float) 1.0; 
private static final String LSTYLE = "usa";//language 
private static final String MYPITCH = "1.0";//normal use voice pitch 
private static final String MYSPEED = "1.0";//normal use voice speed 
private static final String ULTRADOG = "1.0";//22000 +/- user pitch khz 
private static final String ULTRACAT = "1.0";//48000 +/- user pitch khz 
private static final String HUMANDOGCAT = "0";//human=0, dog=1, cat=2 
private static final String REMOTE = "0";//speak through device=0, speak 
//through remote bluetooth speaker=1 
private TextView edit; 
private TextView edit2; 
private Button edit3; 
private Button edit4; 
private Button edit5; 
private Button edit6; 
private TextView edit7; 
private ImageButton edit8; 
private Button edit9; 
private CheckBox ckultra; 
private CheckBox cklocal; 
private CheckBox ckultra2; 
private SeekBar cpitch; 
private SeekBar cspeed; 
AudioRecord mAudioRecord; 
int freq = 11025; 
int Nb; 
int N; 
int running=0; 
double FreqMin = 0; 
double FreqMax = 2300; 
int muestras = 1000; 
double PI2n = 2 * Math.PI/muestras; 
double FreqMuestras=freq/muestras; 
int indMin = (int) (FreqMin/FreqMuestras); 
int indMax = (int) (FreqMax/FreqMuestras); 
double newFrequency = 170; 
double freakMin=170; 
double freakMax=170; 
double mean=170; 


    @Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_canine_start); 
appPreferences = PreferenceManager.getDefaultSharedPreferences(this); 

Ce bouton règle la hauteur dans l'éditeur de préférences

edit3.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
    Globals g = (Globals) getApplication(); 
    SharedPreferences.Editor editor = appPreferences.edit(); 
    float pitch = g.getData2(); 
    if (pitch < 0.1) pitch = (float) 0.1; 
    editor.putFloat(MYPITCH, pitch); 
    editor.commit(); 
    tts.setPitch(pitch); 
} 
}); 

Ce bouton règle la vitesse dans l'éditeur de préférences, j'ai aussi inclus les barres de défilement et vérifier les codes boîtes ici si vous avez besoin de les voir

edit4.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
    Globals g = (Globals) getApplication(); 
    SharedPreferences.Editor editor2 = appPreferences.edit(); 
    float speed=g.getData3(); 
    if (speed < 0.1) speed = (float) 0.1; 
    editor2.putFloat(MYSPEED, speed); 
    editor2.commit(); 
    tts.setSpeechRate(speed); 
} 
}); 
//slider bars to get pitch and speed 
    cpitch.setProgress(1); 
edit.setText("Adjust voice Pitch: " + cpitch.getProgress()); 
cpitch.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 
Globals g = (Globals) getApplication(); 
@Override 
public void onProgressChanged(SeekBar cpitch, int progresValue, boolean fromUser) { 
    progress = (float) (progresValue * 0.1); 
    edit.setText("Adjust voice pitch: " + progress); 
} 
@Override 
public void onStartTrackingTouch(SeekBar cpitch) { 
} 
@Override 
public void onStopTrackingTouch(SeekBar cpitch) { 
    edit.setText("Adjust voice pitch: " + progress); 
    g.setData2(progress); 
    } 
}); 
cspeed.setProgress(1); 
edit2.setText("Adjust voice speed: " + cspeed.getProgress()); 
cspeed.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 
Globals g = (Globals) getApplication(); 
@Override 
public void onProgressChanged(SeekBar cspeed, int progresValue2, boolean fromUser2) { 
    progress2 = (float) (progresValue2 * 0.1); 
    edit2.setText("Adjust voice speed: " + progress2); 
} 
@Override 
public void onStartTrackingTouch(SeekBar cspeed) { 
} 
@Override 
public void onStopTrackingTouch(SeekBar cspeed) { 
    edit2.setText("Adjust voice speed: " + progress2); 
    g.setData3(progress2); 
} 
}); 
} 

//check boxes 
class clicker implements CheckBox.OnCheckedChangeListener { 
public void onCheckedChanged(CompoundButton buttonView, 
          boolean isChecked) { 
    SharedPreferences.Editor editor5 = appPreferences.edit(); 
    if (isChecked) { 
     if (buttonView == ckultra) { 
      editor5.putInt(HUMANDOGCAT, 1).commit(); 
      ckultra2.setChecked(false); 
     } 
     if (buttonView == ckultra2) { 
      editor5.putInt(HUMANDOGCAT, 2).commit(); 
      ckultra.setChecked(false); 
     } 
     if (buttonView == cklocal) { 
      editor5.putInt(REMOTE, 1).commit(); 
     } 
    } 
    if (!isChecked) { 
     if (buttonView == ckultra) { 
      editor5.putInt(HUMANDOGCAT, 0).commit(); 
     } 
     if (buttonView == ckultra2) { 
      editor5.putInt(HUMANDOGCAT, 0).commit(); 
     } 
     if (buttonView == cklocal) { 
      editor5.putInt(REMOTE, 0).commit(); 
     } 
    } 
} 
} 

Ce bouton est le début du code provoquant l'erreur

edit6.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
    edit7.setVisibility(View.VISIBLE); 
    edit8.setVisibility(View.VISIBLE); 
    edit9.setVisibility(View.VISIBLE); 
    edit.setVisibility(View.GONE); 
    edit2.setVisibility(View.GONE); 
    edit3.setVisibility(View.GONE); 
    edit4.setVisibility(View.GONE); 
    edit5.setVisibility(View.GONE); 
    edit6.setVisibility(View.GONE); 
    cpitch.setVisibility(View.GONE); 
    cspeed.setVisibility(View.GONE); 
    ckultra.setVisibility(View.GONE); 
    ckultra2.setVisibility(View.GONE); 
    cklocal.setVisibility(View.GONE); 
    speakIT("Completed."); 
    Spectrometer_Start(); 
} 
}); 
//analyze pitch to set ultrasound variables 
public void Spectrometer_Start() { 
try { 
    Nb = AudioRecord.getMinBufferSize(freq, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT) * 4; 
    N = Nb * Byte.SIZE/Short.SIZE; 
    mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, freq, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_16BIT, Nb); 
    mAudioRecord.startRecording(); 
    running=1; 
    analizer(); 
    } catch (IllegalArgumentException i) { 
} 
} 

Cette méthode enregistre les paramètres d'ultrasons au mauvais endroit dans l'éditeur de préférences

public void analizer() { 
int a=10; 
while(tts.isSpeaking()) 
{ 
    a-=1; 
    if(a==0) 
    { 
     short[] data= new short[muestras]; 
     try { 
      mAudioRecord.read(data, 0, muestras-1); 
      Dft(data); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     a=10; 
    } 
} 
mAudioRecord.stop(); 
mAudioRecord.release(); 
Globals g = (Globals) getApplication(); 
running=0; 
mean=((freakMax-freakMin)*0.5)+freakMin; 
float calcDog = (float) (22000/mean); 
float calcCat = (float) (48000/mean); 
g.setData4(calcDog); 
g.setData5(calcCat); 
SharedPreferences.Editor editor7 = appPreferences.edit(); 
editor7.putFloat(ULTRADOG, calcDog); 
editor7.putFloat(ULTRACAT, calcCat); 
editor7.commit(); 
} 

public void Dft(short[] inreal) { 
for (int k = indMin; k < indMax; k++) 
{ 
    float sumreal = 0; 
    float sumimag = 0; 
    float PI2kn= (float) (PI2n * k); 
    for (int t = 0; t < muestras; t++) { 
     double angle = t*PI2kn; 
     sumreal += inreal[t] * Math.cos(angle); 
     sumimag += inreal[t] * Math.sin(angle); 
    } 
     newFrequency = (Math.sqrt(sumreal * sumreal + sumimag * sumimag)); 
     if (newFrequency < freakMin && newFrequency >= 85) { 
      freakMin = newFrequency; 
     } 
     if (newFrequency > freakMax && newFrequency <= 255) { 
      freakMax = newFrequency; 
     } 
    } 
} 

Ce bouton commence le discours entrée et reçoit les valeurs erronées de l'éditeur de préférences

edit9.setOnClickListener(new View.OnClickListener() { 
@Override 
public void onClick(View v) { 
    String sendComands= edit7.getText().toString(); 
    if (!sendComands.equals("") && settingLanguage == 0){ 
     float NPITCH = appPreferences.getFloat(MYPITCH, (float) 1.0); 
     float NSPEED = appPreferences.getFloat(MYSPEED, (float) 1.0); 
     float UDOG = appPreferences.getFloat(ULTRADOG, (float) 1.0); 
     float UCAT = appPreferences.getFloat(ULTRACAT, (float) 1.0); 
     int HDC = appPreferences.getInt(HUMANDOGCAT, 0); 
     switch (HDC) { 
      case 0: 
       tts.setPitch(NPITCH); 
       break; 
      case 1: 
       tts.setPitch(UDOG); 
       break; 
      case 2: 
       tts.setPitch(UCAT); 
       break; 
     } 
     tts.setSpeechRate(NSPEED); 
     speakIT(sendComands); 
     edit7.setHint("Enter text to send"); 
     settingUp=false; 
    } 
    if (settingLanguage == 1) { 
     countryC(sendComands); 
     settingLanguage=0; 
     edit7.setHint("Enter text to send"); 
     edit9.setText("Send"); 
     edit7.setVisibility(View.GONE); 
     edit9.setVisibility(View.GONE); 
    } 
} 
}); 

menu Mes paramètres dans la barre d'outils avec un commentaire afin que vous sachiez quels objets faire ce que

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
// Inflate the menu; this adds items to the action bar if it is present. 
getMenuInflater().inflate(R.menu.canine_start, menu); 
return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
Globals g = (Globals) getApplication(); 
int id = item.getItemId(); 
if (id == R.id.action_settings) { 
    edit.setVisibility(View.VISIBLE);//pitch slider text 
    edit2.setVisibility(View.VISIBLE);//speed slider text 
    edit3.setVisibility(View.VISIBLE);//button - set pitch 
    edit4.setVisibility(View.VISIBLE);//button - set speed 
    edit5.setVisibility(View.VISIBLE);//button - test speak 
    edit6.setVisibility(View.VISIBLE);//button - finished with settings 
    edit7.setVisibility(View.GONE);//edit text - text to speech 
    edit8.setVisibility(View.GONE);//image button - speech recognition start 
    edit9.setVisibility(View.GONE);//button - speak edit7 text 
    cpitch.setVisibility(View.VISIBLE);//slider - adjust voice pitch 
    cspeed.setVisibility(View.VISIBLE);//slider - adjust voice speed 
    ckultra.setVisibility(View.VISIBLE);//checkbox - ultrasound dog on/off 
    ckultra2.setVisibility(View.VISIBLE);//checkbox - ultrasound cat on/off 
    cklocal.setVisibility(View.VISIBLE);//checkbox - send to bluetooth/local device 
    settingUp=true; 
    return true; 
} 

Répondre

2

Vous utilisez des clés non valides pour stocker vos valeurs dans sharedPreferences:

Ces valeurs sont utilisées comme clés:

private static final String MYPITCH = "1.0"; 
private static final String MYSPEED = "1.0"; 
private static final String ULTRADOG = "1.0"; 
private static final String ULTRACAT = "1.0"; 

Ici pour stocker des valeurs

editor.putFloat(MYPITCH, pitch); 
editor2.putFloat(MYSPEED, speed); 
editor7.putFloat(ULTRADOG, calcDog); 
editor7.putFloat(ULTRACAT, calcCat); 

Et ici pour obtenir des valeurs

float NPITCH = appPreferences.getFloat(MYPITCH, (float) 1.0); 
float NSPEED = appPreferences.getFloat(MYSPEED, (float) 1.0); 
float UDOG = appPreferences.getFloat(ULTRADOG, (float) 1.0); 
float UCAT = appPreferences.getFloat(ULTRACAT, (float) 1.0); 

Vous devriez plutôt utiliser uniques et clés significatives:

private static final String MYPITCH = "my_pitch"; 
private static final String MYSPEED = "my_speed"; 
private static final String ULTRADOG = "ultra_dog"; 
private static final String ULTRACAT = "ultra_cat"; 
+0

Ok je vais essayer ça, j'étais bloqué en pensant que l'éditeur prendrait les valeurs de ces variables mais ce n'était pas, je vois pourquoi parce que les variables initiales ont toutes la même valeur merci – Wraithious

+0

Merci beaucoup!Cela a fonctionné parfaitement! – Wraithious