开发一款Android插件,从0开始,开发一款属于自己的Android Studio插件

本文介绍了开发Android翻译插件的过程。先推荐常用插件,接着说明开发前准备,包括安装Intellij IDE和配置project SDK,还需在有道智云注册申请服务。阐述翻译原理后,进入开发阶段,新建Action文件,获取鼠标选择单词,接入有道翻译API,最后导出插件jar包安装到Android Studio。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

AS插件绝对是我们开发道路上的一把利器,这里首先推荐几款我常用的插件。

f81d58623afa3f03db07df9eceac2e42.png

开发前准备

工欲善其事,必先利其器。首先我们要先准备IDE,这里使用 Intellij,我下载的Community版。

安装完毕后,新建一个插件开发工程:

449a6df91d1517722b68c8387bc37630.png

关于project SDK,要说一下。如果没有sdk,就点击New,选择软件附带的,但是这里可能会提示没有Java jdk,在自己本机上,随便找一个版本的jdk就行,我用的1.8。

新建好的工程目录如下:

ef8b90d37772a4fb34f489d58d4956ed.png

我们接下来模仿ECTranslation写一个翻译插件,因为原理简单,使用方便,实现起来很容易。大家如果看明白原理,都可以自己动手做一个。

因为要用到有道翻译的API,所以我们要先在有道智云上注册开发者,注册完申请自然语言翻译服务,创建应用。

ee0114780d261e7a42118ecd7fac82b4.png

请求API的过程有道翻译已经给我们准备好了Demo

