2013-07-23 13 views
11

Możliwe jest określenie za pomocą kodu, które pakiety językowe są obecnie zainstalowane na urządzeniu? Próbowałem to:Wykryj zainstalowane języki rozpoznawania offline

Intent detailsIntent = new Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS); 
    sendOrderedBroadcast(detailsIntent, null, new LanguageDetailsChecker(), null, Activity.RESULT_OK, null, null); 

public class LanguageDetailsChecker extends BroadcastReceiver { 

    private List<String> supportedLanguages; 

    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     Bundle results = getResultExtras(true); 
     if (results.containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) 
     { 
      supportedLanguages =results.getStringArrayList(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES); 
      Log.d("TAG","languages: " + supportedLanguages); 
     } 
    } 
} 

Jednak wyjście pokazuje mi mnóstwo języków, a mam tylko en_UK, pl i es_ES zainstalowany. Dowolny pomysł?

+1

Którą usługę rozpoznawania mowy testujesz? – ozbek

+0

Korzystam z Google – JesusS

+0

Google rozpoznawanie mowy obsługuje wiele języków. Co dokładnie masz na myśli, że masz zainstalowany tylko angielski brytyjski/amerykański i hiszpański? – ozbek

Odpowiedz

2

Jeśli masz root (przepraszam), możesz zrobić to w ten sposób:

public static boolean isOfflineDictionaryPresent(String language) { 
    if (locale == null) locale = Locale.US; 
    String dir = "/system/usr/srec/config/" + 
      language.replace('_', '.').toLowerCase(); 
    if ((new File(dir)).isDirectory()) return true; 
    return false; 
} 

ten został zgrany z Androida 4.2.2 Recognizer.java source i modyfikowany:

  • zwraca prostą logiczną zamiast katalogu słowniku
  • zajmuje wejście String (np. "pl") zamiast Locale

Uzyskałabym pełną listę, tak jak ty, i przeglądasz je, aby sprawdzić, które z nich są dostępne w trybie offline. Sprawdziłem folder /system/usr/srec/config/ na dwóch urządzeniach i oba pasują do zainstalowanych słowników.

Oczywiście wadą jest to, że działa tylko z rootem, więc nie jestem pewien, na ile pomocne będzie to dla ciebie w końcu. Naprawdę nie wiem, co powiedzieć na temat użytkownika root, nie mogę znaleźć niczego.


Edit: Z ciekawości, chociaż, co to EXTRA_SUPPORTED_LANGUAGES zawierać jeśli nieaktywny? Jeśli zostanie zwrócone poprawnie, możesz po prostu zmyślić menedżera sieci.

+0

Zawiera: języki: [af-ZA, id-ID, ms-MY, ca-ES, cs-CZ, DE-DE, en-AU, pl -CA, en-001, EN-IN, EN-NZ, EN-ZA, EN-GB, EN-US, es-AR, es-BO, es-CL, es-CO, es-CR, es-EC , es-US, es-SV, es-ES, es-GT, es-HN, ​​es-MX, es-NI, es-PA, es-PY, es-PE, es-PR, es-DO, es -UY, es-VE, eu-ES, fil-PH, fr-FR, gl-ES, HR-HR, zu-ZA, IS-IS, IT-IT, hu-HU, nl-NL, nb-NO , pl-PL, pt-PT, PT-PT, ro-RO, SK-SK, fi-FI, sv-SE, vi-VN, TR-TR, bg-BG, ru-RU, sr-RS, Wielka Brytania -UA, he-IL, ar-IL, ar-JO, ar-AE, ar-BH, ar-SA, ar-KW, ar-OM, ar-PS, ar-QA, ar-LB, ar-EG , ko-KR, cmn-Hans-CN, cmn-Hans-HK, cmn-Hant-TW, yue-Hant-HK, ja-JP, la] – JesusS

+0

Jakie są dostępne języki.Zawiera es-ES, en-US i en-GB, które są aktualnie zainstalowanymi językami. – JesusS

+0

Rozumiem, więc fałszowanie sytuacji "bez sieci" nie zadziałałoby. Nie wiesz, co powiedzieć, poza rozwiązaniem root. Może ktoś inny coś znajdzie. – Geobits

0

Kontrola ta próbka:

public class SpeakingAndroid extends Activity implements OnInitListener { 

     //TTS object 
    private TextToSpeech myTTS; 
     //status check code 
    private int TS_CHECK_CODE = 0; 

     //create the Activity 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

      //check for TTS data 
      Intent checkTTSIntent = new Intent(); 
      checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
      startActivityForResult(checkTTSIntent, TS_CHECK_CODE); 
    } 

     //act on result of TTS data check 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 

     if (requestCode == MY_DATA_CHECK_CODE) { 
      if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { 
       //the user has the necessary data - create the TTS 
      myTTS = new TextToSpeech(this, this); 
      } 
      else { 
        //no data - install it now 
       Intent installTTSIntent = new Intent(); 
       installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
       startActivity(installTTSIntent); 
      } 
     } 
    } 

     //setup TTS 
    public void onInit(int initStatus) { 

      //check for successful instantiation 
     if (initStatus == TextToSpeech.SUCCESS) { 
      if(myTTS.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE) 
       myTTS.setLanguage(Locale.US); 
     } 
     else if (initStatus == TextToSpeech.ERROR) { 
      Toast.makeText(this, "Sorry! Text To Speech failed...", Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

można uzyskać wszystkie języki i sprawdzić każdy lang jest obsługiwany przez TTS czy nie? myTTS.isLanguageAvailable(Locale.US)

+4

Twoja odpowiedź dotyczy zamiany tekstu na mowę, a nie (offline) mowy na tekst. – Kaarel