有道智云翻译API + retrofit实现在线翻译Android app

目录

1.进入有道智云主页,注册自己的账号(手机号验证码),完善信息随意填

2.登录进来后,创建应用。根据需要选择语言翻译服务。

3. 打开Android Studio,新建空的Activity项目

1. 新建项目,在build.gradle(app)添加retrofit依赖

 2. 打开有道云文本翻译API接入文档,找到json文件示例

3.新建一个接口类,获取json文件

4. 新建一个接口实现类来获取Call<>

 5.更改activity_main.xml布局文件

6. drawable文件夹中添加edit_border.xml

 7.在values文件夹中添加arrays.xml文件

 8.更改mainactivity文件

 9.在Manifest.xml中添加网络权限

4.现在就可以运行了


1.进入有道智云主页,注册自己的账号(手机号验证码),完善信息随意填

记得领取赠送的50元体验金(能用好久)

2.登录进来后,创建应用。根据需要选择语言翻译服务。

 我这里接入方式是API接入,因为用的是retrofit。注意IP地址不要填写,直接为空,就不会有IP限制

创建完成后,记下应用ID和应用密钥,等会会用到

3. 打开Android Studio,新建空的Activity项目

1. 新建项目,在build.gradle(app)添加retrofit依赖

    implementation 'com.squareup.retrofit2:retrofit:2.4.0'implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

 2. 打开有道云文本翻译API接入文档,找到json文件示例

( AndroidStudio下载一个GsonFormatPlus插件)

新建Java类来接收这个json文件,Alt+Insert或者右键选择Generate,选择GsonFormatPlus,会跳出这样一个对话框

 将API接入文档中的json文件示例复制粘贴到左边空白栏,点击OK就会自动生成代码。 

//----更新于2022.11.19----

{"errorCode":"0","query":"good", //查询正确时,一定存在"translation": [ //查询正确时一定存在"好"],"basic":{ // 有道词典-基本词典,查词时才有"phonetic":"gʊd","uk-phonetic":"gʊd", //英式音标"us-phonetic":"ɡʊd", //美式音标"uk-speech": "XXXX",//英式发音"us-speech": "XXXX",//美式发音"explains":["好处","好的","好",]},"web":[ // 有道词典-网络释义,该结果不一定存在{"key":"good","value":["良好","善","美好"]},{...}],"dict":{"url":"yddict://m.youdao.com/dict?le=eng&q=good"},"webdict":{"url":"http://m.youdao.com/dict?le=eng&q=good"},"l":"EN2zh-CHS","tSpeakUrl":"XXX",//翻译后的发音地址"speakUrl": "XXX" //查询文本的发音地址
}

这个是目前有道提供的最新json文件,因为收到好几个读者回复说,生成不出来相关代码,所以在这统一说明一下。

JSON文件是有自己的格式的。上述文件中,网易有道在 web 整了个省略。因为里面的元素可能是好几个,有道没有一一列举,也无法列举,所以导致无法生成相关javabean代码。把 web 中的{...} 包括前面的(,)逗号删掉,就能正常生成代码啦。

最后结果:

{"errorCode": "0","query": "good","translation": ["好"],"basic": {"phonetic": "gʊd","uk-phonetic": "gʊd","us-phonetic": "ɡʊd","uk-speech": "XXXX","us-speech": "XXXX","explains": ["好处","好的","好"]},"web": [{"key": "good","value": ["良好","善","美好"]}],"dict": {"url": "yddict://m.youdao.com/dict?le=eng&q=good"},"webdict": {"url": "http://m.youdao.com/dict?le=eng&q=good"},"l": "EN2zh-CHS","tSpeakUrl": "XXX","speakUrl": "XXX"
}

//----更新于2022.11.19----

3.新建一个接口类,获取json文件

