Android applications operate in their own process and are separated from the rest of the operating system. Because of this, in order to perform some system specific operations, it's required to request them. An example of such permission requests are requests to use Bluetooth, retrieve the current GPS location, send SMS messages, or read from or write to file system. Permissions grant access to various device features. There are several ways to deal with permissions. We will start with a very base using manifest.
First of all, we must determine what permissions are needed. It can happen that during the installation procedure, a user decides not to install an application because there are too many permissions. For example, a user can ask himself why an application requires the send SMS functionality when an application itself is just a simple image gallery application.
For Journaler, the application we are developing in this book, we will need the following permissions:
- Read the GPS coordinates because we want each note we create to have coordinates associated if we want to
- We will need access to the internet, so we can later execute API calls
- Boot complete event, we will need it so the application service can do synchronization with the backend each time we reboot our phone
- Reading and writing external storage so we can read the data or store it
- Access network state so we know if there is a connection to the internet available
- Use vibration so we can vibrate when we received something from the backend
Open the AndroidManifest.xml file and update it with the following permissions:
<manifest xmlns:android=
"http://schemas.android.com/apk/res/android" package="com.journaler"> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name=
"android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name=
"android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name=
"android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name=
"android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name=
"android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name=
"android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.VIBRATE" /> <application ... > ... </application ... </manifest>
Names for permissions we just requested are pretty much self-explanatory and they are covering all the points we mentioned. Besides these permissions, you can request some others as well. Take a look at the following names for each. You will be surprised what you can actually request:
<uses-permission android:name=
"android.permission.ACCESS_CHECKIN_PROPERTIES" /> <uses-permission android:name=
"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name=
"android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name=
"android.permission.ACCESS_SURFACE_FLINGER" /> <uses-permission android:name=
"android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name=
"android.permission.ACCOUNT_MANAGER" /> <uses-permission android:name=
"android.permission.AUTHENTICATE_ACCOUNTS" /> <uses-permission android:name=
"android.permission.BATTERY_STATS" /> <uses-permission android:name=
"android.permission.BIND_APPWIDGET" /> <uses-permission android:name=
"android.permission.BIND_DEVICE_ADMIN" /> <uses-permission android:name=
"android.permission.BIND_INPUT_METHOD" /> <uses-permission android:name=
"android.permission.BIND_REMOTEVIEWS" /> <uses-permission android:name=
"android.permission.BIND_WALLPAPER" /> <uses-permission android:name=
"android.permission.BLUETOOTH" /> <uses-permission android:name=
"android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name=
"android.permission.BRICK" /> <uses-permission android:name=
"android.permission.BROADCAST_PACKAGE_REMOVED" /> <uses-permission android:name=
"android.permission.BROADCAST_SMS" /> <uses-permission android:name=
"android.permission.BROADCAST_STICKY" /> <uses-permission android:name=
"android.permission.BROADCAST_WAP_PUSH" /> <uses-permission android:name=
"android.permission.CALL_PHONE"/> <uses-permission android:name=
"android.permission.CALL_PRIVILEGED" /> <uses-permission android:name=
"android.permission.CAMERA"/> <uses-permission android:name=
"android.permission.CHANGE_COMPONENT_ENABLED_STATE" /> <uses-permission android:name=
"android.permission.CHANGE_CONFIGURATION" /> <uses-permission android:name=
"android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name=
"android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name=
"android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name=
"android.permission.CLEAR_APP_CACHE" /> <uses-permission android:name=
"android.permission.CLEAR_APP_USER_DATA" /> <uses-permission android:name=
"android.permission.CONTROL_LOCATION_UPDATES" /> <uses-permission android:name=
"android.permission.DELETE_CACHE_FILES" /> <uses-permission android:name=
"android.permission.DELETE_PACKAGES" /> <uses-permission android:name=
"android.permission.DEVICE_POWER" /> <uses-permission android:name=
"android.permission.DIAGNOSTIC" /> <uses-permission android:name=
"android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name=
"android.permission.DUMP" /> <uses-permission android:name=
"android.permission.EXPAND_STATUS_BAR" /> <uses-permission android:name="
android.permission.FACTORY_TEST" /> <uses-permission android:name=
"android.permission.FLASHLIGHT" /> <uses-permission android:name=
"android.permission.FORCE_BACK" /> <uses-permission android:name=
"android.permission.GET_ACCOUNTS" /> <uses-permission android:name=
"android.permission.GET_PACKAGE_SIZE" /> <uses-permission android:name=
"android.permission.GET_TASKS" /> <uses-permission android:name=
"android.permission.GLOBAL_SEARCH" /> <uses-permission android:name=
"android.permission.HARDWARE_TEST" /> <uses-permission android:name=
"android.permission.INJECT_EVENTS" /> <uses-permission android:name=
"android.permission.INSTALL_LOCATION_PROVIDER" /> <uses-permission android:name=
"android.permission.INSTALL_PACKAGES" /> <uses-permission android:name=
"android.permission.INTERNAL_SYSTEM_WINDOW" /> <uses-permission android:name=
"android.permission.KILL_BACKGROUND_PROCESSES" /> <uses-permission android:name=
"android.permission.MANAGE_ACCOUNTS" /> <uses-permission android:name=
"android.permission.MANAGE_APP_TOKENS" /> <uses-permission android:name=
"android.permission.MASTER_CLEAR" /> <uses-permission android:name=
"android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name=
"android.permission.MODIFY_PHONE_STATE" /> <uses-permission android:name=
"android.permission.MOUNT_FORMAT_FILESYSTEMS" /> <uses-permission android:name=
"android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name=
"android.permission.NFC" /> <uses-permission android:name=
"android.permission.PROCESS_OUTGOING_CALLS" /> <uses-permission android:name=
"android.permission.READ_CALENDAR" /> <uses-permission android:name=
"android.permission.READ_CONTACTS" /> <uses-permission android:name=
"android.permission.READ_FRAME_BUFFER" /> <uses-permission android:name=
"android.permission.READ_HISTORY_BOOKMARKS" /> <uses-permission android:name=
"android.permission.READ_INPUT_STATE" /> <uses-permission android:name=
"android.permission.READ_LOGS" /> <uses-permission android:name=
"android.permission.READ_PHONE_STATE" /> <uses-permission android:name=
"android.permission.READ_SMS" /> <uses-permission android:name=
"android.permission.READ_SYNC_SETTINGS" /> <uses-permission android:name=
"android.permission.READ_SYNC_STATS" /> <uses-permission android:name=
"android.permission.REBOOT" /> <uses-permission android:name=
"android.permission.RECEIVE_MMS" /> <uses-permission android:name=
"android.permission.RECEIVE_SMS" /> <uses-permission android:name=
"android.permission.RECEIVE_WAP_PUSH" /> <uses-permission android:name=
"android.permission.RECORD_AUDIO" /> <uses-permission android:name=
"android.permission.REORDER_TASKS" /> <uses-permission android:name=
"android.permission.RESTART_PACKAGES" /> <uses-permission android:name=
"android.permission.SEND_SMS" /> <uses-permission android:name=
"android.permission.SET_ACTIVITY_WATCHER" /> <uses-permission android:name=
"android.permission.SET_ALARM" /> <uses-permission android:name=
"android.permission.SET_ALWAYS_FINISH" /> <uses-permission android:name=
"android.permission.SET_ANIMATION_SCALE" /> <uses-permission android:name=
"android.permission.SET_DEBUG_APP" /> <uses-permission android:name=
"android.permission.SET_ORIENTATION" /> <uses-permission android:name=
"android.permission.SET_POINTER_SPEED" /> <uses-permission android:name=
"android.permission.SET_PROCESS_LIMIT" /> <uses-permission android:name=
"android.permission.SET_TIME" /> <uses-permission android:name=
"android.permission.SET_TIME_ZONE" /> <uses-permission android:name=
"android.permission.SET_WALLPAPER" /> <uses-permission android:name=
"android.permission.SET_WALLPAPER_HINTS" /> <uses-permission android:name=
"android.permission.SIGNAL_PERSISTENT_PROCESSES" /> <uses-permission android:name=
"android.permission.STATUS_BAR" /> <uses-permission android:name=
"android.permission.SUBSCRIBED_FEEDS_READ" /> <uses-permission android:name=
"android.permission.SUBSCRIBED_FEEDS_WRITE" /> <uses-permission android:name=
"android.permission.SYSTEM_ALERT_WINDOW" /> <uses-permission android:name=
"android.permission.UPDATE_DEVICE_STATS" /> <uses-permission android:name=
"android.permission.USE_CREDENTIALS" /> <uses-permission android:name=
"android.permission.USE_SIP" /> <uses-permission android:name=
"android.permission.WAKE_LOCK" /> <uses-permission android:name=
"android.permission.WRITE_APN_SETTINGS" /> <uses-permission android:name=
"android.permission.WRITE_CALENDAR" /> <uses-permission android:name=
"android.permission.WRITE_CONTACTS" /> <uses-permission android:name=
"android.permission.WRITE_GSERVICES" /> <uses-permission android:name=
"android.permission.WRITE_HISTORY_BOOKMARKS" /> <uses-permission android:name=
"android.permission.WRITE_SECURE_SETTINGS" /> <uses-permission android:name=
"android.permission.WRITE_SETTINGS" /> <uses-permission android:name=
"android.permission.WRITE_SMS" /> <uses-permission android:name=
"android.permission.WRITE_SYNC_SETTINGS" /> <uses-permission android:name=
"android.permission.BIND_ACCESSIBILITY_SERVICE"/> <uses-permission android:name=
"android.permission.BIND_TEXT_SERVICE"/> <uses-permission android:name=
"android.permission.BIND_VPN_SERVICE"/> <uses-permission android:name=
"android.permission.PERSISTENT_ACTIVITY"/> <uses-permission android:name=
"android.permission.READ_CALL_LOG"/> <uses-permission android:name=
"com.android.browser.permission.READ_HISTORY_BOOKMARKS"/> <uses-permission android:name=
"android.permission.READ_PROFILE"/> <uses-permission android:name=
"android.permission.READ_SOCIAL_STREAM"/> <uses-permission android:name=
"android.permission.READ_USER_DICTIONARY"/> <uses-permission android:name=
"com.android.alarm.permission.SET_ALARM"/> <uses-permission android:name=
"android.permission.SET_PREFERRED_APPLICATIONS"/> <uses-permission android:name=
"android.permission.WRITE_CALL_LOG"/> <uses-permission android:name=
"com.android.browser.permission.WRITE_HISTORY_BOOKMARKS"/> <uses-permission android:name=
"android.permission.WRITE_PROFILE"/> <uses-permission android:name=
"android.permission.WRITE_SOCIAL_STREAM"/> <uses-permission android:name=
"android.permission.WRITE_USER_DICTIONARY"/>