我编写了关于字典句子的程序,我希望在我的应用程序中有“google translator”应用程序的功能
我如何使用它,我应该导入任何东西吗?
答案 0 :(得分:7)
据我所知,谷歌翻译Android应用程序没有公开你可以使用的任何标准Intent
(这是一个很小的,但它同时很奇怪。你会认为谷歌会鼓励这个应用程序之间的交互类型..无论如何)。
但是,Google似乎已经通过web service打开了翻译API。这样,您就可以自己进行翻译并在应用中显示。这是一项更多的工作,但它应该做的工作。
如果您不想编写API包装器,可以查看google-api-translate-java。
答案 1 :(得分:6)
我有同样的问题。最初,我尝试使用谷歌翻译Ajax API,但由于谷歌已弃用API版本1并将版本2作为付费服务,我的代码停止工作。然后,我反编译了谷歌翻译应用程序,查看了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);
}
答案 2 :(得分:6)
Van Pho Ngoc的answer太棒了,谢谢你。
然而它最初对我来说并不起作用,在调查Translate 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);
答案 3 :(得分:5)
OMG!他们又一次改变了!它们使它看起来更合理,但与之前的版本不兼容。
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"));
看起来这是一个SEND意图,有两个额外的(BTW,可选)参数,“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”设置为相同的值。
答案 4 :(得分: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);
//...
答案 5 :(得分:0)
Google Translate活动名称会随着时间而变化,如果对它们进行硬编码,则代码将变得脆弱。
这是一种可与当前版本的Google翻译配合使用并会继续用于将来的更新的方法:
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 <<<
}