前言

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

开发前准备

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

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

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

新建好的工程目录如下:

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

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

请求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块的体验金,其收费标准如下:

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

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

插件开发

首先新建一个Action文件:

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

上图中我们把新加的翻译按钮放在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命令下:

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

一切正常,接下来我们继续往下接入翻译。@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);

}

});

}

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

汉译英:

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

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

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

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

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

  1. 简单Android app开发_什么方法开发APP最简单?试试0代码开发平台

    开发APP有哪些方式? 说到开发APP,那肯定是找外包公司最方便,只用花钱就能坐等APP完成.但是,现在需要开发APP的公司范围越来越广,传统外包公司高昂的费用显然已经不能普罗大众,那么,有没有简单便 ...

  2. android sdk 2.9.5.0,如何找到问题Android SDK 3.0错误:(9,5)错误:资源android:attr/colorError未找到...

    当我做一个make时如何找到此错误的问题我收到此错误消息: 错误:(9,5)错误:找不到资源android:attr / colorError 奇怪的是我有2个build.gradle文件: 这里是我 ...

  3. 【Android系列1.0 驱动开发 --- Linux 驱动 内核】

    参考文档 Context 当探索Binder机制,引出很多Linux相关概念.说Binder是驱动程序,Binder用了内存共享.匿名内存共享. Binder由 Client.Service.Serv ...

  4. Android蓝牙4.0 BLE开发坑总结

    onServicesDiscovered 回调里不能直接执行 write /readDataFromCharacteristic() 或者 enableNotificationOfCharacteri ...

  5. Android中ICS4.0源码Launcher启动流程分析【android源码Launcher系列一】

    最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程.Launcher其实是贯彻于手机的整个系统的,时时刻刻都在 ...

  6. 微信公众平台开发三:微信的OAuth2.0登录开发

    1. 微信支付项目三:实现微信OAuth2.0一键登录开发 文章目录 1. 微信支付项目三:实现微信OAuth2.0一键登录开发 2. 登录方式的优缺点和微信一键登录 3. 微信登录步骤 4. 微信一 ...

  7. android sdk 8.1.0,OneAPM版本更新:Android SDK 1.0.8

    [导读]OneAPM推出新一代移动端性能监控产品Mobile Insight, 能够帮助企业实时监测移动应用的真实用户体验,实现端到端的应用性能分析.并且Mi可以深入到代码级进行应用性能问题剖析,通过 ...

  8. Android Retrofit 2.0(三)从源码分析原理

    Retrofit·特点 性能最好,处理最快 使用REST API时非常方便: 传输层默认就使用OkHttp: 支持NIO: 拥有出色的API文档和社区支持 速度上比volley更快: 如果你的应用程序 ...

  9. Android(Lollipop/5.0) Material Design(六) 使用图像

    Material Design列 Android(Lollipop/5.0) Material Design(一) 简单介绍 Android(Lollipop/5.0) Material Design ...

  10. DXBBS V8.0 BBS论坛系统 简体中文正式版 [ 开发语言:ASP.NET 2.0 (C#) ]

    DXBBS V8.0 BBS论坛系统 简体中文正式版 [ 开发语言:ASP.NET 2.0 (C#) ] 程序版本:DXBBS V8.0 ACCESS/MSSQL版 开发语言:ASP.NET 2.0 ...

最新文章

  1. LSASRV事件ID:40960
  2. ABP官方文档翻译 6.1.3 异常处理
  3. MySQL系列:innodb源代码分析之线程并发同步机制
  4. python:程序猿的方式在元宵佳节之际,带你设计【东方明珠】动画浪漫烟花秀(python编程利用Tkinter+PIL库)
  5. java-多线程操作全(Thread)-Timer简单使用
  6. 【最全资料下载】Kubernetes and Cloud Native Meetup (北京站)
  7. 【算法】异或 偶数数组中找到一个唯一奇数
  8. PHP心脏装置,“人工心脏”不再科幻 “钢铁侠”已成现实
  9. Sudo bug 可导致非权限 Linux 和 MacOS 用户以根身份运行命令
  10. android 4.2.1短信接收以及应用接收顺序
  11. WebKit新特性WebGL
  12. 计算机二级office公共基础知识思维导图-数据结构
  13. 粒子群优化算法(PSO)python实践
  14. 分布式架构网络通信——netty
  15. python股票查询系统_使用Python查询股票所属行业
  16. 博士申请 | 南方科技大学NCC Lab刘泉影教授招收深度学习方向全奖博士生
  17. 202109青少年软件编程(Python)等级考试(五级编程题)
  18. springboot--入门程序实现CRUD操作
  19. 2017年闰秒linux,6月30日将迎来人类迎来史上第26次闰秒可引起部分linux系统重启...
  20. wifi认证源码html,openwrt 实现本地wifidog简单认证,认证端纯html

热门文章

  1. 事件驱动的选股小工具(JQData)
  2. JGit 通过SSH访问Git仓库报Auth fail
  3. OpenCV开发笔记(一):OpenCV介绍、编译
  4. LVGL7.0设置界面背景
  5. 五、工厂模式—旅行的钱怎么来 #和设计模式一起旅行#
  6. 左连接/右连接 实例
  7. 重复造轮子系列——基于FastReport设计打印模板实现桌面端WPF套打和商超POS高度自适应小票打印...
  8. 「Medical Image Analysis」Note on XNet
  9. 现代计算机接口实验笔记
  10. 动物专家识别系统(Java)