开发一款Android插件,从0开始,开发一款属于自己的Android Studio插件
前言
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插件相关推荐
- 简单Android app开发_什么方法开发APP最简单?试试0代码开发平台
开发APP有哪些方式? 说到开发APP,那肯定是找外包公司最方便,只用花钱就能坐等APP完成.但是,现在需要开发APP的公司范围越来越广,传统外包公司高昂的费用显然已经不能普罗大众,那么,有没有简单便 ...
- android sdk 2.9.5.0,如何找到问题Android SDK 3.0错误:(9,5)错误:资源android:attr/colorError未找到...
当我做一个make时如何找到此错误的问题我收到此错误消息: 错误:(9,5)错误:找不到资源android:attr / colorError 奇怪的是我有2个build.gradle文件: 这里是我 ...
- 【Android系列1.0 驱动开发 --- Linux 驱动 内核】
参考文档 Context 当探索Binder机制,引出很多Linux相关概念.说Binder是驱动程序,Binder用了内存共享.匿名内存共享. Binder由 Client.Service.Serv ...
- Android蓝牙4.0 BLE开发坑总结
onServicesDiscovered 回调里不能直接执行 write /readDataFromCharacteristic() 或者 enableNotificationOfCharacteri ...
- Android中ICS4.0源码Launcher启动流程分析【android源码Launcher系列一】
最近研究ICS4.0的Launcher,发现4.0和2.3有稍微点区别,但是区别不是特别大,所以我就先整理一下Launcher启动的大致流程.Launcher其实是贯彻于手机的整个系统的,时时刻刻都在 ...
- 微信公众平台开发三:微信的OAuth2.0登录开发
1. 微信支付项目三:实现微信OAuth2.0一键登录开发 文章目录 1. 微信支付项目三:实现微信OAuth2.0一键登录开发 2. 登录方式的优缺点和微信一键登录 3. 微信登录步骤 4. 微信一 ...
- android sdk 8.1.0,OneAPM版本更新:Android SDK 1.0.8
[导读]OneAPM推出新一代移动端性能监控产品Mobile Insight, 能够帮助企业实时监测移动应用的真实用户体验,实现端到端的应用性能分析.并且Mi可以深入到代码级进行应用性能问题剖析,通过 ...
- Android Retrofit 2.0(三)从源码分析原理
Retrofit·特点 性能最好,处理最快 使用REST API时非常方便: 传输层默认就使用OkHttp: 支持NIO: 拥有出色的API文档和社区支持 速度上比volley更快: 如果你的应用程序 ...
- Android(Lollipop/5.0) Material Design(六) 使用图像
Material Design列 Android(Lollipop/5.0) Material Design(一) 简单介绍 Android(Lollipop/5.0) Material Design ...
- 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 ...
最新文章
- LSASRV事件ID:40960
- ABP官方文档翻译 6.1.3 异常处理
- MySQL系列:innodb源代码分析之线程并发同步机制
- python:程序猿的方式在元宵佳节之际,带你设计【东方明珠】动画浪漫烟花秀(python编程利用Tkinter+PIL库)
- java-多线程操作全(Thread)-Timer简单使用
- 【最全资料下载】Kubernetes and Cloud Native Meetup (北京站)
- 【算法】异或 偶数数组中找到一个唯一奇数
- PHP心脏装置,“人工心脏”不再科幻 “钢铁侠”已成现实
- Sudo bug 可导致非权限 Linux 和 MacOS 用户以根身份运行命令
- android 4.2.1短信接收以及应用接收顺序
- WebKit新特性WebGL
- 计算机二级office公共基础知识思维导图-数据结构
- 粒子群优化算法(PSO)python实践
- 分布式架构网络通信——netty
- python股票查询系统_使用Python查询股票所属行业
- 博士申请 | 南方科技大学NCC Lab刘泉影教授招收深度学习方向全奖博士生
- 202109青少年软件编程(Python)等级考试(五级编程题)
- springboot--入门程序实现CRUD操作
- 2017年闰秒linux,6月30日将迎来人类迎来史上第26次闰秒可引起部分linux系统重启...
- wifi认证源码html,openwrt 实现本地wifidog简单认证,认证端纯html