2013-07-23 26 views
11

Có thể xác định qua mã mà gói ngôn ngữ hiện được cài đặt trên thiết bị? Cố gắng này:Phát hiện các ngôn ngữ đã cài đặt để nhận dạng ngoại tuyến

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); 
     } 
    } 
} 

Tuy nhiên, sản lượng chỉ cho tôi tấn ngôn ngữ, trong khi tôi chỉ có en_UK, en_US và es_ES cài đặt. Bất kỳ ý tưởng?

+1

Bạn đang thử nghiệm dịch vụ nhận dạng giọng nói nào? – ozbek

+0

Im sử dụng Google – JesusS

+0

Nhận dạng giọng nói của Google hỗ trợ hàng tá ngôn ngữ. Chính xác thì ý bạn là bạn chỉ cài đặt tiếng Anh Anh/Mỹ và Tây Ban Nha? – ozbek

Trả lời

2

Nếu bạn có root (xin lỗi), bạn có thể làm theo cách này:

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; 
} 

này được tách từ Android 4.2.2 Recognizer.java source và sửa đổi:

  • trả về một boolean đơn giản thay vì của thư mục từ điển
  • mất một string đầu vào (ví dụ. "en_US") thay vì một Locale

Tôi muốn có được danh sách đầy đủ như bạn đang có, và lặp qua chúng để kiểm tra xem những cái nào khả dụng ngoại tuyến. Tôi đã kiểm tra thư mục /system/usr/srec/config/ trên hai thiết bị và cả hai đều khớp với các từ điển mà tôi đã cài đặt.

Tất nhiên, mặt trái là nó chỉ hoạt động cho thư mục gốc, vì vậy tôi không chắc chắn rằng điều này sẽ hữu ích như thế nào cho bạn cuối cùng. Tôi thực sự không chắc chắn những gì để nói cho không gốc, tôi không thể tìm thấy bất cứ điều gì.


Edit: Ra khỏi tò mò, tuy nhiên, những gì EXTRA_SUPPORTED_LANGUAGES chứa nếu bạn ẩn? Nếu nó trả về chính xác, bạn có thể chỉ cần giả mạo người quản lý mạng.

+0

Chứa: ngôn ngữ: [af-ZA, id-ID, ms-MY, ca-ES, cs-CZ, de-DE, en-AU, vi -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, CNTT-IT, hu-HU, nl-NL, nb-NO , pl-PL, pt-BR, PT-PT, ro-RO, sk-SK, fi-FI, sv-SE, vi-VN, tr-TR, bg-BG, ru-RU, sr-RS, anh -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

Tất cả các ngôn ngữ có sẵn.Chứa es-ES, en-US và en-GB là ngôn ngữ tôi hiện đang cài đặt – JesusS

+0

Tôi hiểu, vì vậy việc giả mạo tình huống "không có mạng" sẽ không hoạt động. Bạn không chắc chắn những gì để cho bạn biết ngoài các giải pháp gốc, sau đó. Có thể người khác sẽ tìm thấy thứ gì đó. – Geobits

0

kiểm tra mẫu này:

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(); 
     } 
    } 
} 

bạn có thể nhận được tất cả ngôn ngữ và kiểm tra từng lang được hỗ trợ bởi tts hay không? myTTS.isLanguageAvailable(Locale.US)

+4

Câu trả lời của bạn là về chuyển văn bản thành giọng nói, chứ không phải là lời nói (ngoại tuyến). – Kaarel

Các vấn đề liên quan