- 浏览: 73336 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wangguoqing_it:
@RunWith(value = SpringJUnit4Cl ...
MyBatis简介与配置MyBatis+Spring+MySql -
pioneersun:
程序很好用,学习~~
VBA打开文件选择框、取得文件全路径与文件名 -
wxp_121:
学习一下
Android核心技术与实例详解—Android游戏开发实践—快乐数独(附完整源码) -
JonyUabka:
感谢分享,并提出些意见:
vecFile.add(subFil ...
java 遍历文件夹及其子文件夹 -
jiangshan0521:
谢谢了
android 联网技术 URLConnection HttpURLConnection使用
刷机又把数据刷没了,网络时代,数据还是和服务器同步好了。
从 http://code.google.com/p/google-api-java-client 下载了库和sample,因为此库还在更新中,文档不是很全,自己摸索了一遍,总结在下面。
访问google服务的流程:
1.使用用户名、密码获取授权字符串。
2.使用授权字符串以及其他的参数发送http请求。
3.解析响应,并处理结果。
在Android平台上第一步可以通过AccountManager服务来实现,只要有绑定的Gmail账户,就无须再次输入密码。
第二步以及第三步可以利用Google封装好的库来实现,有两个官方库可用,一个是gdata-client-java,一个是googleapi-client-java,后者是新出的库,具体该采用哪个库可以参见其Wiki根据自己的情况选择。
此处是新项目,无需考虑旧代码,所以选择了后者。
具体的流程:
1.创建一个处理HTTP发送接收的对象,通过GoogleTransport类(库提供)的静态函数create()来创建:
Java代码
mTransport = GoogleTransport.create();
HTTP发送数据需要HTTP Header,GoogleTransport对象内已经自己生成了默认的Header,但是有些成员需要设置数据。
1.1 数据交换协议版本号
Java代码
headers.gdataVersion = "2"; //Google data version
1.2 应用名,ap可以设置为自己的唯一字符串即可
Java代码
headers.setApplicationName(getString(R.string.app_name));
1.3 创建Parser用来把HTTP传送的数据转换为对象。
Java代码
AtomParser parser = new AtomParser(); //parse data from http data
parser.namespaceDictionary = Namespace.DICTIONARY;
mTransport.addParser(parser);
其中AtomParser类是库提供的,但是parser的DICTIONARY要用户定义,用来将缩写转换到url。一般可直接使用从example中复制的:
Java代码
2.获取授权字符串,大部分操作都需要在HTTP请求中包含此字符串,这个字符串是和用户名相关的。
2.1获取账户对象:
在Android中可以使用AccountManager来获取用户列表,然后由用户选择一个。
Java代码
Account对象的name成员保存了帐户名字符串,可以将这些名称形成一个列表显示到对话框中供用户选择。
当用户选择后,就可使用Account对象作为参数获取授权字符串了。
2.2获取授权字符串:
Java代码
通过AccountManager来获取授权字符串,account是账户对象,"cl"是google约定的获取calendar服务授权时的类型。
因为此步操作要进行网络通信,可能会阻塞,所以强制要求启动一个线程来进行,如果在UI线程调用会有异常出来。
另外函数返回后,结果中未必就有授权字符串,有可能会返回需要与用户交互的Intent,比如询问用户是否允许获取授权,代码要进行处理。
Java代码
此外还要处理异常,当授权过期时,那么还要通过
manager.invalidateAuthToken("com.google", this.mAuthToken);来清除cache中的授权字符串。
3.与服务器进行数据交互:
交互是通过HTTP请求及响应来进行;数据被通过xml被打包成Atom协议(http://www.ietf.org/rfc/rfc4287.txt)格式交互。
按照Atom协议格式:
Google的日历数据是以feed为根节点打包返回,每个feed又可以包含多个entry,每个entry是一个日历。
同样日历中的事件也是以feed为根节点打包返回,每个feed包含多个entry,每个entry就是日历中的一个事件。
库函数对交互过程进行了封装。包括:将函数请求转换成HTTP请求以及将返回的XML数据解析到对象。
为了能够将XML数据解析到对象,需要定义一个数据模型,这里面包含日历feed,日历entry,事件feed,事件entry等对象定义。
而这个对象是由用户定义的,那么库函数怎么知道将XML数据解析后保存到哪个数据成员呢?
跟踪了代码简单总结其机制大概为:
XML中的数据每个成员都有名字,比如<entry><link>等,按照这个名字通过Java的反射机制来查找对象中的成员名字,如果名字相符,那么就保存到此成员变量。
而成员的名字如何传递给JVM呢?则是通过了Java annotation机制来实现的,在函数库中定义了一个annotation,名字为@key,
Java代码
表示将变量var命名为content,库函数中可以获取到此附加信息,那么就会将XML中contentn成员的值解析出来保存到var中。
至于解析时如何将字符串转换成所需要的值,库函数会判断var的类型,来调用合适的生成函数。
3.1Feed基类:
根据ATOM约定,必然包含:
<id>、<title>、<updated>
一般还会包含多个<link>,所以Feed基类的成员定义如下:
Java代码
如果不关注id、title、update等信息,可以不定义这些成员。
Link也是自定义的一个类,用来存储<link>节点的信息,其成员定义如下:
Java代码
在Feed中还会包含<entry>,对于Calendar feed每个entry就是一个日历,对于Event feed每个entry就是一个事件。
由于两类entry的成员不一样,所以此处并没有包含entry成员,而是在扩展的Feed类中定义。
3.2Entry基类:
必然包含:<id>、<title>、<updated>
可能包含最多一个<content>;
可能包含最多一个<summary>
一般还会包含多个<link>;
所以Entry基类的成员定义如下:
Java代码
3.3CalendarFeed类:
Java代码
扩展出一个保存entry的列表,列表中的每项是一个entry。
3.4EventFeed类:
Java代码
3.5CalendarEntry类:
只扩展了一些操作接口。
3.6EvnentEntry类:
Java代码
扩展了一个时间属性。
4.获取日历列表并显示:
原理:向https://www.google.com/calendar/feeds/allcalendars/full发送GET请求然后解析响应。
发送时牵扯到HTTP Header生成,重定向以及把数据解析成为Java对象等操作,这些库函数都提供了接口可用。
在googleapi-client-api的例子中提供了一个model,此model对库的接口针对calendar又进行了一次封装,可以直接复制到代码中使用。
4.1 CalendarUrl类:继承自GoogleUrl,扩展了一些获取url的函数。
CalendarUrl url = CalendarUrl.forAllCalendarsFeed(); //构造获取feed的url串。如果要删除日历,那么这儿要换成forOwnCalendarsFeed(),否则删除时会返回http 500错误。
4.2 CalendarFeed类:定义了一个成员变量,是calendar的列表,通过Java Annotation,库函数可以通过反射机制取到这个变量,并将解析后的CalendarEntry填充到此列表中来。
CalendarFeed feed = CalendarFeed.executeGet(mTransport, url); //从网络获取数据并解析成feed对象。
4.3 在列表中显示:
5.获取某个日历的事件列表并显示:
向日历所保存的事件url发送get请求。
在EventFeed中保存了所有entry列表,可以通过EvnentFeed.getEntries()来获得。
6.日历操作:
6.1 添加日历:
原理:向https://www.google.com/calendar/feeds/owncalendars/full发送数据。
获取目标url:
创建新的日历对象:
设置标题:
执行插入操作:
6.2 删除日历:
原理:向calendar entry的编辑url发送HTTP DELETE请求。这个编辑url是服务器返回并被解析后保存在calendar对象中的。
获取要删除的日历对象,执行删除操作。
calendar.executeDelete(mTransport);
6.3 修改日历:
原理:向calendar entry的编辑url发送HTTP PATCH请求。
从原日历clone一个对象,然后执行patch函数。
6.4 添加事件:
原理:向所属的calendar的event feed url发送数据。
6.5 删除事件:
原理:发送DELETE请求。
event.executeDelete(mTransport);
需要注意的是执行delete时我收到的结果是403,始终不能成功删除。
以“google api client delete calendar event forbidden"搜索发现此问题别人也有遇到,查阅资料:
http://code.google.com/apis/gdata/docs/2.0/basics.html
在Deleting an entry一节提到:
To do an unconditional delete, set the following HTTP header:If-Match: *
所以需要修改executeDelete函数,补充一行:request.headers.ifMatch = "*";
正常应该是ifMatch=etag,etag的作用参见Updating an entry一节:
You also have to specify the original entry's ETag, to ensure that you don't overwrite anyone else's changes.
以上理解未必正确,如有指教可直接回复。
6.6 修改事件:
同样也要修改一下executePatchRelativeToOriginal函数,增加:
对于删除Calendar以及修改Calendar这一行加不加没影响。
仓促成文,附件的例子也有一些冗余代码未修改,日后再加工。
本文来自“http://suyuening.iteye.com/”博客,向博主学习。
从 http://code.google.com/p/google-api-java-client 下载了库和sample,因为此库还在更新中,文档不是很全,自己摸索了一遍,总结在下面。
访问google服务的流程:
1.使用用户名、密码获取授权字符串。
2.使用授权字符串以及其他的参数发送http请求。
3.解析响应,并处理结果。
在Android平台上第一步可以通过AccountManager服务来实现,只要有绑定的Gmail账户,就无须再次输入密码。
第二步以及第三步可以利用Google封装好的库来实现,有两个官方库可用,一个是gdata-client-java,一个是googleapi-client-java,后者是新出的库,具体该采用哪个库可以参见其Wiki根据自己的情况选择。
此处是新项目,无需考虑旧代码,所以选择了后者。
具体的流程:
1.创建一个处理HTTP发送接收的对象,通过GoogleTransport类(库提供)的静态函数create()来创建:
Java代码
mTransport = GoogleTransport.create();
HTTP发送数据需要HTTP Header,GoogleTransport对象内已经自己生成了默认的Header,但是有些成员需要设置数据。
1.1 数据交换协议版本号
Java代码
headers.gdataVersion = "2"; //Google data version
1.2 应用名,ap可以设置为自己的唯一字符串即可
Java代码
headers.setApplicationName(getString(R.string.app_name));
1.3 创建Parser用来把HTTP传送的数据转换为对象。
Java代码
AtomParser parser = new AtomParser(); //parse data from http data
parser.namespaceDictionary = Namespace.DICTIONARY;
mTransport.addParser(parser);
其中AtomParser类是库提供的,但是parser的DICTIONARY要用户定义,用来将缩写转换到url。一般可直接使用从example中复制的:
Java代码
public class Namespace { public static final XmlNamespaceDictionary DICTIONARY = new XmlNamespaceDictionary(); static { Map<String, String> map = DICTIONARY.namespaceAliasToUriMap; map.put("", "http://www.w3.org/2005/Atom"); map.put("atom", "http://www.w3.org/2005/Atom"); map.put("batch", "http://schemas.google.com/gdata/batch"); map.put("gAcl", "http://schemas.google.com/acl/2007"); map.put("gCal", "http://schemas.google.com/gCal/2005"); map.put("gd", "http://schemas.google.com/g/2005"); map.put("georss", "http://www.georss.org/georss"); map.put("gml", "http://www.opengis.net/gml"); map.put("openSearch", "http://a9.com/-/spec/opensearch/1.1/"); map.put("xml", "http://www.w3.org/XML/1998/namespace"); }
2.获取授权字符串,大部分操作都需要在HTTP请求中包含此字符串,这个字符串是和用户名相关的。
2.1获取账户对象:
在Android中可以使用AccountManager来获取用户列表,然后由用户选择一个。
Java代码
final AccountManager manager = AccountManager.get(this); //获取AccountManger实例 final Account[] accounts = manager.getAccountsByType("com.google"); //获取所有的google账户对象
Account对象的name成员保存了帐户名字符串,可以将这些名称形成一个列表显示到对话框中供用户选择。
当用户选择后,就可使用Account对象作为参数获取授权字符串了。
2.2获取授权字符串:
Java代码
Bundle bundle = manager.getAuthToken(account, "cl", true, null, null).getResult();
通过AccountManager来获取授权字符串,account是账户对象,"cl"是google约定的获取calendar服务授权时的类型。
因为此步操作要进行网络通信,可能会阻塞,所以强制要求启动一个线程来进行,如果在UI线程调用会有异常出来。
另外函数返回后,结果中未必就有授权字符串,有可能会返回需要与用户交互的Intent,比如询问用户是否允许获取授权,代码要进行处理。
Java代码
if (bundle.containsKey(AccountManager.KEY_INTENT)) { //需要和用户交互。使用此intent启动activity。 Intent intent = bundle.getParcelable(AccountManager.KEY_INTENT); int flags = intent.getFlags(); flags &= ~Intent.FLAG_ACTIVITY_NEW_TASK; //清除新任务标志 intent.setFlags(flags); startActivityForResult(intent, REQUEST_AUTHENTICATE); } else if (bundle.containsKey(AccountManager.KEY_AUTHTOKEN)) { //得到了key,执行login authenticatedClientLogin(bundle.getString(AccountManager.KEY_AUTHTOKEN)); }
此外还要处理异常,当授权过期时,那么还要通过
manager.invalidateAuthToken("com.google", this.mAuthToken);来清除cache中的授权字符串。
3.与服务器进行数据交互:
交互是通过HTTP请求及响应来进行;数据被通过xml被打包成Atom协议(http://www.ietf.org/rfc/rfc4287.txt)格式交互。
按照Atom协议格式:
Google的日历数据是以feed为根节点打包返回,每个feed又可以包含多个entry,每个entry是一个日历。
同样日历中的事件也是以feed为根节点打包返回,每个feed包含多个entry,每个entry就是日历中的一个事件。
库函数对交互过程进行了封装。包括:将函数请求转换成HTTP请求以及将返回的XML数据解析到对象。
为了能够将XML数据解析到对象,需要定义一个数据模型,这里面包含日历feed,日历entry,事件feed,事件entry等对象定义。
而这个对象是由用户定义的,那么库函数怎么知道将XML数据解析后保存到哪个数据成员呢?
跟踪了代码简单总结其机制大概为:
XML中的数据每个成员都有名字,比如<entry><link>等,按照这个名字通过Java的反射机制来查找对象中的成员名字,如果名字相符,那么就保存到此成员变量。
而成员的名字如何传递给JVM呢?则是通过了Java annotation机制来实现的,在函数库中定义了一个annotation,名字为@key,
Java代码
@Key("content") public String var; @Key("content") public String var;
表示将变量var命名为content,库函数中可以获取到此附加信息,那么就会将XML中contentn成员的值解析出来保存到var中。
至于解析时如何将字符串转换成所需要的值,库函数会判断var的类型,来调用合适的生成函数。
3.1Feed基类:
根据ATOM约定,必然包含:
<id>、<title>、<updated>
一般还会包含多个<link>,所以Feed基类的成员定义如下:
Java代码
@Key("id") public String id; @Key("title") public String title; @Key("updated") public String updated; @Key("link") public List<Link> links; @Key("id") public String id; @Key("title") public String title; @Key("updated") public String updated; @Key("link") public List<Link> links;
如果不关注id、title、update等信息,可以不定义这些成员。
Link也是自定义的一个类,用来存储<link>节点的信息,其成员定义如下:
Java代码
@Key("@href") public String href; @Key("@rel") public String rel; @Key("@href") public String href; @Key("@rel") public String rel;
在Feed中还会包含<entry>,对于Calendar feed每个entry就是一个日历,对于Event feed每个entry就是一个事件。
由于两类entry的成员不一样,所以此处并没有包含entry成员,而是在扩展的Feed类中定义。
3.2Entry基类:
必然包含:<id>、<title>、<updated>
可能包含最多一个<content>;
可能包含最多一个<summary>
一般还会包含多个<link>;
所以Entry基类的成员定义如下:
Java代码
@Key public String summary; @Key public String content; @Key public String id; @Key public String title; @Key public String updated; @Key("link") public List<Link> links; @Key public String summary; @Key public String content; @Key public String id; @Key public String title; @Key public String updated; @Key("link") public List<Link> links;
3.3CalendarFeed类:
Java代码
@Key("entry") public List<CalendarEntry> calendars = new ArrayList<CalendarEntry>(); @Key("entry") public List<CalendarEntry> calendars = new ArrayList<CalendarEntry>();
扩展出一个保存entry的列表,列表中的每项是一个entry。
3.4EventFeed类:
Java代码
@Key("entry") public List<EventEntry> events = new ArrayList<EventEntry>(); @Key("entry") public List<EventEntry> events = new ArrayList<EventEntry>();
3.5CalendarEntry类:
只扩展了一些操作接口。
3.6EvnentEntry类:
Java代码
@Key("gd:when") public When when; @Key("gd:when") public When when;
扩展了一个时间属性。
4.获取日历列表并显示:
原理:向https://www.google.com/calendar/feeds/allcalendars/full发送GET请求然后解析响应。
发送时牵扯到HTTP Header生成,重定向以及把数据解析成为Java对象等操作,这些库函数都提供了接口可用。
在googleapi-client-api的例子中提供了一个model,此model对库的接口针对calendar又进行了一次封装,可以直接复制到代码中使用。
4.1 CalendarUrl类:继承自GoogleUrl,扩展了一些获取url的函数。
CalendarUrl url = CalendarUrl.forAllCalendarsFeed(); //构造获取feed的url串。如果要删除日历,那么这儿要换成forOwnCalendarsFeed(),否则删除时会返回http 500错误。
4.2 CalendarFeed类:定义了一个成员变量,是calendar的列表,通过Java Annotation,库函数可以通过反射机制取到这个变量,并将解析后的CalendarEntry填充到此列表中来。
CalendarFeed feed = CalendarFeed.executeGet(mTransport, url); //从网络获取数据并解析成feed对象。
4.3 在列表中显示:
calendarNames = new String[numCalendars]; for (int i = 0; i < numCalendars; i++) { calendarNames[i] = calendars.get(i).title; //更新数组 } setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, calendarNames)); //更新列表。
5.获取某个日历的事件列表并显示:
向日历所保存的事件url发送get请求。
CalendarEntry calendar = mCalendars.get(position); CalendarUrl url = new CalendarUrl(calendar.getEventFeedLink()); //获得event url EventFeed efeed = EventFeed.executeGet(mTransport, url); //发送请求,从网络获得event feed
在EventFeed中保存了所有entry列表,可以通过EvnentFeed.getEntries()来获得。
6.日历操作:
6.1 添加日历:
原理:向https://www.google.com/calendar/feeds/owncalendars/full发送数据。
获取目标url:
CalendarUrl url = CalendarUrl.forOwnCalendarsFeed();
创建新的日历对象:
CalendarEntry ncalendar = new CalendarEntry();
设置标题:
ncalendar.title = "Calendar " + new DateTime(new Date());
执行插入操作:
ncalendar.executeInsert(mTransport, url);
6.2 删除日历:
原理:向calendar entry的编辑url发送HTTP DELETE请求。这个编辑url是服务器返回并被解析后保存在calendar对象中的。
获取要删除的日历对象,执行删除操作。
calendar.executeDelete(mTransport);
6.3 修改日历:
原理:向calendar entry的编辑url发送HTTP PATCH请求。
从原日历clone一个对象,然后执行patch函数。
CalendarEntry patchedCalendar = calendar.clone(); //modify patchedCalendar.title = calendar.title + " UPDATED " + new DateTime(new Date()); //更新到网络 patchedCalendar.executePatchRelativeToOriginal(mTransport, calendar);
6.4 添加事件:
原理:向所属的calendar的event feed url发送数据。
event = new EventEntry(); event.title = "title"; When when = new When(); when.startTime = new DateTime(new Data()); event.when = when; CalendarUrl url = new CalendarUrl(calendar.getEventFeedLink()); event.executeInsert(mTransport, url);
6.5 删除事件:
原理:发送DELETE请求。
event.executeDelete(mTransport);
需要注意的是执行delete时我收到的结果是403,始终不能成功删除。
以“google api client delete calendar event forbidden"搜索发现此问题别人也有遇到,查阅资料:
http://code.google.com/apis/gdata/docs/2.0/basics.html
在Deleting an entry一节提到:
To do an unconditional delete, set the following HTTP header:If-Match: *
所以需要修改executeDelete函数,补充一行:request.headers.ifMatch = "*";
正常应该是ifMatch=etag,etag的作用参见Updating an entry一节:
You also have to specify the original entry's ETag, to ensure that you don't overwrite anyone else's changes.
以上理解未必正确,如有指教可直接回复。
6.6 修改事件:
event.executePatchRelativeToOriginal(mTransport, event);
同样也要修改一下executePatchRelativeToOriginal函数,增加:
request.headers.ifMatch = "*";
对于删除Calendar以及修改Calendar这一行加不加没影响。
仓促成文,附件的例子也有一些冗余代码未修改,日后再加工。
本文来自“http://suyuening.iteye.com/”博客,向博主学习。
发表评论
-
适合开发的Android手机推荐
2011-03-14 13:05 1766很多网友表示想购买一款适合开发的Android手机,今天And ... -
【Android2D游戏开发之四】Android 游戏框架(一个游戏角色在屏幕行走的demo)
2011-01-17 15:58 1259Himi 原创, 转载请注明! 谢谢。 原文地址: h ... -
【Android2D游戏开发之三】剖析 SurfaceView ! Callback以及SurfaceHolder!!
2011-01-17 15:55 1060Himi 原创, 转载请注明! 谢谢。 原文地址: h ... -
【Android2D游戏开发之二】剖析游戏开发用view还是sarfaceView ?!
2011-01-17 15:53 1285Himi 原创, 转载请注明! 谢谢。 原文地址: h ... -
【Android2D游戏开发之一】设置全屏以及绘画简单的图形
2011-01-17 15:50 883原文地址:http://blog.csdn.net/xiaom ... -
Android adb的使用略解
2011-01-06 13:47 1059安卓网的一个帖子,写得不错,记下来分享给大家。 ADB全 ... -
Android开发者实用代码片段 与大家分享
2011-01-05 13:46 758Android很有用的代码片段 1:查看是否有存储卡插入 ... -
DownloadManager下载管理类2.3新增API介绍
2011-01-05 13:30 1169从Android 2.3开始新增了一个下载管理类,在SDK的文 ... -
Android核心技术与实例详解—Android游戏开发实践—快乐数独(附完整源码)
2010-12-29 13:05 3547益智类游戏是一种比较 ... -
android 联网技术 URLConnection HttpURLConnection使用
2010-12-28 11:16 39161. 使用 标准Java接口: 设计的类: java.net. ...
相关推荐
Google APIs Client Library for Java 是一套强大的工具,它允许开发者轻松地与Google的各种API进行交互,包括Google Drive、Google Calendar、Google Maps等。这个库为Java开发者提供了简单易用的接口,使他们能够...
农历生日 for Google calendar 农历生日是用来同步农历生日到 Google 日历, 因为 Google 日历不能创建农历重复事件. ...Google API Client Library for Java Lunar-Solar-Calendar-Converter License MIT
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
Java二进制IO类与文件复制操作实例 16个目标文件 内容索引:Java源码,初学实例,二进制,文件复制 Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
google-api-translate-java(Java 语言对Google翻译引擎的封装类库) 语音识别程序 SpeechLion.tar SpeechLion 是一个语音识别程序,主要用来处理桌面命令,基于 Sphinx-4 语音识别引擎开发。用户可以通过该软件来...
4. **日期与时间处理**:熟悉Java或Kotlin中的日期时间API,如java.util.Calendar或java.time包,用于计算和展示生日。 5. **通知服务**:实现AlarmManager和NotificationCompat库来设置生日提醒,发送系统通知。 ...
5. **API集成**:考虑到会议管理可能涉及到邮件邀请、日历同步等功能,应用可能集成了Google Calendar API或其他第三方服务的API。 6. **华为AnyOffice兼容性**:既然在华为的比赛中获奖,应用可能特别优化了对华为...