2015-03-09 1 views
0

Я хочу использовать текст в речи в своем приложении, я нахожу много примеров для использования текста в речь, как это Android Text-To-Speech Application. Я хочу использовать текст для речи из класса non-activity, например, у меня есть класс, который разбивает макет и возвращает этот макет в мою основную деятельность, кнопка ihave на этом макете, и я хочу, когда вы нажмете на эту кнопку, вызовите текст в речь. как я могу использовать текст для речи в классе без активности?android: как использовать текст в речь по классу неактивности

+0

Пожалуйста, разместите код и объясните, где у вас проблемы. Непонятно, что вы просите. –

ответ

1

Для достижения этой цели вы можете использовать фасад.

Определить интерфейс, например 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 

} 
+0

Привет, он возвращает мне эту ошибку: java.lang.ClassCastException для этой строки: ttsListener = (TTSListener) context; – mahdi

+0

Вы должны передать контекст активности при инициализации SomeClass. Таким образом, в классе активности (реализации интерфейса) вы должны создать экземпляр следующим образом: SomeClass foo = new SomeClass (this); –

+0

@mahdi сообщите мне, если вам нужна дополнительная помощь –

0

Создайте свой класс речи, как показано ниже:

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>