10

我编写了关于字典句子的程序,我想在我的应用程序中具有转到“谷歌翻译”应用程序的功能

我该如何使用它,我应该导入任何东西吗?

4

6 回答 6

7

据我所知,Google Translate Android 应用程序没有公开任何Intent您可以使用的标准(这很遗憾,但同时也很奇怪。您会认为 Google 会鼓励应用程序之间的这种类型的交互......无论如何)。

然而,谷歌似乎已经通过网络服务开放了翻译 API 。这样,您可以自己进行翻译并将其显示在您的应用程序中。这需要更多的工作,但它应该可以完成这项工作。

如果您不想编写 API 包装器,可以查看google-api-translate-java 。

于 2011-02-08T09:24:45.090 回答
7

Phi Van Ngoc 的回答非常棒,谢谢。

但是它最初对我不起作用,在调查了翻译 apk 之后,看起来他们已经稍微修改了他们的文件结构,所以意图 ComponentName 现在应该是:

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

不同的是在“TranslateActivity”之前添加了“翻译”

所以我的最终版本,包括从西班牙语到英语的硬编码翻译,是:

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);
于 2012-06-27T00:18:10.480 回答
7

我也有同样的问题。最初,我尝试使用 Google Translate Ajax API,但由于 Google 已弃用 API 版本 1 并将版本 2 作为付费服务,我的代码停止工作。然后,我反编译了 Google Translate App,查看了 Smali 代码并获得了一些关于其中逻辑的提示。使用此代码,它适用于我:

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);
}
于 2012-01-29T11:13:46.717 回答
5

我的天啊!他们再次改变了它!他们使它看起来更合理,但与以前的版本不兼容。

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

看起来这是一个带有两个附加(顺便说一句,可选)参数“to”和“from”的发送意图。

有一个问题:“key_text_input”优先于 Intent.EXTRA_TEXT,“to”和“from”仅适用于“key_text_input”。

对于每个新版本都会更改 API 的人来说,将“key_text_input”重命名为“text_input”可能看起来很合理,所以我们期待下一个版本......

为了安全起见,我建议将 Intent.EXTRA_TEXT 和“key_text_input”设置为相同的值。

于 2013-10-04T06:47:47.190 回答
3

谷歌翻译活动名称往往会随着时间的推移而改变,如果你对它们进行硬编码,这会使代码变得脆弱。

这是一种适用于当前版本的谷歌翻译的方法,并且可能会继续使用未来的更新(只要包名称保持不变):

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    for (ResolveInfo resolveInfo : getPackageManager().queryIntentActivities(new Intent().setAction(Intent.ACTION_PROCESS_TEXT).setType("text/plain"), 0)) {
        if (resolveInfo.activityInfo.packageName.equals("com.google.android.apps.translate")) {
            String activityName = resolveInfo.activityInfo.name;
            String packageName = resolveInfo.activityInfo.packageName;

            Intent intent = new Intent().setPackage(packageName)
                    .setClassName(packageName, activityName)
                    .setAction(Intent.ACTION_PROCESS_TEXT)
                    .setType("text/plain")
                    .putExtra(Intent.EXTRA_PROCESS_TEXT, "Nobody expects the Spanish Inquisition!")
                    .putExtra(Intent.EXTRA_PROCESS_TEXT_READONLY, true);

            startActivity(intent);
        }
    }
} else {
    // >>> deprecated code from other answers goes here <<<
}
于 2020-04-12T20:54:15.517 回答
2

要添加上述答案:

传递两个字母的语言代码很重要。使用 3 个字母的代码,谷歌翻译应用程序可能看起来没有收到任何数据。

另外,如果Intent.ACTION_VIEW不起作用,您可以使用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);
    //...
于 2013-09-05T12:18:02.707 回答