Я хочу использовать текст в речи в своем приложении, я нахожу много примеров для использования текста в речь, как это Android Text-To-Speech Application. Я хочу использовать текст для речи из класса non-activity, например, у меня есть класс, который разбивает макет и возвращает этот макет в мою основную деятельность, кнопка ihave на этом макете, и я хочу, когда вы нажмете на эту кнопку, вызовите текст в речь. как я могу использовать текст для речи в классе без активности?android: как использовать текст в речь по классу неактивности
ответ
Для достижения этой цели вы можете использовать фасад.
Определить интерфейс, например TTSListener.java
:
public interface TTSListener{
public void speak(String text);
public void pause(long duration);
}
В вашей основной деятельности, реализуют интерфейс:
public class MainActivity extends Activity implements TTSListener{
@Override
public void speak(String text){
runOnUiThread(new Runnable() {
@Override
public void run(){
tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}
);
}
@Override
public void pause(long duration){
runOnUiThread(new Runnable() {
@Override
public void run(){
tts.playSilence(duration, TextToSpeech.QUEUE_FLUSH, null);
}
);
}
Тогда, наконец, в классе вашей неактивности, вы можете вызвать методы TTS:
public class SomeClass{
TTSListener ttsListener;
public SomeClass(Context context){
ttsListener = (TTSListener)context;
}
ttsListener.speak("Hello");
ttsListener.pause(4000); //pause for 4 seconds
}
Привет, он возвращает мне эту ошибку: java.lang.ClassCastException для этой строки: ttsListener = (TTSListener) context; – mahdi
Вы должны передать контекст активности при инициализации SomeClass. Таким образом, в классе активности (реализации интерфейса) вы должны создать экземпляр следующим образом: SomeClass foo = new SomeClass (this); –
@mahdi сообщите мне, если вам нужна дополнительная помощь –
Создайте свой класс речи, как показано ниже:
package zillion;
import android.content.Context;
import android.speech.tts.TextToSpeech;
import android.widget.Toast;
import java.util.Locale;
public class Speech {
private static TextToSpeech tts;
private static CharSequence SC_str;
private static String S_str;
public static void Talk(Context context, String str) {
Toast.makeText(context, str, Toast.LENGTH_SHORT).show();
S_str = str;
tts = new TextToSpeech(Zillion.getContext(), new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if(status != TextToSpeech.ERROR) {
tts.setLanguage(Locale.UK);
tts.setPitch(1.3f);
tts.setSpeechRate(1f);
// tts.speak(SC_str, TextToSpeech.QUEUE_FLUSH, null,null);
tts.speak(S_str, TextToSpeech.QUEUE_FLUSH, null);
}
}
});
}
}
Как вы заметили Zillion.getContext()
были использованы в качестве замены getApplicationContext()
, чтобы получить контекст, вам нужно создать класс расширяет приложения, как показано ниже:
package zillion;
import android.app.Application;
import android.content.Context;
public class Zillion extends Application {
private static Context mContext;
@Override
public void onCreate() {
super.onCreate();
mContext = getApplicationContext();
}
public static Context getContext() {
return mContext;
}
}
и определить приложение в манифесте относящиеся к этому классу как:
<application
android:name=".Zillion"
</application>
Пожалуйста, разместите код и объясните, где у вас проблемы. Непонятно, что вы просите. –