您的位置:首页 > 移动开发 > Android开发

Android 应用 Auto Silent Pro 开发经验

2011-08-14 10:16 267 查看
本文作者是 Peter Chou,本文已经参加:第二届Google 暑期大学生博客分享大赛 - 2011 Android 成长篇

我是一名学生,我在平时的学习生活中遇到了一个问题。有时我上课时会忘记使手机进入静音状态,然后上课的时候有短信或是电话来时就会很尴尬,几十号人啊,刷的一下就全看过来了……有时候我上课时记得把手机调为静音了,可下课的时候我又忘了把手机调为正常状态了,于是下课后我容易忽略掉短信……

我那时就想,我能不能做个自动静音的程序呢?刚好我手机是 Android 手机,我平时的日程安排都是 Google Calendar,其中就包含了我的课程安排。于是我就想到利用 Google Calendar 的上面的日程事件的时间信息,来让手机在上课时进入静音状态,下课的时候自动退出静音状态,又加上 Google Calendar 的管理的方便性,我想这样的一个软件应该会很实用。于是我就开始开发
Auto Silent Pro 这样一个自动静音应用了。
我想这样一个应用主要的两大部分是:1. Google Calendar 的日程事件的时间数据的获取 2.获取时间后让手机进入或退出静音状态。获取 Google Calendar 的数据的方法无非有两个,一是从 Google 的服务器上获取,二是读取手机上已有的数据。考虑到手机上已经有 Google Calendar 的数据,直接从手机上读取有着方便性,还可以节省流量,所以就选择了后者。
获取 Google Calendar 的数据不像获取联系人和短信等数据那样,官方有文档,而这是官方不支持的。于是我就在网上查了很久,最后终于查到一个比较靠谱的,http://jimblackler.net/blog/?p=151,这网页上面写得很清楚,我就不粘贴代码了,唯一注意的是一定要添加android.permission.READ_CALENDAR
在 AndroidManifest.xml 里。不过想起来,有的日程事件不是上课,就没有必要设默认静音。然后我就想到 Google Calendar 在新建每个 event 的时候,都会有两个选择,Busy 和 Available。如果选Busy 的时候,就表示你很忙,需要静音,选 Available 的时候,就表示不需要静音,这样岂不是很好?但是,这个 Busy 和 Available 具体又对应 Google Calendar
的数据库的哪个字段呢?然后我看了看 android.provider 里面的 Calendar.java 源码,源码里面有一个字段的注释让我觉得有点靠谱,“transparency”,注释是:Transparency for the
event-- does the event consume time on the calendar?,嗯,就是它了。后来我有点不确定,自己实际试了试,新建两个 event,一个选 Busy,一个选Available,然后用 Root Explorer 实际看这两个 event 的 transparency 字段值,发现就是这个字段。OK!
第一步已经完成的差不多了,现在就是让手机在 event 开始时间进入静音状态,在 event 结束时间退出静音状态。我一开始用的是 Java 的 Timer 类,让它在规定的时间帮我实现功能,可是我用 Timer 类写好后发现一个问题,event 在开始时能够进入静音状态,但过了好久到该退出的时候,它没有退出。我后来想了想,应该是 Android 的资源管理机制把我的
Timer 给杀掉了,然后我最后又开后台进程(提高优先级,防止被杀),里面再用 Timer,发现还是被杀。这可怎么办?我后来上网查了查,发现 Android 有一个 AlarmManager,这是系统级的服务,不会被杀,经常被开发者用来开发闹铃等定时类的应用。于是,我就开始用 AlarmManager 重写……
这是用 AlarmManager 的部分实现代码:

Intent beforeIntent = new Intent("com.peterchou.autosilentpro.before_alarm_action");//用特定字符串标识这个 intent
beforeIntent.putExtra(ApplicationSettings.EVENT_ID, event.getId());//这个 event 的特定 id 放入 intent 的 extra 里面
PendingIntent beforePI = PendingIntent.getBroadcast(context, event.getId(), beforeIntent,
PendingIntent.FLAG_UPDATE_CURRENT);/*初始化 PendingIntent,注意最后一个参数一定要设置为 PendingIntent.FLAG_UPDATE_CURRENT,否则 intent 里面的 extra 取不出来*/
alarms.set(alarmType, startTime.getTimeInMillis(), beforePI);//设置 Alarm
到了开始时间,系统的 AlarmManager 服务就会发出上面的 intent,只要在 AndroidManifest.xml 里面注册一个接收器,接收器再使手机进入静音状态就可以。接收器的注册代码如下:

<receiver android:name=".BeforeAlarmReceiver">
<intent-filter>
<action android:name="com.peterchou.autosilentpro.before_alarm_action"></action>
</intent-filter>
</receiver>


然后就是设置手机进入静音状态了,这一部分比较简单,代码如下:

AudioManager audioManager = (AudioManager) context.getSystemService(context.AUDIO_SERVICE);//得到系统 AlarmManager 的句柄
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);//设置手机为静音状态


让手机退出静音状态和上面的方法差不多,就不一一赘述了。

话不多说,让读者看看我的应用截图。



这是进入静音状态前的截图,“A” 表示此事件自动静音功能开启。



进入静音状态,“E”表示是 ”Enter“的缩写,表示进入。



退出静音状态,“F”表示结束,退出之意。

有了这个软件,我的上课静音,下课退出静音就是全自动的了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: