zxing安卓项目学习1——CaptureActivity之onCreate——BeepManager

来源:互联网 发布:华师网络教育平台 编辑:程序博客网 时间:2024/06/10 19:53

转载出处     http://blog.csdn.net/tr276913271/article/details/14452881


首选看CaptureActivity中的onCreate方法

[java] view plain copy
  1. @Override  
  2.     public void onCreate(Bundle icicle) {  
  3.         super.onCreate(icicle);  
  4.   
  5.         Window window = getWindow();  
  6.         window.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);  
  7.         setContentView(R.layout.capture);  
  8.   
  9.         hasSurface = false;  
  10.         historyManager = new HistoryManager(this);  
  11.                 historyManager.trimHistory();  
  12.         inactivityTimer = new InactivityTimer(this);  
  13.         beepManager = new BeepManager(this);  
  14.   
  15.         PreferenceManager.setDefaultValues(this, R.xml.preferences, false);  
  16.   
  17.         showHelpOnFirstLaunch();  
  18.     }  


1 其中:

[java] view plain copy
  1. Window window = getWindow();  
  2. 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)


首先先看看这个类的代码:

[java] view plain copy
  1. final class BeepManager {  
  2.   
  3.     private static final String TAG = BeepManager.class.getSimpleName();  
  4.   
  5.     private static final float BEEP_VOLUME = 0.10f;  
  6.     private static final long VIBRATE_DURATION = 200L;  
  7.   
  8.     private final Activity activity;  
  9.     private MediaPlayer mediaPlayer;  
  10.     private boolean playBeep;  
  11.     private boolean vibrate;  
  12.   
  13.     BeepManager(Activity activity) {  
  14.         this.activity = activity;  
  15.         this.mediaPlayer = null;  
  16.         updatePrefs();  
  17.     }  
  18.   
  19.     void updatePrefs() {  
  20.         SharedPreferences prefs = PreferenceManager  
  21.                 .getDefaultSharedPreferences(activity);  
  22.         playBeep = shouldBeep(prefs, activity);  
  23.         vibrate = prefs.getBoolean(PreferencesActivity.KEY_VIBRATE, false);// 默认的时候不震动  
  24.         if (playBeep && mediaPlayer == null) {  
  25.             // The volume on STREAM_SYSTEM is not adjustable, and users found it  
  26.             // too loud,  
  27.             // so we now play on the music stream.  
  28.             // 如果没有在设置setVolumeControlStream为AudioManager.STREAM_MUSIC,  
  29.             // 在没有播放的情况下,音量键控制的是Ring大小,在播放的时候就会变成控制music的大小  
  30.             // 如果设置了,则在没有播放的情况下也是控制music大小  
  31.             activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);  
  32.             mediaPlayer = buildMediaPlayer(activity);  
  33.         }  
  34.     }  
  35.   
  36.     void playBeepSoundAndVibrate() {  
  37.         if (playBeep && mediaPlayer != null) {  
  38.             mediaPlayer.start();  
  39.         }  
  40.         if (vibrate) {  
  41.             Vibrator vibrator = (Vibrator) activity  
  42.                     .getSystemService(Context.VIBRATOR_SERVICE);  
  43.             vibrator.vibrate(VIBRATE_DURATION);  
  44.         }  
  45.     }  
  46.   
  47.     /** 
  48.      * 判断是否能够在识别成功时发出声音,如果用户选择了静音模式或者震动模式,则返回false表示不发出声音 
  49.      *  
  50.      */  
  51.     private static boolean shouldBeep(SharedPreferences prefs, Context activity) {  
  52.         boolean shouldPlayBeep = prefs.getBoolean(  
  53.                 PreferencesActivity.KEY_PLAY_BEEP, true);  
  54.         if (shouldPlayBeep) {  
  55.             // See if sound settings overrides this  
  56.             AudioManager audioService = (AudioManager) activity  
  57.                     .getSystemService(Context.AUDIO_SERVICE);  
  58.             if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {  
  59.                 shouldPlayBeep = false;  
  60.             }  
  61.         }  
  62.         return shouldPlayBeep;  
  63.     }  
  64.   
  65.     private static MediaPlayer buildMediaPlayer(Context activity) {  
  66.         MediaPlayer mediaPlayer = new MediaPlayer();  
  67.         mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//最好和上面的设置一致,否则音量键控制的音频流和播放声音的音频流不一致  
  68.         // When the beep has finished playing, rewind to queue up another one.  
  69.         mediaPlayer  
  70.                 .setOnCompletionListener(new MediaPlayer.OnCompletionListener() { //播放结束的监听  
  71.                     @Override  
  72.                     public void onCompletion(MediaPlayer player) {  
  73.                         player.seekTo(0);  
  74.                     }  
  75.                 });  
  76. //得到beep.ogg文件  
  77.         AssetFileDescriptor file = activity.getResources().openRawResourceFd(  
  78.                 R.raw.beep);  
  79.         try {  
  80.             mediaPlayer.setDataSource(file.getFileDescriptor(),  
  81.                     file.getStartOffset(), file.getLength());  
  82.             file.close();  
  83.             mediaPlayer.setVolume(BEEP_VOLUME, BEEP_VOLUME);//音量大小,这两个字段要求在0.0~~1.0之间  
  84.             mediaPlayer.prepare();  
  85.         } catch (IOException ioe) {  
  86.             Log.w(TAG, ioe);  
  87.             mediaPlayer = null;  
  88.         }  
  89.         return mediaPlayer;  
  90.     }  
  91.   
  92. }  

