最近花了一个星期左右的时间做了一个小闹钟,现在回过头来进行总结下。刚开始接触这个案例,总体觉着没有太大的难度,都是一些基础知识的堆砌,可现实总比理想残酷啊,这几天下来,每天都会有意料之外的bug出现。在debug的过程中,深深体会到了百度一下和谷歌谷歌的用处,基本常见的问题都可以在这里得到提示甚至答案。这篇文章先来介绍下这个案例所实现的功能,接下来再用几遍文章记录所用到的知识点。
功能简介:
1.闹钟基本功能:和平时的闹钟一样,用户在界面选择闹钟响起的时间,到达所设定时间后执行相应的指定操作。
该功能主要通过一个TimePicker
public void onTimeChanged(TimePicker view, int hour_of_day, int minutes) { // TODO Auto-generated method stub calendar.setTimeInMillis(System.currentTimeMillis());//将timePciker的当前时间转换为Calender对象 calendar.set(Calendar.HOUR_OF_DAY,hour_of_day);//设置小时 calendar.set(Calendar.MINUTE,minutes);//设置分钟 calendar.set(Calendar.SECOND,0);//设置秒 calendar.set(Calendar.MILLISECOND,0);//设置毫秒 hour=hour_of_day;//保存设置的小时 minute=minutes;//保存设置的分钟 }
和PendingIntent以及BrocardcastReceiver来实现。
PendingIntent sender=PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);//指定PendingIntent
2.自定义铃声功能:用户可以浏览SD卡上所有的音频文件,并可以通过单击其喜欢的歌曲将其设定为闹钟响起时的铃声。
该功能主要通过Cursor查询媒体数据库来实现
//查询媒体数据库 Cursor cursor=MainActivity.this.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, MediaStore.Audio.Media.DEFAULT_SORT_ORDER); //遍历数据库 if(cursor.moveToFirst()) { while(!cursor.isAfterLast()) { int id=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media._ID));//获取歌曲编号 int trackid=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM_ID));//获取歌曲ID String album=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));//获取歌曲专辑名 String artist=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));//获取歌曲歌手名 String url=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));//获取歌曲路径 String duration=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DURATION));//获取歌曲播放时长 int size=cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.SIZE));//获取歌曲大小 String disName=cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DISPLAY_NAME));//获取歌曲文件显示名字 items.add(disName); urls.add(url);//保存歌曲路径 cursor.moveToNext(); } cursor.close(); }
3.录制铃声功能:用户不但可以选择SD卡已有的音频文件作为闹钟铃声,还可以自行录制音频文件作为闹钟的铃声。
该功能主要通过调用MediaRecorder类来实现:
mRecorder=new MediaRecorder(); //设置音频源为Micphone mRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); //设置封装格式 mRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); mRecorder.setOutputFile(mFileName); //设置编码格式 mRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
4.关闭闹钟关卡:当闹钟响起,用户希望关闭闹钟时,必须先正确回答一道题目才能正常关闭闹钟。
该功能主要通过预定义字符串数组,随机显示数组元素来实现:
rm = (int) (Math.random()*3);//生成一个随机数 questionView.setText("请回答以下问题:"+question[rm]); if(!(answerText.getText().toString()==null))//equals比较两个值的内容是否相同,==比较两个值的首地址是否相同 { stopButton.setEnabled(true); }
5.微博分享功能:集成了新浪微博的微博分享功能,用户可以将类似“我今天又按时起床啦!”这样的信息分享到微博上。
该功能分两步实现,一个是微博授权认证功能:
//创建微博实例,传入APP_KEY,REDIRECT_URL等信息 mWeiboAuth=new WeiboAuth(this,Constants.APP_KEY,Constants.REDIRECT_URL,Constants.SCOPE); //从SharedPreferences读取AccessToken信息 mAccessToken=AccessTokenKeeper.readAccessToken(this); //如果AccessToken已存在并可用 if(mAccessToken.isSessionValid()) { updateTokenView(true); } else{ mSsoHandler=new SsoHandler(AlarmMessage.this,mWeiboAuth); mSsoHandler.authorize(new AuthListener()); }
另一个是调用微博分享API:
//创建微博分享接口实例
mWeiboShareAPI=WeiboShareSDK.createWeiboAPI(this, Constants.APP_KEY);
try
{ //检测用户设备是否已微博客户端
if(mWeiboShareAPI.checkEnvironment(true)){
//注册第三方应用到微博客户端
mWeiboShareAPI.registerApp();
if(mWeiboShareAPI.isWeiboAppSupportAPI())
{
int supportApi=mWeiboShareAPI.getWeiboAppSupportAPI();
if(supportApi>=10351)
{
//初始化微博的分享信息
WeiboMultiMessage weiboMessage=new WeiboMultiMessage();
weiboMessage.textObject=getTextObj();
//初始化第三方到微博的消息请求
SendMultiMessageToWeiboRequest request=new SendMultiMessageToWeiboRequest();
//用transaction唯一标识一个请求
request.transaction=String.valueOf(System.currentTimeMillis());
request.multiMessage=weiboMessage;
//发送请求,唤起微博分享界面
mWeiboShareAPI.sendRequest(request);
//Toast.makeText(AlarmMessage.this,"分享成功!55", Toast.LENGTH_LONG).show();
}
}
}
最后附上几张应用截图: