I have a count down timer and if the user does not click this button on an even number I need to perform a certain method which will end my game. So basically if the user stops tapping I need the gameOver() method called.
import android.app.Activity;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
public class GameScreen extends Activity {
private TextView time;
private Button start;
private Button cancel;
private Button gameButton;
private CountDownTimer countDownTimer;
public static int count = 0;
int foo = Integer.parseInt(time.getText().toString());
private View.OnClickListener btnClickListener = new View.OnClickListener(){
#Override
public void onClick(View v) {
switch(v.getId()){
case R.id.start_ID :
start();
break;
case R.id.cancel :
cancel();
break;
case R.id.gameButton_ID :
gameButton();
break;
}
}
};
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game_screen);
start = (Button) findViewById(R.id.start_ID);
start.setOnClickListener(btnClickListener);
cancel = (Button) findViewById(R.id.cancel);
cancel.setOnClickListener(btnClickListener);
time = (TextView) findViewById(R.id.time);
gameButton = (Button) findViewById(R.id.gameButton_ID);
gameButton.setOnClickListener(btnClickListener);
}
public void start(){
time.setText("15");
countDownTimer = new CountDownTimer(15 * 1000, 1000) {
#Override
public void onTick(long millsUntilFinished){
time.setText("" + millsUntilFinished / 1000);
//this doesnt work and makes app crash when you hit start button
if((gameButton.isPressed() != true) && foo % 2 == 0){
gameOver();
}
}
public void onFinish(){
time.setText("Done !");
}
};
countDownTimer.start();
}
private void cancel(){
if(countDownTimer != null){
countDownTimer.cancel();
countDownTimer = null;
}
}
private void gameOver(){
Toast.makeText(getApplicationContext(), "You scored " + count, Toast.LENGTH_SHORT).show();
count = 0;
cancel();
}
private void gameButton(){
if(foo % 2 == 0 ) {
Toast.makeText(getApplicationContext(), "PASS", Toast.LENGTH_SHORT).show();
++count;
}
else{
gameOver();
}
}
}
What you can do is take one boolean called isClickedOnEvenNumber. Now when you press the button when even-number set isClickedOnEvenNumber as
isClickedOnEvenNumber = true;
Now check on every tick check that
if(isClickedOnEvenNumber)
//continue game
else
//end game
EDIT :
You can use a TimerTask that periodically verifies wether or not the Button was clicked. You do not need the counterBTnnotclicked variable any more.
So you can do something like this : (Am trying to write this quickly, so be aware of that)
class BtnClickIntegerHolder{
public int counterBtnClicked = 0;
}
class BtnClicksCheckerIntegerHolder{
public int btnClicks = 0;
}
final BtnClickIntegerHolder btnClickCounter = new BtnClickIntegerHolder();
yourButton.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
btnClickCounter.counterBtnClicked = btnClickCounter.counterBtnClicked + 1;
}
});
int period = 10000; // repeat every 10 secs.
final BtnClicksCheckerIntegerHolder btnClicksHolder = new BtnClicksCheckerIntegerHolder();
btnClicksHolder.btnClicks = btnClickCounter.counterBtnClicked;
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
if(btnClickCounter.counterBtnClicked == btnClicksHolder.btnClicks ){
//Button was not clicked
}
else{
//Button was clicked
}
btnClicksHolder.btnClicks = btnClickCounter.counterBtnClicked;
}
}, period, period);
Related
I'm trying to loop my countdown timer for a specific number of times, but I'm not sure where I should add my for loop... Currently trying to do an interval timer function (I know there's a way to do it via Handler, but I'm still a beginner and got kind of confused on how I shoul use the handler)
I've tried adding it at '.start' and the StartTimer function but the countdown time still stays at 0. Would be great if any assistance is given as I'm still a beginner.. Thanks!
package com.example.bushykai.myapplication;
import android.os.CountDownTimer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class Timer extends AppCompatActivity {
private static final long START_TIME_IN_MILLIS=10000;
private int sets = 3;
private TextView textViewCountdown;
private Button buttonStartPause;
private Button buttonReset;
private CountDownTimer countDownTimer;
private boolean timerRunning;
private long timeLeftInMillis = START_TIME_IN_MILLIS;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_timer);
textViewCountdown = findViewById(R.id.countdownTimer);
buttonStartPause = findViewById(R.id.startPause);
buttonReset= findViewById(R.id.reset);
buttonStartPause.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
if (timerRunning) {
pauseTimer();
}
else {
startTimer();
}
}
});
buttonReset.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
resetTimer();
}
});
updateCountDownText();
}
private void pauseTimer() {
countDownTimer.cancel();
timerRunning = false;
buttonStartPause.setText("Start");
buttonReset.setVisibility(View.VISIBLE);
}
private void startTimer() {
countDownTimer = new CountDownTimer(timeLeftInMillis, 1000) {
#Override
public void onTick(long millisUntilFinished) {
timeLeftInMillis = millisUntilFinished;
updateCountDownText();
}
#Override
public void onFinish() {
timerRunning = false;
buttonStartPause.setText("Start");
buttonStartPause.setVisibility(View.INVISIBLE);
buttonReset.setVisibility(View.VISIBLE);
}
}.start();
timerRunning = true;
buttonStartPause.setText("Pause");
buttonReset.setVisibility((View.INVISIBLE));
}
private void resetTimer() {
timeLeftInMillis = START_TIME_IN_MILLIS;
updateCountDownText();
buttonReset.setVisibility(View.INVISIBLE);
buttonStartPause.setVisibility(View.VISIBLE);
}
private void updateCountDownText() {
int minutes = (int) (timeLeftInMillis / 1000 ) / 60;
int seconds = (int) (timeLeftInMillis / 1000 ) % 60;
String timeLeftFormatted = String.format("%02d:%02d", minutes, seconds);
textViewCountdown.setText(timeLeftFormatted);
}
}
You have to add a Runnable Handler to your class try code below and modify with your Countdown Timer
public Handler timerHandler = new Handler();
public Runnable timerRunnable = new Runnable() {
#Override
public void run() {
//show alert or DO Whatever
}
};
public void timerStart() {
timerStop();
timerHandler.postDelayed(timerRunnable, Constants.TIMER_TIME_OUT);
}
public void timerStop() {
timerHandler.removeCallbacks(timerRunnable);
}
I Want to create a timer which will run for 10 seconds. If the user have entered the correct answer the timer should restart. For that I have added cancel.countdowntimer(). But it's not working. The app crashes. Where should I use that countdowntimer.cancel() function? Should I use a method for countdowntimer.cancel()?
package com.example.vignesh.work;
import android.os.CountDownTimer;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Random;
public class MainActivity extends AppCompatActivity {
Button b1;
int loc;
int total=0;
int mark=0;
Runnable run;
Handler handler;
CountDownTimer countDownTimer;
TextView textView4,textView2,textView1,textView3;
Button b11,b22,b33,b44;
Random random = new Random();
ArrayList<Integer> answers = new ArrayList<Integer>();
public void nextQuestion() {
new CountDownTimer(10000 + 100, 1000) {
#Override
public void onTick(long millisUntilFinished) {
textView3.setText(Long.toString(millisUntilFinished / 1000));
}
#Override
public void onFinish() {
textView3.setText("10");
}
}.start();
int a = random.nextInt(20) + 1;
int b = random.nextInt(20) + 1;
textView1.setText(Integer.toString(a) + "+" + Integer.toString(b));
loc = random.nextInt(4);
answers.clear();
for (int i = 0; i < 4; i++) {
if (i == loc) {
answers.add(a + b);
} else {
answers.add((a + b) + random.nextInt(10) + 1);
}
}
b11.setText(Integer.toString(answers.get(0)));
b22.setText(Integer.toString(answers.get(1)));
b33.setText(Integer.toString(answers.get(2)));
b44.setText(Integer.toString(answers.get(3)));
}
public void choose(View view)
{
if(view.getTag().toString().equals(Integer.toString(loc+1)))
{
textView4.setText("Correct");
mark++;
}
else
{
textView4.setText("Wrong");
}
total++;
try {
countDownTimer.cancel();
}
catch (Exception e)
{
Log.i("error",e.getMessage());
}
nextQuestion();
textView2.setText(Integer.toString(mark)+"/"+Integer.toString(total));
}
public void click(View view)
{
b1.setVisibility(view.INVISIBLE);
}
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1 = (Button)findViewById(R.id.buttongo);
b11 = (Button)findViewById(R.id.optiona);
b22 = (Button)findViewById(R.id.optionb);
b33 = (Button)findViewById(R.id.option3);
b44 = (Button)findViewById(R.id.option4);
textView1=(TextView)findViewById(R.id.textView1);
textView2=(TextView)findViewById(R.id.textView2);
textView3=(TextView)findViewById(R.id.textView3);
textView4=(TextView)findViewById(R.id.textView4);
nextQuestion();
}
}
**AFTER ADDING EXCEPTIONAL HANDLING THE ERROR WAS:Attempt to invoke virtual method 'void android.os.CountDownTimer.cancel()' on a null object reference**
Thanks.
You instantiate your CountDownTimer in nextQuestion() method, however you do not assign it in the countDownTimer variable defined in the top of your class: CountDownTimer countDownTimer;
Change the code inside nextQuestion() method to:
countDownTimer = new CountDownTimer(10000 + 100, 1000) {
#Override
public void onTick(long millisUntilFinished) {
textView3.setText(Long.toString(millisUntilFinished / 1000));
}
#Override
public void onFinish() {
textView3.setText("10");
}
};
countDownTimer.start();
Note that I am assigning the new CountDownTimer to countDownTimer variable and then start the timer by calling countDownTimer.start();.
Then check if countDownTimer is null before calling it to cancel:
if(countDownTimer != null) {
countDownTimer.cancel();
}
You are not initialising countDownTimer variable update your method like below and also check null before calling countDownTimer.cancel();
public void nextQuestion() {
countDownTimer = new CountDownTimer(10000 + 100, 1000) {
#Override
public void onTick(long millisUntilFinished) {
textView3.setText(Long.toString(millisUntilFinished / 1000));
}
#Override
public void onFinish() {
textView3.setText("10");
}
}.start();
int a = random.nextInt(20) + 1;
int b = random.nextInt(20) + 1;
textView1.setText(Integer.toString(a) + "+" + Integer.toString(b));
loc = random.nextInt(4);
answers.clear();
for (int i = 0; i < 4; i++) {
if (i == loc) {
answers.add(a + b);
} else {
answers.add((a + b) + random.nextInt(10) + 1);
}
}
b11.setText(Integer.toString(answers.get(0)));
b22.setText(Integer.toString(answers.get(1)));
b33.setText(Integer.toString(answers.get(2)));
b44.setText(Integer.toString(answers.get(3)));
}
I've implemented a CountDownTimer in my code as follows: At the top of the class, I create
CountDownTimer myTimer;
Then when a user presses button Start, the following method is called:
private void countme()
{
final int tick = 500;
final int countTime = 10000;
myTimer = new CountDownTimer(countTime, tick) {
#Override
public void onTick(final long millisUntilFinished) { }
#Override
public void onFinish() {
myPicture.setVisibility(View.GONE);
}
};
myTimer.start();
}
I have button Stop all myTimer.cancel(). As you can see, if the timer is not cancelled, myPicture will disappear.
Even if I click the stop button so that myTimer.cancel() is called (I checked this with log statements), the counter still continues to count down and to make the picture disappear when it's done.
Why isn't it stopping? How do I get it to actually cancel?
To clarify, I do know how to implement Runnable timers, but they are not as accurate for my needs as CountDownTimers are, which is why I'm not using them in this case.
After a lot of tries, trick is to declare the timer in onCreate but start and cancel it in some other method. The onFinish() will not call after cancelling the timer.
myTimer = new CountDownTimer(COUNT_DOWN_TIME, TICK) {
#Override
public void onTick(final long millisUntilFinished) {
((TextView) findViewById(R.id.textView3)).setText(""
+ millisUntilFinished);
}
#Override
public void onFinish() {
findViewById(R.id.timer_imageBiew).setVisibility(View.GONE);
}
};
private fun startTimer() {
myTimer .start()
}
private fun stopTimer() {
myTimer .cancel()
}
Here in your method countme() you are initializing myTimer, so outside this method myTimer has no value.
Use this
Declare at the top
CountDownTimer myTimer;
final int tick = 500;
final int countTime = 10000;
In the onCreate method of Activity or Fragment
myTimer = new CountDownTimer(countTime, tick) {
#Override
public void onTick(final long millisUntilFinished) { }
#Override
public void onFinish() {
myPicture.setVisibility(View.GONE);
}
};
Now use myTimer.start() to start and myTimer.cancel() to stop it.
Hope you understood.
Your post is very odd. I just tried doing a sample activity:
public class MainActivity extends AppCompatActivity {
CountDownTimer myTimer;
Button btnStart;
Button btnCancel;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sample2);
btnStart = (Button) findViewById(R.id.start);
btnStart.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
countme();
Toast.makeText(MainActivity.this, "Count Started!", Toast.LENGTH_SHORT).show();
}
});
btnCancel = (Button) findViewById(R.id.cancel_timer);
btnCancel.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
myTimer.cancel();
Toast.makeText(MainActivity.this, "Clicked Stop Timer!", Toast.LENGTH_SHORT).show();
}
});
}
private void countme() {
final int tick = 500;
final int countTime = 10000;
myTimer = new CountDownTimer(countTime, tick) {
#Override
public void onTick(final long millisUntilFinished) {
Log.d(MainActivity.class.getSimpleName(), "onTick()");
}
#Override
public void onFinish() {
// myPicture.setVisibility(View.GONE);
Toast.makeText(MainActivity.this, "In onFinish()", Toast.LENGTH_SHORT).show();
}
};
myTimer.start();
}
}
It works perfectly fine. It stops the timer. But I went and looked around and found this answer where it mentions that CountDownTimer doesn't seem to work, so he suggested to use a Timer instead. Do check it out. Cheers!
This is working example , I have implemented both handler and timer you can pick one .
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class MainActivity extends Activity {
private CountDownTimer myTimer;
final int TICK = 500;
final int COUNT_DOWN_TIME = 2000;
// Option 2 using handler
private Handler myhandler = new Handler();
private Runnable runnable;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Option 1 using timer
myTimer = new CountDownTimer(COUNT_DOWN_TIME, TICK) {
#Override
public void onTick(final long millisUntilFinished) {
((TextView) findViewById(R.id.textView3)).setText(""
+ millisUntilFinished);
}
#Override
public void onFinish() {
findViewById(R.id.timer_imageBiew).setVisibility(View.GONE);
}
};
// Option 2 using handler
runnable = new Runnable() {
#Override
public void run() {
findViewById(R.id.handlerImageView).setVisibility(View.GONE);
}
};
findViewById(R.id.start_timer).setOnClickListener(
new OnClickListener() {
#Override
public void onClick(View v) {
// Option 1 using timer
myTimer.start();
// Option 2 using handler
myhandler.postDelayed(runnable, COUNT_DOWN_TIME);
}
});
findViewById(R.id.stop_timer).setOnClickListener(new OnClickListener() {
#Override
public void onClick(View v) {
// Option 1 stop timer
myTimer.cancel();
// Option 2 stop handler
myhandler.removeCallbacks(runnable);
}
});
}
}
This is my code:
package com.example.wackamole;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
public class MainActivity extends Activity {
static int scoreCount;
static Timer t;
static int count;
static int timeInterval;
protected TextView textView, counter;
protected ImageButton button;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
t = new Timer();
scoreCount = 0;
count = 0;
timeInterval = 1000;
button = (ImageButton)findViewById(R.id.mole);
button.setBackgroundDrawable(null);
textView = (TextView)findViewById(R.id.score);
t.scheduleAtFixedRate(new TimerTask(){
#Override
public void run() {
runOnUiThread(new Runnable() {
#Override
public void run() {
if (count%2 == 0)
button.setImageResource(R.drawable.mole);
else
button.setImageResource(R.drawable.hole);
count++;
textView.setText("Score:" + count);
}
});
}
},0, timeInterval);
findViewById(R.id.mole).setOnClickListener(new View.OnClickListener() {
public void onClick (View v){
if (timeInterval > 100)
timeInterval -= 50;
if (t != null){
t.cancel();
t.purge();
t = null;
}
}
});
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
I want to be able to stop the timer when I click the button, and then restart the timer again (this time, the timer interval is smaller so it will be faster). Is it something like onCreate()? or onResume? and if so, can someone explain those to me?
If i understand you right, you are trying to create a single timer, that will be canceled and reset upon pushing a button. If so, i think this should work for you.
Outside of your onCreate you could create a method that handles the cancel and creation of the timer:
private void setupTimer() {
t.cancel();
t.schedule(new TimerTask() {
#Override
public void run() {
runOnUiThread(new Runnable() {
#Override
public void run() {
if (count % 2 == 0)
button.setImageResource(R.drawable.mole);
else
button.setImageResource(R.drawable.hole);
count++;
textView.setText("Score:" + count);
}
});
}
}, timeInterval);
}
Timer.schedule() seemed to fit your needs. You can read more about the different methods that Timer offers at: http://developer.android.com/reference/java/util/Timer.html
Timer.scheduleAtFixedRate() continuously fires at a given interval. The rate of the interval is fixed and won't suit your needs to reduce the timer interval each button press.
Now inside your onCreate you can call this new method when a user clicks your button:
findViewById(R.id.mole).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
if (timeInterval > 100)
timeInterval -= 50;
setupTimer();
}
});
S
Hey all, I'm trying to put text-to-speech in my CountDownTimer. I would like it to say "There are x seconds left" after a certain amount of time. I just started using TextToSpeech and I'm not really sure what I'm doing..
package com.android.countdown;
import java.util.Locale;
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.speech.tts.TextToSpeech;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;
public class countdown extends Activity implements TextToSpeech.OnInitListener{
CountDownTimer Counter1;
CountDownTimer Counter2;
CountDownTimer Counter3;
int Interval = 1;
TextToSpeech tts;
public String formatTime(long millis) {
String output = "0:00";
long seconds = millis / 1000;
long minutes = seconds / 60;
seconds = seconds % 60;
minutes = minutes % 60;
String secondsD = String.valueOf(seconds);
String minutesD = String.valueOf(minutes);
if (seconds < 10)
secondsD = "0" + seconds;
if (minutes < 10)
minutesD = "0" + minutes;
output = minutesD + " : " + secondsD;
return output;
}
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//Declare Start/Stop timer
Button btnstart = (Button)findViewById(R.id.btnstart);
Button btnstop = (Button)findViewById(R.id.btnstop);
//Text field to show time left
final TextView mCounter1TextField=(TextView)findViewById(R.id.counter1);
final TextView mCounter2TextField = (TextView)findViewById(R.id.counter2);
final TextView mCounter3TextField=(TextView)findViewById(R.id.counter3);
//Counter 1
Counter1 = new CountDownTimer(20000 , Interval) {
public void onTick(long millisUntilFinished){
mCounter1TextField.setText("Seconds left: " + formatTime(millisUntilFinished));
if (millisUntilFinished == 10000) {
instantiate();
}
}
public void onFinish() {
Counter1.start();
}
};
//Counter 2
Counter2 = new CountDownTimer(80000 , Interval) {
public void onTick(long millisUntilFinished) {
mCounter2TextField.setText("Seconds left: " + formatTime(millisUntilFinished));
}
public void onFinish() {
mCounter2TextField.setText("Finished!");
Counter2.start();
}
};
//Counter 3
Counter3 = new CountDownTimer(3000 , Interval) {
public void onTick(long millisUntilFinished) {
mCounter3TextField.setText("Seconds left: " + formatTime(millisUntilFinished));
}
public void onFinish() {
mCounter3TextField.setText("Finished!");
Counter3.start();
}
};
//Start Button
btnstart.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Counter1.start();
Counter2.start();
Counter3.start();
}
});
//Stop Button
btnstop.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Counter1.cancel();
Counter2.cancel();
Counter3.cancel();
if (tts != null) {
tts.stop();
tts.shutdown();
}
}
});
}
public void instantiate() {
tts = new TextToSpeech(this, this);
tts.setLanguage(Locale.US);
tts.speak("You have 10 seconds remaining", TextToSpeech.QUEUE_ADD, null);
}
#Override
public void onInit(int status) {
}
#Override
public void onDestroy() {
// Don't forget to shutdown!
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroy();
}
}
Your second argument in tts = new TextToSpeech(this, this) does not implement TextToSpeech.OnInitListener.
You need to have countdown or another class implement TextToSpeech.OnInitListener:
public class countdown extends Activity implements TextToSpeech.OnInitListener {
Then implement onInit() in said class:
void onInit(int status){
// implementation
}
And finally pass the class that implements OnInitListener into the TextToSpeech constructor:
// The second 'this' will be replaced with another class if you
// decide to use a class other than countdown to implement the interface.
tts = new TextToSpeech(this, this);
Check out the TextToSpeechActivity.java tutorial for a full working example.
EDIT
As NickT mentioned, you also need to add curly braces to your if statement in onTick:
if (millisUntilFinished == 10000) {
tts = new TextToSpeech(this, this);
tts.setLanguage(Locale.US);
tts.speak("You have 10 seconds remaining", TextToSpeech.QUEUE_ADD, null);
}
Else you'll execute setLanguage and speak always, which will give you a NullPointerException unless millisUntilFinished == 10000 is true.
http://developer.android.com/reference/android/speech/tts/TextToSpeech.OnInitListener.html
Another approach that doen't need to implement TextToSpeech.OnInitListener in your activity, meaning a cleaner code (In my opinion), is:
tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
#Override
public void onInit(int status){
if(status == TextToSpeech.SUCCESS) {
Log.d("myapp", "TextToSpeech enabled");
}
}
});
If you want to "ask" for tts data. I do it this way:
// I have this code inside onCreate(), but you can call it elsewhere.
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, 6);
// Then, in the activity add this code:
#Override
protected void onActivityResult(final int requestCode, final int resultCode, final Intent intent) {
if (requestCode == 6) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
tts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {
#Override
public void onInit(int status){
if(status == TextToSpeech.SUCCESS) {
Log.d("myapp", "TextToSpeech prepared");
}
}
});
}
}
}
Is almost the same as TextToSpeech.isLanguageAvailable(). I'm going to change it near the future.