zxing安卓项目学习1——CaptureActivity之onCreate——BeepManager
来源:互联网 发布:moneywiz2 mac 破解 编辑:程序博客网 时间:2024/05/23 13:55
首选看CaptureActivity中的onCreate方法
@Overridepublic void onCreate(Bundle icicle) {super.onCreate(icicle);Window window = getWindow();window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);setContentView(R.layout.capture);hasSurface = false;historyManager = new HistoryManager(this); historyManager.trimHistory();inactivityTimer = new InactivityTimer(this);beepManager = new BeepManager(this);PreferenceManager.setDefaultValues(this, R.xml.preferences, false);showHelpOnFirstLaunch();}
1 其中:
Window window = getWindow();window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
这两句表示:让屏幕保持恒亮,如果不加这句话,如果我们打开程序不做任何操作,屏幕就会关闭。这里要说的是,网上还有另外一种让屏幕保持恒亮的方法:就是使用 WakeLock 和 PowerManager 具体实现的可以自行百度。这种方法虽然也可以实现,但是它已经被谷歌所弃用。所以我们如果想让屏幕恒亮,就使用上面两条语句(谷歌推荐的方法)。
2 在往下看是初始化三个类,分别是 HistoryManager 和 InactivityTimer 和 BeepManager
HistoryManag是负责历史记录的相关类
InactiveTimer是负责:如果长时间没有操作,此APP会自动退出 ,默认时间是5分钟。
BeepManager是负责:在二维码解码成功时 播放“bee”的声音,同时还可以震动。
4 我先说BeepManager这个类,其他两个下两篇再说。
(参考:http://www.jb51.net/article/33377.htm)
首先先看看这个类的代码:
final class BeepManager { private static final String TAG = BeepManager.class.getSimpleName(); private static final float BEEP_VOLUME = 0.10f; private static final long VIBRATE_DURATION = 200L; private final Activity activity; private MediaPlayer mediaPlayer; private boolean playBeep; private boolean vibrate; BeepManager(Activity activity) { this.activity = activity; this.mediaPlayer = null; updatePrefs(); } void updatePrefs() { SharedPreferences prefs = PreferenceManager .getDefaultSharedPreferences(activity); playBeep = shouldBeep(prefs, activity); vibrate = prefs.getBoolean(PreferencesActivity.KEY_VIBRATE, false);// 默认的时候不震动 if (playBeep && mediaPlayer == null) { // The volume on STREAM_SYSTEM is not adjustable, and users found it // too loud, // so we now play on the music stream. // 如果没有在设置setVolumeControlStream为AudioManager.STREAM_MUSIC, // 在没有播放的情况下,音量键控制的是Ring大小,在播放的时候就会变成控制music的大小 // 如果设置了,则在没有播放的情况下也是控制music大小 activity.setVolumeControlStream(AudioManager.STREAM_MUSIC); mediaPlayer = buildMediaPlayer(activity); } } void playBeepSoundAndVibrate() { if (playBeep && mediaPlayer != null) { mediaPlayer.start(); } if (vibrate) { Vibrator vibrator = (Vibrator) activity .getSystemService(Context.VIBRATOR_SERVICE); vibrator.vibrate(VIBRATE_DURATION); } } /** * 判断是否能够在识别成功时发出声音,如果用户选择了静音模式或者震动模式,则返回false表示不发出声音 * */ private static boolean shouldBeep(SharedPreferences prefs, Context activity) { boolean shouldPlayBeep = prefs.getBoolean( PreferencesActivity.KEY_PLAY_BEEP, true); if (shouldPlayBeep) { // See if sound settings overrides this AudioManager audioService = (AudioManager) activity .getSystemService(Context.AUDIO_SERVICE); if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) { shouldPlayBeep = false; } } return shouldPlayBeep; } private static MediaPlayer buildMediaPlayer(Context activity) { MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//最好和上面的设置一致,否则音量键控制的音频流和播放声音的音频流不一致 // When the beep has finished playing, rewind to queue up another one. mediaPlayer .setOnCompletionListener(new MediaPlayer.OnCompletionListener() { //播放结束的监听 @Override public void onCompletion(MediaPlayer player) { player.seekTo(0); } });//得到beep.ogg文件 AssetFileDescriptor file = activity.getResources().openRawResourceFd( R.raw.beep); try { mediaPlayer.setDataSource(file.getFileDescriptor(), file.getStartOffset(), file.getLength()); file.close(); mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);//音量大小,这两个字段要求在0.0~~1.0之间 mediaPlayer.prepare(); } catch (IOException ioe) { Log.w(TAG, ioe); mediaPlayer = null; } return mediaPlayer; }}构造方法里面调用了 updatePrefs 方法,先看这个方法干了什么
//取出SharedPreferences 等会要读取相关设置
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);//shouldBeep方法判断是否能够在识别成功时发出声音,如果用户选择了静音模式或者震动模式,则返回false,表示不发出声音
playBeep = shouldBeep(prefs, activity);// 默认值是不震动,可以在设置Activity中修改vibrate = prefs.getBoolean(PreferencesActivity.KEY_VIBRATE, false);
这里有一个 PreferencesActivity 的类 ,这个类存放了很多静态常量,暂时理解为和用户设置有关系。
PreferencesActivity.KEY_VIBRATE表示的是:用户是否允许在解码成功时震动。true是允许。
然后是if语句中
activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);//播放音乐之前的准备工作mediaPlayer = buildMediaPlayer(activity);安卓系统中有四种音频流, 分别是 :铃声,媒体,系统音量 和 通知。(在手机的声音设置里面可以看到。)
这条语句主要是和手机上的两个音量键有关系。注释中已经写了:如果没有设置AudioManager.STREAM_MUSIC,在没有播放音乐的情况下,按下音量键控制的是铃声大小,在播放的时候按下音量键就会变成控制媒体音量的大小。如果设置了,则在没有播放的情况下也是控制媒体音量大小。
做这个实验可以选一首长一点的歌就会看到效果。
需要注意的是:如果我们在程序里控制了音量大小,当我们退出程序的时候,手机的音量大小不会还原。也就是说 :假设在程序运行前我的媒体音量大小是50,在程序运行中我调整为100,退出程序后,媒体音量不会还原成50,而是100。如果我们想做到在程序中改变了声音而不影响原先的设置,可以使用MediaPlayer的setVolume方法,用这个方法改变了声音后,不会影响原先的设置。
5 在回头来看shouldBeep这个方法,主要是看这几句:
AudioManager audioService = (AudioManager) activity .getSystemService(Context.AUDIO_SERVICE);if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {shouldPlayBeep = false;}这条语句中有如下几个知识点:
1 AudioManager的取得方法
2 getRingerMode() 获取当前情景模式。有如下几种
AudioManager.RINGER_MODE_NORMAL 正常
AudioManager.RINGER_MODE_SILENT 静音模式
AudioManager.RINGER_MODE_VIRBATE 震动模式
也就是说shouldBeep方法做了一个判断,是要不是正常模式,就不允许发声。
下面是buildMediaPlayer方法,在注释中也得也很清楚,都是播放声音 要求的流程,没什么好说的。
//这里和上面的设置一样才好,虽然不一样也行,但是那样你按音量键调整声音不会改变播放的声音大小mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);setOnCompletionListener//监听事件,网络流媒体播放结束监听。
在下面是playBeepSoundAndVibrate方法,需要播放声音的时候就要调用这个方法,里面还写了有关震动的东西,在我给的参考文章中可以在详细了解。
BeepManager就是这么多内容,下次是 HistoryManager
- zxing安卓项目学习1——CaptureActivity之onCreate——BeepManager
- zxing安卓项目学习1——CaptureActivity之onCreate——BeepManager
- zxing安卓项目学习1——AndroidManifest文件
- ZXing CaptureActivity黑屏问题
- ZXing笔记(1)—Hello ZXing
- 项目总结——zxing扫描
- 安卓学习之—Fragment
- 安卓学习之—自定义Dialog
- 学习android编程之路(3)— 安卓项目目录和虚拟机
- 安卓开发——activity的一些初始化的工作,在oncreate中做还是onresume中做
- 扫一扫——Zxing
- 安卓学习记录——(1.安卓项目的目录结构)
- 安卓学习之路——序
- 安卓四大组件之——ContentProvider学习
- 安卓学习——四大组建之Activity生命周期
- 安卓学习之—跑马灯效果
- 安卓学习之—自定义ProgressBar的样式
- zxing ——android学习初探(一)
- jetty总体设计框架图
- 从K近邻算法、距离度量谈到KD树、SIFT+BBF算法
- js正则函数match、exec、test、search、replace、split使用介绍集合
- R语言:变量名中含有参数
- lua中遍历table的几种方式比较
- zxing安卓项目学习1——CaptureActivity之onCreate——BeepManager
- Hadoop MapReduce之任务启动(二)
- 关于Button点击弹出输入框,并且通过Servlet连接数据库
- SVN使用:Ubuntu下svn创建版本库/导入/导出
- hdu 4497 GCD and LCM
- 开通博客啦!
- VS2008开发64位应用
- poj1995 Raising Modulo Numbers 整数型快速幂 算法的应用
- MAC OSX 下配置Eclipse+PHP+XDEBUG整理