Camera Controls Using Volume Buttons In The Phimpme Application
The Phimpme Android application has a camera, Gallery section, edit image section and also the inbuilt sharing option. In spite of having all of the above features, the Phimpme application doesn’t compromise on the quality and functions of each of the sections. For instance, we can control the camera fully with the help of just the volume buttons. For this, we have provided an option in the settings of the application to change and select the behaviour of the volume buttons according to the users choice. In this post, I will be discussing how we have achieved this functionality.
Step 1
First, we have to display an ArrayList of options using the ListPreference in the settings. The user can perform the following functions using the volume keys.
- Take Photo
- Focus
- Zoom in/out
- Change Exposure Level
- Switch Auto Level on/off
There are also two other option to change device volume and to do nothing in case the user wants the default behaviour.
The above options in the settings can be provided using the following lines of code.
<ListPreference android:defaultValue="volume_take_photo" android:entries="@array/preference_volume_keys_entries" android:entryValues="@array/preference_volume_keys_values" android:key="preference_volume_keys" android:summary="@string/preference_volume_keys_summary" android:title="@string/preference_volume_keys" />
Step 2
Now as the user selects a particular option from the ListPreference, the value in the SharedPreference associated with a particular key value gets updated. After this, we have to perform the particular activity as soon as the volume button is pressed. For this, we have to Override the onKeyDown() function of the KeyEvent.Callback class in Android. This function takes in the Integer keycode and the KeyEvent as the parameters.
@Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (MyDebug.LOG) Log.d(TAG, "onKeyDown: " + keyCode); boolean handled = mainUI.onKeyDown(keyCode, event); if (handled) return true; return super.onKeyDown(keyCode, event); }
Step 3
We have defined another onKeyDown() method in the MainUI class to keep the code modularized. In this, we have made use of the Switch cases to perform the different actions. This can be done by using the following line of code snippet.
Switch (volume_keys) { case "volume_take_photo": main_activity.takePicture(); return true; case "volume_zoom": if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { main_activity.getPreview().zoomTo(main_activity.getPreview().getCameraController().getZoom() + 1); } else { main_activity.getPreview().zoomTo(main_activity.getPreview().getCameraController().getZoom() - 1); } return true;
In the above code snippet, we have defined the function to perform the zoom operation and to click picture using the volume keys. Similarly, we can add the functions to perform all the above mentioned activities. To get the full source code, please refer to the Phimpme Android GitHub repository mentioned in the resources section below.
Resources
- Android Developer Guide – KeyEvent.Callback class – https://developer.android.com/reference/android/view/KeyEvent.Callback.html
- GitHub – Phimpme Android Repository – https://github.com/fossasia/phimpme-android/
- StackOverflow – Handling key events in Android – https://stackoverflow.com/questions/5631977/keyevent-handling-in-android
- Blog post – Handleling Key Events – https://android-developers.googleblog.com/2009/12/back-and-other-hard-keys-three-stories.html