2011-02-08 12 views

Odpowiedz

7

Z tego, co mogę powiedzieć, aplikacja Google Translate na Androida nie ujawnia żadnych standardowych Intent s, z których można korzystać (jest to szkoda, ale jednocześnie jest dziwacznie.) Wydawałoby się, że Google będzie zachęcać do tego typu interakcji między aplikacjami ... mimo to).

Wygląda jednak na to, że Google otworzył translate API przez web service. W ten sposób możesz sam wykonać tłumaczenie i pokazać je w swojej aplikacji. To trochę więcej pracy, ale powinna wykonać to zadanie.

Możesz odszukać google-api-translate-java, jeśli chcesz oszczędzić sobie pisania wrappera API.

+1

Tłumacz Google jest teraz płatną usługą ... więc aby móc "zadzwonić" do usługi tłumacza, usługa byłaby dobra ... –

5

Mam ten sam problem. Początkowo próbowałem korzystać z API Ajax Tłumacza Google, ale ponieważ Google wycofało API w wersji 1 i wprowadziło wersję 2 jako płatną usługę, mój kod przestaje działać. Następnie zdekompilowałem aplikację Google Translate, zajrzałem do kodu Smali i otrzymałem podpowiedź na temat logiki w nim zawartej. Użyj tego kodu, to działa na mnie:

private void callGoogleTranslateApps(String word, String fromLang, String toLang) { 
    Intent i = new Intent(); 

    i.setAction(Intent.ACTION_VIEW); 
    i.putExtra("key_text_input", word); 
    i.putExtra("key_text_output", ""); 
    i.putExtra("key_language_from", fromLang); 
    i.putExtra("key_language_to", toLang); 
    i.putExtra("key_suggest_translation", ""); 
    i.putExtra("key_from_floating_window", false); 

    i.setComponent(new ComponentName("com.google.android.apps.translate", "com.google.android.apps.translate.TranslateActivity")); 
    startActivity(i); 
} 
+0

Dzięki! Czy jest jakaś funkcjonalność do wykonania tego w trybie dyskretnym (tzn. Bez uruchamiania działania Tłumacza Google)? Może dostawca treści? –

+0

Nie działa na 4.0, w zasadzie błąd mówi "Powodowany przez: java.lang.NullPointerException: uriString". Jakaś wskazówka? – cnbuff410

6

Phi Van Ngoc na answer był fantastyczny, dzięki za to.

Jednak to nie działa początkowo dla mnie i po zbadaniu apk Tłumacz, wygląda na to, że już zmienił strukturę plików nieznacznie, więc intencją ComponentName powinien być:

i.setComponent(
    new ComponentName(
     "com.google.android.apps.translate", 
     "com.google.android.apps.translate.translation.TranslateActivity")); 

Różnica polega że „tłumaczenie” została dodana przed „TranslateActivity”

Więc moja ostateczna wersja, w tym zakodowane tłumaczeniu z hiszpańskiego na angielski, jest:

Intent i = new Intent(); 
i.setAction(Intent.ACTION_VIEW); 
i.putExtra("key_text_input", "Me gusta la cerveza"); 
i.putExtra("key_text_output", ""); 
i.putExtra("key_language_from", "es"); 
i.putExtra("key_language_to", "en"); 
i.putExtra("key_suggest_translation", ""); 
i.putExtra("key_from_floating_window", false); 
i.setComponent(
    new ComponentName(
     "com.google.android.apps.translate", 
     "com.google.android.apps.translate.translation.TranslateActivity")); 
startActivity(i); 
+1

Zakładam, że nie ma sposobu na odzyskanie przetłumaczonego tekstu z Intencji, prawda? – littleK

2

Aby dodać powyższe odpowiedzi:

ważne jest, aby zdać dwuliterowe kodów językowych. W przypadku 3-literowych kodów może wyglądać, że aplikacja Google Translate nie otrzymuje żadnych danych.

Ponadto, jeśli Intent.ACTION_VIEW nie działa, można użyć Intent.ACTION_SEND.

 intent = new Intent(); 
     //intent.setAction(Intent.ACTION_VIEW); // this did not work for me initially 
     intent.setAction(Intent.ACTION_SEND); 
     intent.putExtra(Intent.EXTRA_TEXT, m_text); 
     intent.putExtra("key_text_input", m_text); 
     intent.putExtra("key_text_output", ""); 
     intent.putExtra("key_language_from", m_language); 
     intent.putExtra("key_language_to", lang_to); 
     intent.putExtra("key_suggest_translation", ""); 
     intent.putExtra("key_from_floating_window", false); 
     intent.setComponent(
      new ComponentName(
       "com.google.android.apps.translate", 
       "com.google.android.apps.translate.HomeActivity" 
       )); 
    //try { 
     startActivityForResult(intent, REQUEST_CODE_TRANSLATE); 
    //... 
4

OMG! Oni zmienili to jeszcze raz! Sprawili, że wyglądał bardziej sensownie, ale nie był zgodny z poprzednią wersją.

Intent i = new Intent(); 
i.setAction(Intent.ACTION_SEND); 
i.putExtra(Intent.EXTRA_TEXT, "What is going on?"); 
i.putExtra("key_text_input", "Oh my God!"); 
i.putExtra("from", "en"); 
i.putExtra("to", "zh-CN"); 
i.setComponent(new ComponentName("com.google.android.apps.translate", 
       "com.google.android.apps.translate.HomeActivity")); 

Wygląda na to, że jest to funkcja SEND z dwoma dodatkowymi (BTW, opcjonalnie) parametrami, "to" i "from".

Jest gotcha: "key_text_input" ma pierwszeństwo nad Intent.EXTRA_TEXT, a "to" i "from" działa tylko z "key_text_input".

Dla osób, które zmieniają API z każdą nową wersją, może wydawać się uzasadnione zmienić nazwę "key_text_input" na, powiedzmy, "text_input", więc czekamy na kolejne wydanie ...

Aby być po bezpiecznej stronie, chciałbym ustawić zarówno Intent.EXTRA_TEXT i "key_text_input" na tę samą wartość.

Powiązane problemy