构造方法里面调用了 updatePrefs 方法,先看这个方法干了什么

//取出SharedPreferences 等会要读取相关设置

[java] view plain copy
  1. SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(activity);   

//shouldBeep方法判断是否能够在识别成功时发出声音,如果用户选择了静音模式或者震动模式,则返回false,表示不发出声音

[java] view plain copy
  1. playBeep = shouldBeep(prefs, activity);   
// 默认值是不震动,可以在设置Activity中修改 

[java] view plain copy
  1. vibrate = prefs.getBoolean(PreferencesActivity.KEY_VIBRATE, false);  




这里有一个 PreferencesActivity  的类 ,这个类存放了很多静态常量,暂时理解为和用户设置有关系。

[java] view plain copy
  1. PreferencesActivity.KEY_VIBRATE  

表示的是:用户是否允许在解码成功时震动。true是允许。


然后是if语句中

[java] view plain copy
  1. activity.setVolumeControlStream(AudioManager.STREAM_MUSIC);  
  2. <pre name="code" class="java">//播放音乐之前的准备工作  
  3. mediaPlayer = buildMediaPlayer(activity);  
  4. </pre>  

安卓系统中有四种音频流, 分别是 :铃声,媒体,系统音量 和 通知。(在手机的声音设置里面可以看到。)

这条语句主要是和手机上的两个音量键有关系。注释中已经写了:如果没有设置AudioManager.STREAM_MUSIC,在没有播放音乐的情况下,按下音量键控制的是铃声大小,在播放的时候按下音量键就会变成控制媒体音量的大小。如果设置了,则在没有播放的情况下也是控制媒体音量大小。

做这个实验可以选一首长一点的歌就会看到效果。


需要注意的是:如果我们在程序里控制了音量大小,当我们退出程序的时候,手机的音量大小不会还原。也就是说 :假设在程序运行前我的媒体音量大小是50,在程序运行中我调整为100,退出程序后,媒体音量不会还原成50,而是100。如果我们想做到在程序中改变了声音而不影响原先的设置,可以使用MediaPlayer的setVolume方法,用这个方法改变了声音后,不会影响原先的设置。


5 在回头来看shouldBeep这个方法,主要是看这几句:

[java] view plain copy
  1. AudioManager audioService = (AudioManager) activity  
  2.                            .getSystemService(Context.AUDIO_SERVICE);  
  3. if (audioService.getRingerMode() != AudioManager.RINGER_MODE_NORMAL) {  
  4.     shouldPlayBeep = false;  
  5. }  

这条语句中有如下几个知识点:

1 AudioManager的取得方法

2 getRingerMode() 获取当前情景模式。有如下几种

    AudioManager.RINGER_MODE_NORMAL 正常

    AudioManager.RINGER_MODE_SILENT 静音模式

    AudioManager.RINGER_MODE_VIRBATE 震动模式

也就是说shouldBeep方法做了一个判断,是要不是正常模式,就不允许发声。




下面是buildMediaPlayer方法,在注释中也得也很清楚,都是播放声音 要求的流程,没什么好说的。


[java] view plain copy
  1. //这里和上面的设置一样才好,虽然不一样也行,但是那样你按音量键调整声音不会改变播放的声音大小  
  2. mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
[java] view plain copy
  1. setOnCompletionListener//监听事件,网络流媒体播放结束监听。  



在下面是playBeepSoundAndVibrate方法,需要播放声音的时候就要调用这个方法,里面还写了有关震动的东西,在我给的参考文章中可以在详细了解。


BeepManager就是这么多内容,下次是 HistoryManager


阅读全文
0 0