Здесь я разрабатываю очень простое приложение. Это для моей дочери, страдающей церебральным параличом. Это просто большие кнопки ДА и НЕТ, чтобы она могла нажимать их по запросу.
Ну ... Я использую SVOX Classic TTS Engine.
Все шло гладко, пока мой планшет не обновился до ICS. Теперь каждый раз, когда я запускаю приложение, оно открывает Маркет и просит меня установить TTS. Я нажимаю "назад", и мое приложение говорит. Это ОЧЕНЬ раздражает.
Вот что говорит Google API:
* Успешная проверка будет отмечена кодом результата CHECK_VOICE_DATA_PASS, указывающим, что это устройство готово к работе после создания нашего объекта TextToSpeech. Если нет, мы должны сообщить пользователю об установке данных, необходимых для того, чтобы устройство стало многоязычной говорящей машиной! Загрузка и установка данных выполняется путем запуска намерения ACTION_INSTALL_TTS_DATA, которое приведет пользователя к Android Market и позволит ему / ему инициировать загрузку. Установка данных произойдет автоматически после завершения загрузки. Вот пример того, как будет выглядеть ваша реализация onActivityResult (): *
Вот мой код:
public class yesOunoActivity extends Activity implements OnInitListener{
ImageView yes;
ImageView no;
public TextToSpeech tts;
private int MY_DATA_CHECK_CODE = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
tts = new TextToSpeech(this, this);
setContentView(R.layout.yesorno);
yes = (ImageView) findViewById(R.id.yes);
no = (ImageView) findViewById(R.id.no);
yes.setClickable(true);
yes.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent arg1) {
if (arg1.getAction() == android.view.MotionEvent.ACTION_DOWN) {
tts.speak("yes!", TextToSpeech.QUEUE_ADD, null);
}
return true;
}
});
no.setClickable(true);
no.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent arg1) {
if (arg1.getAction() == android.view.MotionEvent.ACTION_DOWN) {
//Intent myIntent = new Intent(v.getContext(), ParametrosActivity.class);
tts.speak("no!", TextToSpeech.QUEUE_ADD, null);
}
return true;
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// success, create the TTS instance
tts = new TextToSpeech(this, this);
} else {
// missing data, install it
//ATTENTION: BELOW THIS GIVES ME PROBLEMS SINCE IT OPENS MARKET
//AND I HAVE TO HIT THE BACK BUTTON, THEN, IT SPEAKS!
//BTW TTS ENGINE "IS" INSTALLED!!
Intent installIntent = new Intent();
installIntent
.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
} else if (status == TextToSpeech.ERROR) {
}
}
@Override
public void onDestroy() {
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroy();
System.gc();
}
}
Если я удалю область с надписью «ВНИМАНИЕ» выше (поскольку я УВЕРЕН, что у меня установлен TTS), она работает при первом запуске приложения, если я выхожу из приложения и открываю его снова, он говорит «говорить не удалось: не привязан к движку tts»
Это похоже на то, что он не создает объект TTS, так как приложение все еще находится в памяти.
Итак, ребята ... что вы, ребята, думаете, что мне следует делать ??
Это сводит меня с ума, и мне действительно нужно общаться с дочерью через планшет!
Любая помощь приветствуется !!