Проблема получения массива объектов из набора <Locale>в Android - PullRequest
0 голосов
/ 28 октября 2018

Видите ли вы что-то не так с этим кодом? Я получаю следующую ошибку при выполнении функции: java.lang.NullPointerException: Попытка вызвать метод интерфейса java.lang.Object[] java.util.Set.toArray() для нулевой ссылки на объект. Я запускаю его в Android 7.0.

import android.speech.tts.TextToSpeech;
import android.speech.tts.TextToSpeech.OnInitListener;
import java.util.Locale;
import java.util.Set;
import java.util.Arrays;
import android.content.Context;


public static String GetLanguages(Object objcon) {
    Context context = (Context) objcon;
    TextToSpeech tts;

    tts = new TextToSpeech(context, new OnInitListener(){
        @Override
        public void onInit(int status) {

        };
    });

    Set<Locale> loc = tts.getAvailableLanguages();
    Object[] objloc = loc.toArray();
    return Arrays.toString(objloc);

};

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Вы получаете ноль, потому что TextToSpeech нужно время для инициализации.Вот почему вы должны обеспечить реализацию OnInitListener во время инициализации.

tts = new TextToSpeech(context, new TextToSpeech.OnInitListener(){
        @Override
        public void onInit(int status) {
            // Now you can use tts
            Set<Locale> loc = tts.getAvailableLanguages();
            Object[] objloc = loc.toArray();

        };
    });

Этот подход требует использования TextToSpeech в качестве переменной класса, поэтому вам потребуется какой-то обратный вызов, чтобы получить результаты из GetLanguages метод.

0 голосов
/ 28 октября 2018

Используйте это вместо:

Locale[] locales = Locale.getAvailableLocales();
List<Locale> localeList = new ArrayList<Locale>();
for (Locale locale : locales) {
    int res = tts.isLanguageAvailable(locale);
    if (res == TextToSpeech.LANG_COUNTRY_AVAILABLE) {
        localeList.add(locale);
    }
}

return Arrays.toString(localeList);
...