import retrofit2.Call;
import retrofit2.http.POST;
import retrofit2.http.Query;public interface GetResult {@POST("api")Call<TextRes> getTextRes(@Query("from") String from, @Query("to") String to,@Query("appKey") String ID, @Query("salt") String salt,@Query("sign") String sign, @Query("signType") String signType,@Query("curtime") String curtime, @Query("q") String q);}

Call<TestRes>中TestRes是JavaBean类名 

4. 新建一个接口实现类来获取Call<>

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;import retrofit2.Call;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;public class TextTranslator {String q;public TextTranslator(String s) {this.q = s;}static String APP_KEY = "你的应用ID", signType = "v3";static final String APP_SECRET = "你的应用密钥";static String BASE_URL = "https://openapi.youdao.com/";public Call<TextRes> getCall(String from, String to) {Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();final GetResult getR = retrofit.create(GetResult.class);String salt = String.valueOf(System.currentTimeMillis());String curtime = String.valueOf(System.currentTimeMillis() / 1000);String sign = getDigest(APP_KEY + truncate(q) + salt + curtime + APP_SECRET);return getR.getTextRes(from, to, APP_KEY, salt, sign, signType, curtime, q);}private static String truncate(String q) {if (q == null) {return null;}int len = q.length();return len <= 20 ? q : (q.substring(0, 10) + len + q.substring(len - 10, len));}private static String getDigest(String string) {if (string == null) {return null;}char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8','9', 'A', 'B', 'C', 'D', 'E', 'F'};byte[] btInput = string.getBytes(StandardCharsets.UTF_8);try {MessageDigest mdInst = MessageDigest.getInstance("SHA-256");mdInst.update(btInput);byte[] md = mdInst.digest();int j = md.length;char[] str = new char[j * 2];int k = 0;for (byte byte0 : md) {str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (NoSuchAlgorithmException e) {return null;}}
}

 5.更改activity_main.xml布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_marginTop="50dp"android:layout_marginStart="50dp"android:layout_marginEnd="50dp"android:orientation="vertical"tools:context=".MainActivity"><Spinnerandroid:id="@+id/lan_spinner"android:layout_width="match_parent"android:layout_height="40dp"android:layout_marginBottom="20dp"android:entries="@array/language"android:theme="@style/lan_spinner" /><LinearLayoutandroid:id="@+id/all_li"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:orientation="vertical"><EditTextandroid:id="@+id/trans"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/edit_border"android:hint="输入内容"android:textSize="25sp" /><LinearLayoutandroid:id="@+id/trans_l"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:visibility="gone"><TextViewandroid:id="@+id/block"android:layout_width="wrap_content"android:layout_height="match_parent"android:text="基本释义:"android:textSize="20sp" /><TextViewandroid:id="@+id/trans_tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#0089B3"android:textSize="25sp" /></LinearLayout><LinearLayoutandroid:id="@+id/exp_l"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:visibility="gone"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:text="拓展释义:"android:textSize="20sp" /><TextViewandroid:id="@+id/exp_tv"android:layout_width="match_parent"android:layout_height="wrap_content"android:textColor="#00A8DC"android:textSize="25sp" /></LinearLayout><Buttonandroid:id="@+id/search"android:layout_width="160dp"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:layout_gravity="center"android:text="查询"android:textSize="20sp" /></LinearLayout></LinearLayout>

6. drawable文件夹中添加edit_border.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"><corners android:radius="10dp" /><strokeandroid:width="0.8dp"android:color="@color/black" /><paddingandroid:bottom="4dp"android:left="6dp"android:right="6dp"android:top="4dp" />
</shape>

 7.在values文件夹中添加arrays.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources><string-array name="language"><item>自动检测</item><item>英文 → 中文</item><item>中文 → 英文</item><item>中文 → 日语</item><item>中文 → 韩语</item><item>中文 → 法语</item><item>中文 → 俄语</item></string-array><style name="lan_spinner" parent="Widget.AppCompat.Light.DropDownItem.Spinner"><item name="android:textSize">20sp</item><item name="paddingStart">0dp</item><item name="paddingEnd">0dp</item><item name="background">@drawable/edit_border</item></style>
</resources>

 8.更改mainactivity文件

import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;public class MainActivity extends AppCompatActivity {EditText trans;TextView transTv, expTv;Button search;LinearLayout transLi, expLi;String exp, tran, pho;String from = "auto", to = "auto", q;TextRes tr;Spinner spinner;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);init();clickAndListener();}private void init() {trans = findViewById(R.id.trans);transTv = findViewById(R.id.trans_tv);expTv = findViewById(R.id.exp_tv);search = findViewById(R.id.search);transLi = findViewById(R.id.trans_l);expLi = findViewById(R.id.exp_l);spinner = findViewById(R.id.lan_spinner);}private void clickAndListener() {search.setOnClickListener(v -> textResult());trans.addTextChangedListener(new TextWatcher() {@Overridepublic void beforeTextChanged(CharSequence s, int start, int count, int after) {}@Overridepublic void onTextChanged(CharSequence s, int start, int before, int count) {if (s.length() == 0) {transLi.setVisibility(View.GONE);expLi.setVisibility(View.GONE);}search.setVisibility(View.VISIBLE);}@Overridepublic void afterTextChanged(Editable s) {}});spinnerListener();}private void textResult() {q = trans.getText().toString().trim();TextTranslator t = new TextTranslator(q);Call<TextRes> call = t.getCall(from, to);call.enqueue(new Callback<TextRes>() {@Overridepublic void onResponse(@NonNull Call<TextRes> call, @NonNull Response<TextRes> response) {tr = response.body();if (tr != null) {int code = tr.getErrorCode();if (0 == code) {exp = tr.getExplains();tran = tr.getTrans();pho = tr.getUkPho();if (pho != null) {transTv.setText(tran + pho);} else {transTv.setText(tran);}transLi.setVisibility(View.VISIBLE);search.setVisibility(View.GONE);if (!tran.equals(exp) && exp != null) {expTv.setText(exp);expLi.setVisibility(View.VISIBLE);}} else if (113 == code) {toaPrint("请输入翻译内容");} else toaPrint("请求错误,错误码为:" + tr.getErrorCode());}}@Overridepublic void onFailure(@NonNull Call<TextRes> call, @NonNull Throwable t) {Log.i("TAG", "onFailure");toaPrint("请检查网络设置!");}});}private void toaPrint(String s) {Toast.makeText(this, s, Toast.LENGTH_SHORT).show();}private void spinnerListener() {spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {@Overridepublic void onItemSelected(AdapterView<?> parent, View view, int position, long id) {switch (position) {case 1://英文 → 中文from = "en";to = "zh-CHS";break;case 2://中文 → 英文from = "zh-CHS";to = "en";break;case 3://中文 → 日语from = "zh-CHS";to = "ja";break;case 4://中文 → 韩语from = "zh-CHS";to = "ko";break;case 5://中文 → 法语from = "zh-CHS";to = "fr";break;case 6://中文 → 俄语from = "zh-CHS";to = "ru";break;default:break;}}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});}
}

 9.在Manifest.xml中添加网络权限

<uses-permission android:name="android.permission.INTERNET"/>

 10.关于GsonFormatPlus的设置补充

4.现在就可以运行了

             

 源码下载:GitHub - Beacon0423/Androidhttps://github.com/Beacon0423/Android

欢迎批评点赞 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31354.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STRAIGHT声码器详解

转载请注明出处。 STRAIGHT自适应加权谱内插的语音转换与重构 STRAIGHT&#xff08; Speech Transformation and Representation using Adaptive Interpolation of weighted spectrum)算法&#xff08;Kawahara,1998&#xff09;&#xff0c;是一种语音信号分析、合成、修改的…

chatgpt赋能python:如何用Python挣钱:从小白到大佬的必备指南

如何用Python挣钱&#xff1a;从小白到大佬的必备指南 作为一名有10年Python编程经验的工程师&#xff0c;我深知Python的应用范围非常广泛&#xff0c;它可以为各种行业带来巨大的价值。当然&#xff0c;对于许多人来说&#xff0c;如果你是一名SEO从业者&#xff0c;也完全可…

chatgpt赋能python:如何利用Python在网上赚钱:一份SEO指南

如何利用Python在网上赚钱&#xff1a;一份SEO指南 随着互联网的快速发展和Python成为一种越来越受欢迎的编程语言&#xff0c;越来越多的人开始利用Python在网上赚取额外的收入。本篇文章将介绍一些Python工具和技术&#xff0c;以及SEO最佳实践&#xff0c;帮助你利用Python…

PHP短信验证功能

PHP阿里大鱼短信验证 第一步 登陆阿里大于注册账号&#xff0c;在用户管理中心创建应用&#xff0c;确定AppKEY和App Secret还有配置签名 第二步 在应用管理中选择SDK下载&#xff0c;或者直接点击http://download.csdn.net/detail/s371795639/9695983下载&#xff0c;免费的…

发送短信验证码 API数据接口

1.前言 此接口发送短信验证码 短信模板 参数说明: 1449978 验证码为&#xff1a;{1}为您的登录验证码&#xff0c;请于{2}分钟内填写&#xff0c;如非本人操作&#xff0c;请忽略本短信。 1449979 验证码为&#xff1a;{1}&#xff0c;您正在登录&#xff0c;若非本人操作&…

为何语言学家乔姆斯基对ChatGPT持否定态度?

本文比较了乔姆斯基关于语言知识的本质、来源和使用的理论与 GPT 的不同&#xff0c; 说明了GPT没有可解释性。 2023年3月8日著名语言学家乔姆斯基与罗伯茨&#xff08;Ian Roberts&#xff09;、瓦图穆尔&#xff08;Jeffrey Watmull&#xff09;共同在《纽约时报》发表了题为…

如何更换您的Gmail地址

在许多情况下&#xff0c;您可能需要更改您的 Gmail 地址&#xff1a;您换了工作、结婚并改了名字&#xff0c;或者您在 2003 年设置的电子邮件地址突然看起来有点累了。无论出于何种原因&#xff0c;以下是更改 Gmail 地址并确保您在此过程中不会丢失任何重要数据的方法。 创…

将163邮箱改为使用outlook软件登录的切换步骤

效果图&#xff1a; 实际操作步骤如下&#xff1a; 1. 登录163.邮箱&#xff0c;如下是使用网页版登录&#xff1b;按照下面要求&#xff0c;扫描二维码 2. 找个txt文件&#xff0c;保存此 一次性密码&#xff0c;后面步骤有用。 3.检查当前状态&#xff1b; 两个都是“已开…

Becky!客户端Hotmail/outlook邮箱设置方法

Becky!邮箱客户端是一款非常简洁好用的邮件接收发送软件。最近本软件菜单增加了对中的支持&#xff0c;感谢作者的不懈努力。 日语版本下载地址&#xff1a; http://www.rimarts.co.jp/becky-j.htm 中文菜单版本&#xff1a; http://www.zhcn.org/wp-content/plugins/download…

Gmail,qq,hotmail,163,sina等邮箱的Smtp设置

Gmail SMTP 服务器&#xff1a;smtp.gmail.com&#xff0c; SSL&#xff1a;是&#xff0c;服务器端口&#xff1a;587&#xff0c;见下图&#xff1a; Hotmail SMTP 服务器&#xff1a;smtp.live.com&#xff0c; SSL&#xff1a;是&#xff0c;服务器端口&#xff1a;587&…

凭实力破圈的狄耐克,究竟藏了多少惊喜?

你是否曾经想象这样一个场景&#xff1a; 进入社区时&#xff0c;自动识别业主身份&#xff0c;精准放行并联动家中智能场景模式。人未到&#xff0c;智先行&#xff0c;提前营造极度舒适便捷的人居环境。 进入单元楼时&#xff0c;联动电梯等候&#xff0c;无需触碰按键&…

点燃创作灵感:Prompt 实践指南揭秘!让 ChatGPT 更智能的六种策略(上)

在和 ChatGPT 对话中&#xff0c;Prompt 提示词的选择&#xff0c;如果遵循以下六种策略&#xff0c;我们将获得更好、更符合要求的回答。 这些策略&#xff0c;后几种更适合在编程调用 ChatGPT API 时使用&#xff0c;不过也适用直接和 ChatGPT 对话&#xff0c;让它更好的理解…

英伟达EditGAN:为高精度百变而生

点击上方“机器学习与生成对抗网络”&#xff0c;关注星标 获取有趣、好玩的前沿干货&#xff01; 来源 机器之心报道 编辑 杜伟 在实现复杂且高精度图像编辑效果的同时&#xff0c;EditGAN 还能保持较高的图像质量和对象身份&#xff0c;英伟达在图像处理领域果然「出手不凡」…

英伟达把P图软件GAN了

晓查 发自 凹非寺量子位 报道 | 公众号 QbitAI 英伟达的最新AI工具又让网友用户们激动了。 “我已经等不及了&#xff01;” 一位网友在看完演示视频后表示。 对于“手残党”来说&#xff0c;英伟达的EditGAN简直就是零基础P图神器。 能够高质量、高精细度地对图像进行修改&…

英伟达NVIDIA GPU 架构介绍

一、NVIDIA GPU的架构演变历史和基本概念 截止2021年&#xff0c;发布时间离我们最近的8种NVIDIA GPU微架构是&#xff1a; Tesla (特斯拉) Fermi&#xff08;费米&#xff09; Kepler&#xff08;开普勒&#xff09; Maxwell&#xff08;麦克斯韦&#xff09; Pascal&#x…

英伟达 GPU 架构简史

英伟达 GPU 架构简史 尽管近年来 Nvidia GPU 确实更频繁地成为新闻&#xff0c;但它们绝不是新事物。事实上&#xff0c;多年来&#xff0c;Nvidia GPU 已经进行了多次迭代&#xff0c;GPU 架构也取得了进步。因此&#xff0c;让我们回顾一下最近的历史&#xff0c;以了解 GPU…

英伟达创始人CEO黄仁勋:一个事实是,拥有一个可以完美执行的简单想法,有时候比拥有一个你的公司无法执行的宏伟想法更好 | 英伟达:地球上最重要的公司之一

英伟达创始人&CEO黄仁勋:一个事实是,拥有一个可以完美执行的简单想法,有时候比拥有一个你的公司无法执行的宏伟想法更好 文章目录 英伟达创始人&CEO黄仁勋:一个事实是,拥有一个可以完美执行的简单想法,有时候比拥有一个你的公司无法执行的宏伟想法更好英伟达公司…

英伟达突破万亿美元市值,创始人黄仁勋分享创业心得

你知道全球第一家市值突破万亿美元的芯片公司是哪一家吗&#xff1f;它的创始人又是怎样的一个人呢&#xff1f;今天我们就来聊聊英伟达和黄仁勋的故事。 —————————————————————————————— 英伟达&#xff08;NVIDIA Corporation&#xff09;&a…

不愁失业!英伟达 CEO 黄仁勋:“AI 让每个人都能成为程序员”

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; 你是否想过&#xff0c;AI 可以帮你圆梦程序员&#xff1f; 早些年&#xff0c;大家或许对此存在疑惑&#xff0c;但近来 AI 编程工具的涌现和升级&#xff0c;这题的答案或许是——“y…

关于英伟达数字人文章的致歉和说明

大家好&#xff0c;昨天我们发布的一篇英伟达数字人新进展的文章&#xff0c;引发了较大范围的关注和讨论。经过我们的复核及英伟达官方最新确认&#xff0c;这篇文章存在不严谨和失当之处&#xff0c;特此进行说明和致歉。 一、说明一下我们的错误。 今日英伟达官方确认&#…