职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 439|回复: 4

Android试手——Dota铃声

[复制链接]
钰云 发表于 2011-9-2 11:52 | 显示全部楼层 |阅读模式
手滑先发到博客频道了。。不知道现在这样算不算重复发帖。。……罪过
前段时间在论坛上看到一个帖子,说了一个关于短信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);   
            }   
        });  

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;   
    }  

//播放音效
        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#,甚至前端等等,本人患严重拖延症,一个人就容易闲下来,所以希望更多的学习碰撞可以让自己一直保持热情,上述的小程序也当是给征友找伙伴投石问路,如果达人们愿意平时指导指导小弟,交流交流技术,可以短消息联系,大家共同进步。
DotaBell.7z (125.8 KB)
下载次数: 52

大小: 15.9 KB
查看图片附件

shmilyyu 发表于 2011-9-2 11:52 | 显示全部楼层
程序虽然简单,功能却比较实用,代码写的比较规范,有一个小小的建议:
if(interval<preferenceInterval*60*1000&&!justStart){
这里最好把60和1000拿出来,作为一个常量进行定义

找不到我 发表于 2011-9-2 11:52 | 显示全部楼层
kill_all 写道
程序虽然简单,功能却比较实用,代码写的比较规范,有一个小小的建议:
if(interval<preferenceInterval*60*1000&&!justStart){
这里最好把60和1000拿出来,作为一个常量进行定义

收到~ 非常感谢

Jethro 发表于 2011-9-2 11:52 | 显示全部楼层
LZ你好,android我是初学,看了你的源码,还有好多还是不懂,还请指教:
1,dotabellactivity里的 protected void onDestroy() {
super.onDestroy();
android.os.Process.killProcess(android.os.Process.myPid());
},这个函数的作用是什么?
2,设置里的三分钟,五分钟和十分钟在代码中哪里体现,我表示一直没看出来。
3,为什么不直接用系统铃声而用多媒体声音呢?我在测试时都是多媒体铃声响了一遍,然后是系统铃声又叫一遍。


以上是我的一点疑惑,可能表达不是很清楚,请见谅。在此跪谢~~~

无处不在 发表于 2011-9-2 11:53 | 显示全部楼层
呵呵~~不错


配个背景图片就好了~~
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-28 01:42 , Processed in 0.144514 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表