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

У меня есть класс 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:

фрагмент.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("تعليق");

    }

если любой опытный человек может помочь мне решить этот вопрос, пожалуйста!

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


person BADER EDDINE QODIA    schedule 29.06.2018    source источник


Ответы (1)


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

Внутри класса MyTTS вы можете видеть, что в методе onInit() есть функция speakOut(). Вот почему он там работает правильно... потому что 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 
        }
person Nerdy Bunz    schedule 03.07.2018