【问题标题】:How to use google translator app如何使用谷歌翻译应用程序
【发布时间】:2011-06-23 07:22:37
【问题描述】:

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

我该如何使用它,我应该导入什么吗?

【问题讨论】:

    标签: android google-translate


    【解决方案1】:

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

    不过,Google 似乎已经通过web service 开放了翻译 API。这样,您可以自己进行翻译并将其显示在您的应用程序中。需要做更多的工作,但它应该可以胜任。

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

    【讨论】:

    • 谷歌翻译现在是一项付费服务​​......所以能够“调用”翻译应用的服务会很好......
    【解决方案2】:

    我也有同样的问题。最初,我尝试使用 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);
    }
    

    【讨论】:

    • 谢谢!是否有任何功能可以静默执行此操作(即不启动 Google 翻译活动)?也许是内容提供商?
    • 在 4.0 上不起作用,基本上错误显示“原因:java.lang.NullPointerException:uriString”。有什么提示吗?
    【解决方案3】:

    Phi Van Ngoc 的 answer 非常棒,谢谢。

    但它最初对我不起作用,在调查了翻译 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);
    

    【讨论】:

    • 我假设没有办法从 Intent 中获取翻译后的文本,对吗?
    【解决方案4】:

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

    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”的 SEND Intent。

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

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

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        添加以上答案:

        传递两个字母语言代码很重要。使用 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);
            //...
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-24
          • 1970-01-01
          • 1970-01-01
          • 2014-02-26
          • 2012-05-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多