W / TextToSpeech: говорить не удалось: не привязан к движку TTS - PullRequest
0 голосов
/ 30 июня 2018

У меня есть мой класс MyTTS, и у меня есть метод speakout в этом классе. Когда я вызываю его внутри класса, он работает нормально, но если я инициализирую этот класс в другом классе и снова вызываю этот метод, он никогда не работает, это дает мне

W / TextToSpeech: говорить не удалось: не привязан к движку TTS

это мой класс MyTTS.java:

TextToSpeech textToSpeech;


public MyTTS(Context context) {
    textToSpeech=new TextToSpeech(context,this);
}



@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public void speakOut(String str,String pk){
    textToSpeech.speak(str,TextToSpeech.QUEUE_FLUSH,null,pk);
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {

        int result = textToSpeech.setLanguage(Locale.US);

        if (result == TextToSpeech.LANG_MISSING_DATA
                || result == TextToSpeech.LANG_NOT_SUPPORTED) {
            Log.e("TTS", "This Language is not supported");
        } else {
           speakOut("badr","dfd");
        }

    } else {
        Log.e("TTS", "Initilization Failed!");
    }
}

@Override
public void onPause() {

    if(textToSpeech==null){
        textToSpeech.stop();
        textToSpeech.shutdown();

    }

    super.onPause();
}

и это класс, который я инициализирую класс MyTTS и вызываю метод speakOut:

fragment.java:

public class must_adapter_frag extends Fragment{
    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @SuppressLint("JavascriptInterface")
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        //Inflate the layout for this fragment

        MyTTS myTTS=new MyTTS(getActivity());

        View view= inflater.inflate(R.layout.webview_frag, container, false);
        System.out.println("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
        myTTS.speakOut("salam","dj");

        System.out.println("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
        WebView webView=view.findViewById(R.id.webview);
        webView.getSettings().setJavaScriptEnabled(true);
        webView.addJavascriptInterface(myTTS,"Android");
        webView.loadUrl("file:///android_asset/"+String.valueOf(getArguments().getInt("position"))+".html");



        return view;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        getActivity().setTitle("تعليق");

    }

Если кто-нибудь из экспертов может помочь мне решить этот вопрос, пожалуйста!

И я сожалею о своем английском языке, потому что это не мой язык.

1 Ответ

0 голосов
/ 03 июля 2018

Вы получаете эту ошибку, потому что объект TextToSpeech внутри объекта MyTTS (который вы создали из фрагмента) еще не инициализирован.

Внутри класса MyTTS вы можете видеть, что имеется метод speakOut () внутри метода onInit (). Вот почему он работает там правильно ... потому что onInit вызывается только после инициализации объекта textToSpeech.

Итак ... что бы вы могли сделать, это что-то вроде:

public boolean textToSpeechIsInitialized = false;  // <--- add this line

public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {

        textToSpeechIsInitialized = true;  // <--- add this line

        int result = textToSpeech.setLanguage(Locale.US);

        if (result == TextToSpeech.LANG_MISSING_DATA
                || result == TextToSpeech.LANG_NOT_SUPPORTED) {
            Log.e("TTS", "This Language is not supported");
        } else {
           speakOut("badr","dfd");
        }

    } else {
        Log.e("TTS", "Initilization Failed!");
    }
}

Затем в своем фрагменте убедитесь, что вы сначала проверили этот логический флаг перед вызовом speakOut ():

System.out.println("hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh");
        if (myTTS.textToSpeechIsInitialized) {  // <--- add this line
             myTTS.speakOut("salam","dj");
        } else { 
             // try again later 
        }
...