锁定老帖子 主题:Android试手——Dota铃声
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-23
手滑先发到博客频道了。。不知道现在这样算不算重复发帖。。……罪过 前段时间在论坛上看到一个帖子,说了一个关于短信dota铃声的主意,正好自己在学习Android,就当试手做了一下,拿来分享一下,因为功力还非常浅,还希望大家多给提点意见,不管是从代码规范也好,实现方式也好。 程序主要功能是在短信来时播放超神(Holy Shit)的音效,并且在一定时间内如果继续有短信,则会继续播放Holy Shit Double Kill,Holy Shit Triple Kill。。。程序界面上就放了3个按钮,分别是用于启用,停止和设置间隔时间的,原来想稍微弄点图片美化下,后来也没弄 整个程序的逻辑是非常简单的,只是开启一个Service监听短信的事件,在短信到达后进行声音播放的处理,牵涉到的主要是Service,Broadcast,MediaPlayer,还有为了设置间隔时间还用了最简单的Preference。 为了让帖子不显得太简陋,贴上一些简单的代码,程序有3个类,分别是主程序Activity,后台跑的Service,以及设置用的PreferenceActivity Activity中没有什么特别的地方,就是为3个Button设置了相应的事件
startButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Toast.makeText(DotaBellActivity.this, "start", Toast.LENGTH_SHORT).show(); Intent serviceIntent=new Intent(); serviceIntent.setClass(DotaBellActivity.this, BellService.class); startService(serviceIntent); } }); endButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Toast.makeText(DotaBellActivity.this, "end", Toast.LENGTH_SHORT).show(); //停止服务 Intent serviceIntent=new Intent(); serviceIntent.setClass(DotaBellActivity.this, BellService.class); stopService(serviceIntent); } }); configButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Toast.makeText(DotaBellActivity.this, "config", Toast.LENGTH_SHORT).show(); Intent preferenceIntent=new Intent(); preferenceIntent.setClass(DotaBellActivity.this, BellConfigPreference.class); startActivity(preferenceIntent); } }); Service中就是主要的一些处理部分,包含了存放铃声的Map和播放铃声等逻辑处理,第一次做的时候由于是采用MediaPlayer来播放,出现了用户多媒体声音关闭时候没有效果的情况,后来通过AudioManager来暂时打开多媒体声音,播放完再关闭解决了这一问题。
//播放音效 private void playBell(Context context, int num) { //为防止用户当前模式关闭了media音效 先将media打开 am=(AudioManager)getSystemService(Context.AUDIO_SERVICE);//获取音量控制 currentMediaStatus=am.getStreamVolume(AudioManager.STREAM_MUSIC); currentMediaMax=am.getStreamMaxVolume(AudioManager.STREAM_MUSIC); am.setStreamVolume(AudioManager.STREAM_MUSIC, currentMediaMax, 0); //创建MediaPlayer 进行播放 MediaPlayer mp = MediaPlayer.create(context, getBellResource()); mp.setOnCompletionListener(new musicCompletionListener()); mp.start(); } private class musicCompletionListener implements OnCompletionListener { @Override public void onCompletion(MediaPlayer mp) { //播放结束释放mp资源 mp.release(); //恢复用户之前的media模式 am.setStreamVolume(AudioManager.STREAM_MUSIC, currentMediaStatus, 0); } } //获取当前应该播放的铃声 private int getBellResource() { //判断时间间隔(毫秒) int preferenceInterval; long interval; Date curTime = new Date(System.currentTimeMillis()); interval=curTime.getTime()-lastSMSTime.getTime(); lastSMSTime=curTime; preferenceInterval=getPreferenceInterval(); if(interval<preferenceInterval*60*1000&&!justStart){ currentBell++; if(currentBell>5){ currentBell=5; } }else{ currentBell=1; } justStart=false; return bellMap.get(currentBell); } //获取Preference设置 private int getPreferenceInterval(){ SharedPreferences settings = PreferenceManager.getDefaultSharedPreferences(this); int interval=Integer.valueOf(settings.getString("interval_config", "5")); // Log.v("COOKIE", "interval: "+interval); return interval; } Preference中就没有逻辑代码,都通过xml文件搞定了
附上工程以及apk文件(其实工程里也有),个人觉得像自己经常打游戏忘了回短信之类的。。猛的holyshit一下还是可以提提神的 同时也希望通过交流认识更多的朋友,不管是Android,java,C#,甚至前端等等,本人患严重拖延症,一个人就容易闲下来,所以希望更多的学习碰撞可以让自己一直保持热情,上述的小程序也当是给征友找伙伴投石问路,如果达人们愿意平时指导指导小弟,交流交流技术,可以短消息联系,大家共同进步。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-08-26
程序虽然简单,功能却比较实用,代码写的比较规范,有一个小小的建议:
if(interval<preferenceInterval*60*1000&&!justStart){ 这里最好把60和1000拿出来,作为一个常量进行定义 |
|
返回顶楼 | |
发表时间:2011-08-26
kill_all 写道 程序虽然简单,功能却比较实用,代码写的比较规范,有一个小小的建议:
if(interval<preferenceInterval*60*1000&&!justStart){ 这里最好把60和1000拿出来,作为一个常量进行定义 收到~ 非常感谢 |
|
返回顶楼 | |
发表时间:2011-08-26
LZ你好,android我是初学,看了你的源码,还有好多还是不懂,还请指教:
1,dotabellactivity里的 protected void onDestroy() { super.onDestroy(); android.os.Process.killProcess(android.os.Process.myPid()); },这个函数的作用是什么? 2,设置里的三分钟,五分钟和十分钟在代码中哪里体现,我表示一直没看出来。 3,为什么不直接用系统铃声而用多媒体声音呢?我在测试时都是多媒体铃声响了一遍,然后是系统铃声又叫一遍。 以上是我的一点疑惑,可能表达不是很清楚,请见谅。在此跪谢~~~ |
|
返回顶楼 | |
发表时间:2011-08-27
呵呵~~不错
配个背景图片就好了~~ |
|
返回顶楼 | |
发表时间:2011-08-29
ethenlong 写道 LZ你好,android我是初学,看了你的源码,还有好多还是不懂,还请指教:
1,dotabellactivity里的 protected void onDestroy() { super.onDestroy(); android.os.Process.killProcess(android.os.Process.myPid()); },这个函数的作用是什么? 2,设置里的三分钟,五分钟和十分钟在代码中哪里体现,我表示一直没看出来。 3,为什么不直接用系统铃声而用多媒体声音呢?我在测试时都是多媒体铃声响了一遍,然后是系统铃声又叫一遍。 以上是我的一点疑惑,可能表达不是很清楚,请见谅。在此跪谢~~~ 1 这个是网上搜来的 在退出应用的时候将自身进程结束掉 当时似乎是因为没这么写 点了解除绑定以后退出发现服务里仍然有进程跑着 导致铃声依旧被启用着的关系 2 设置3分钟5分钟10分钟是在preference里 这里没在代码里写 就在values/arrays里定义了 preference会自动生成一个以键值对形式存放的信息 3 我偷懒了。。因为去改换系统铃声的话 需要和content provider打交道 而且考虑到铃声是随时间一直在变化的 反复设置会需要一个定时器去控制 比较麻烦 所以采用了播放音乐的方式 至于系统铃声也响了一遍。。是我的问题 在用AudioManager打开多媒体声音同时 再把notification提示音暂时关闭 之后恢复应该就可以解决了 非常感谢 |
|
返回顶楼 | |
发表时间:2011-08-30
cookiejj2010 写道 ethenlong 写道 LZ你好,android我是初学,看了你的源码,还有好多还是不懂,还请指教:
1,dotabellactivity里的 protected void onDestroy() { super.onDestroy(); android.os.Process.killProcess(android.os.Process.myPid()); },这个函数的作用是什么? 2,设置里的三分钟,五分钟和十分钟在代码中哪里体现,我表示一直没看出来。 3,为什么不直接用系统铃声而用多媒体声音呢?我在测试时都是多媒体铃声响了一遍,然后是系统铃声又叫一遍。 以上是我的一点疑惑,可能表达不是很清楚,请见谅。在此跪谢~~~ 1 这个是网上搜来的 在退出应用的时候将自身进程结束掉 当时似乎是因为没这么写 点了解除绑定以后退出发现服务里仍然有进程跑着 导致铃声依旧被启用着的关系 2 设置3分钟5分钟10分钟是在preference里 这里没在代码里写 就在values/arrays里定义了 preference会自动生成一个以键值对形式存放的信息 3 我偷懒了。。因为去改换系统铃声的话 需要和content provider打交道 而且考虑到铃声是随时间一直在变化的 反复设置会需要一个定时器去控制 比较麻烦 所以采用了播放音乐的方式 至于系统铃声也响了一遍。。是我的问题 在用AudioManager打开多媒体声音同时 再把notification提示音暂时关闭 之后恢复应该就可以解决了 非常感谢 谢谢LZ,我把你的应用改了一下,就是在mediaplayer播放的时候把系统的短息提示关了就不会出现两次铃声提示了。但是用系统铃声这个我还是没找到方法,不知楼主有木有什么方法? |
|
返回顶楼 | |
发表时间:2011-08-31
最后修改:2011-08-31
ethenlong 写道 谢谢LZ,我把你的应用改了一下,就是在mediaplayer播放的时候把系统的短息提示关了就不会出现两次铃声提示了。但是用系统铃声这个我还是没找到方法,不知楼主有木有什么方法? 好像用RingtoneManager可以 有TYPE_NOTIFICATION 网上有些资料 牵涉到Uri 系统数据库的一些操作 另外好像需要把铃声放到指定的文件夹 另外因为notification不仅仅是短信的提示 其他的 比如Gmail邮件提示 有些软件流量警报的提示 G+消息提示等等的 都是用的这个notification 所以感觉还是直接播放好 否则一开启同步 也传来一片dota声音就不好了 |
|
返回顶楼 | |
浏览 5293 次