我直接贴出来Java的请求过程:public class Demo {

public static void main(String[] args) throws Exception {

String appKey ="您的appKey";

String query = "good";

String salt = String.valueOf(System.currentTimeMillis());

String from = "EN";

String to = "zh-CHS";

String sign = md5(appKey + query + salt+ "您的密钥");

Map params = new HashMap();

params.put("q", query);

params.put("from", from);

params.put("to", to);

params.put("sign", sign);

params.put("salt", salt);

params.put("appKey", appKey);

System.out.println(requestForHttp("https://openapi.youdao.com/api", params));

}

public static String requestForHttp(String url,Map requestParams) throws Exception{

String result = null;

CloseableHttpClient httpClient = HttpClients.createDefault();

/**HttpPost*/

HttpPost httpPost = new HttpPost(url);

List params = new ArrayList();

Iterator> it = requestParams.entrySet().iterator();

while (it.hasNext()) {

Entry en = it.next();

String key = en.getKey();

String value = en.getValue();

if (value != null) {

params.add(new BasicNameValuePair(key, value));

}

}

httpPost.setEntity(new UrlEncodedFormEntity(params,"UTF-8"));

/**HttpResponse*/

CloseableHttpResponse httpResponse = httpClient.execute(httpPost);

try{

HttpEntity httpEntity = httpResponse.getEntity();

result = EntityUtils.toString(httpEntity, "utf-8");

EntityUtils.consume(httpEntity);

}finally{

try{

if(httpResponse!=null){

httpResponse.close();

}

}catch(IOException e){

e.printStackTrace();

}

}

return result;

}

/**

* 生成32位MD5摘要

*@param string

*@return

*/

public static String md5(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'};

try{

byte[] btInput = string.getBytes("utf-8");

/** 获得MD5摘要算法的 MessageDigest 对象 */

MessageDigest mdInst = MessageDigest.getInstance("MD5");

/** 使用指定的字节更新摘要 */

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 | UnsupportedEncodingException e){

return null;

}

}

/**

* 根据api地址和参数生成请求URL

*@param url

*@param params

*@return

*/

public static String getUrlWithQueryString(String url, Map params) {

if (params == null) {

return url;

}

StringBuilder builder = new StringBuilder(url);

if (url.contains("?")) {

builder.append("&");

} else {

builder.append("?");

}

int i = 0;

for (String key : params.keySet()) {

String value = params.get(key);

if (value == null) { // 过滤空的key

continue;

}

if (i != 0) {

builder.append('&');

}

builder.append(key);

builder.append('=');

builder.append(encode(value));

i++;

}

return builder.toString();

}

/**

* 进行URL编码

*@param input

*@return

*/

public static String encode(String input) {

if (input == null) {

return "";

}

try {

return URLEncoder.encode(input, "utf-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return input;

}

}

原理

开发前,先讲下翻译的原理。整个翻译的过程很简单,获取鼠标选择的单词,调用翻译API,整理翻译结果并显示。

这里使用的是有道翻译的API,新版有道智云的自然语言翻译API已经不免费了,不过用户注册以后会送100块的体验金,其收费标准如下:

64dd6c1ad4bee677977ae445a48bf7c5.png

如果是我们自己个人使用,100块也足够我们折腾了。

接下来进入正式的开发过程。

插件开发

首先新建一个Action文件:

37b45e4b050da75e36db3924bd76c146.png

然后填入Action ID、Class Name、快捷键:

0d392c32d5a3ada6ab8ee3345bc4ebfc.png

上图中我们把新加的翻译按钮放在Edit命令下,命令的名字叫translation,快捷键是Alt+E。

确定以后,看一眼plugin.xml里多了这样一段代码:

这是我们新建的翻译Action对应的配置文件。

看一眼新建的ZTTranslation类:public class ZTTranslation extends AnAction {

@Override

public void actionPerformed(AnActionEvent e) {

// TODO: insert action logic here

}

}

接下来我们要获取鼠标选择的单词并弹框显示:public class ZTTranslation extends AnAction {

@Override

public void actionPerformed(AnActionEvent e) {

final Editor mEditor = e.getData(PlatformDataKeys.EDITOR);

if (null == mEditor) {

return;

}

SelectionModel model = mEditor.getSelectionModel();

final String selectionTxt = model.getSelectedText();

if (TextUtils.isEmpty(selectionTxt)) {

return;

}

Messages.showMessageDialog(selectionTxt,"TestWord",Messages.getInformationIcon());

}

}

运行一下看看效果。

运行以后会重新打开一个新窗口,随便新建一个工程,看下Edit命令下:

71b0479821b1f673956ce8df089bb15e.png

我们新建的Translation在第一行,下面测试下,选择单词:

fa28d2f52d279f53d1820157195c8f00.png

一切正常,接下来我们继续往下接入翻译。@Override

public void actionPerformed(AnActionEvent e) {

final Editor mEditor = e.getData(PlatformDataKeys.EDITOR);

if (null == mEditor) {

return;

}

SelectionModel model = mEditor.getSelectionModel();

final String selectionTxt = model.getSelectedText();

if (TextUtils.isEmpty(selectionTxt)) {

return;

}

//调用有道翻译Demo

String result = HttpUtils.findTranslation(selectionTxt);

StringBuilder sb = buildResult(result);

String translation;

if (sb.length() == 0) {

translation = "暂无此翻译!";

} else {

translation = sb.toString();

}

showTranslationPopup(mEditor, translation);

}

HttpUtils.findTranslation(selectionTxt)就是上面我贴出来的有道官网上的请求Demo,然后将返回的字符串按照设计的思路重新排版一下,翻译请求的返回结果示例如下:{

"errorCode":"0",

"query":"good", //查询正确时,一定存在

"translation": [ //查询正确时一定存在

"好"

],

"basic":{ // 有道词典-基本词典,查词时才有

"phonetic":"gʊd"

"uk-phonetic":"gʊd" //英式发音

"us-phonetic":"ɡʊd" //美式发音

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

}

我这里只取了“explains”的翻译结果,然后弹出一个popup显示:private void showTranslationPopup(final Editor editor, final String result) {

ApplicationManager.getApplication().invokeLater(new Runnable() {

@Override

public void run() {

JBPopupFactory factory = JBPopupFactory.getInstance();

factory.createHtmlTextBalloonBuilder(result, null, new JBColor(new Color(186, 238, 186), new Color

(73, 117, 73)), null).setFadeoutTime(5000).createBalloon().show(factory

.guessBestPopupLocation(editor), Balloon.Position.below);

}

});

}

然后再运行看看,英译汉:

4361bbfdbf5894fc99ae0e73ab7ba7ed.png

汉译英:

12e0e08c9a43df941333cabe0397e43e.png

这里只是一个练习的例子,所以没考虑更多细节,不过以后看源码应付下生僻单词还是很给力的,哈哈。

最后就是到处插件jar包,运行到我们的Android Studio上去。

55671524fa614a4a2091fe39bab7be2d.png

63f4521af06b3d0cb87e2135b36cabf8.png

插件zip包就导出到工程路径下了,然后我们赶紧打开AS安装插件试试。

bddb7cf5bd1e314b2ea09ba6e83cfc27.png

安装完成以后重启AS就可以了。

9f4287674abd58d195fedc74d0f95557.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值