我编写了关于字典句子的程序,我想在我的应用程序中具有转到“谷歌翻译”应用程序的功能
我该如何使用它,我应该导入任何东西吗?
据我所知,Google Translate Android 应用程序没有公开任何Intent
您可以使用的标准(这很遗憾,但同时也很奇怪。您会认为 Google 会鼓励应用程序之间的这种类型的交互......无论如何)。
然而,谷歌似乎已经通过网络服务开放了翻译 API 。这样,您可以自己进行翻译并将其显示在您的应用程序中。这需要更多的工作,但它应该可以完成这项工作。
如果您不想编写 API 包装器,可以查看google-api-translate-java 。
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);
我也有同样的问题。最初,我尝试使用 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);
}
我的天啊!他们再次改变了它!他们使它看起来更合理,但与以前的版本不兼容。
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”设置为相同的值。
谷歌翻译活动名称往往会随着时间的推移而改变,如果你对它们进行硬编码,这会使代码变得脆弱。
这是一种适用于当前版本的谷歌翻译的方法,并且可能会继续使用未来的更新(只要包名称保持不变):
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 <<<
}
要添加上述答案:
传递两个字母的语言代码很重要。使用 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);
//...