You are previewing Advanced BlackBerry 6 Development.
O'Reilly logo
Advanced BlackBerry 6 Development

Book Description

BlackBerry devices and applications are selling by the millions. As a BlackBerry developer, you need an advanced skill set to successfully exploit the most compelling features of the platform. This book will help you develop that skill set and teach you how to create the most sophisticated BlackBerry programs possible.

With Advanced BlackBerry 6 Development, you'll get a comprehensive look at the new features included with SDK 6, including the new web and widgets SDK, the new web browser, and more. You'll also learn how to take advantage of new BlackBerry media capabilities such as the camera and video playback. The book also shows you how to send and receive text and multimedia messages, use powerful cryptography libraries, and connect with the user's personal and business contacts and calendar.

Not only will you be learning how to use these APIs, but you'll also be building a program that takes full advantage of them: a wireless media-sharing app. Each chapter's lessons will be applied by enhancing the app from a prototype to a fully polished program. Along the way, you'll learn how to differentiate your product from other downloads by fully integrating with the new BlackBerry 6 operating system. Your app will run in the browser and within device menus, just like software that comes with the phone. You will even learn BlackBerry's new Web browser features, Web standards-based App SDK, and more.

Once you are comfortable with writing apps, this book will show you how to take them to the next level. You'll learn how to move from running on one phone to running on all phones, and from one country to all countries. You'll additionally learn how to support your users with updates. No other resource compares for mastering the techniques needed for expert development on this mobile platform.

Table of Contents

  1. Copyright
  2. About the Author
  3. About the Technical Reviewer
  4. Acknowledgments
  5. Introduction
    1. The Book's Anatomy
      1. Part 1, "Advanced APIs"
      2. Part 2, "Device Integration"
      3. Part 3, "Going Pro"
      4. Part 4, "The New Frontier"
    2. What's Changed?
    3. How to Read This Book
      1. Novice
      2. Apprentice
      3. Journeyman
      4. Master
    4. Notes on Conventions
    5. Your Media App
    6. The Trailhead
  6. I. Advanced APIs
    1. 1. Getting Started
      1. 1.1. Initial Setup
        1. 1.1.1. Getting Java
        2. 1.1.2. Goldilocks and the Three IDEs
        3. 1.1.3. Plugged In
        4. 1.1.4. BlackBerry Programs
        5. 1.1.5. Simulator Files
        6. 1.1.6. The Keys to Development
      2. 1.2. Application Types
        1. 1.2.1. MIDlets
          1. 1.2.1.1. MIDlet Behavior
          2. 1.2.1.2. MIDlet UI
          3. 1.2.1.3. A MIDlet Example
          4. 1.2.1.4. Running a MIDlet
          5. 1.2.1.5. MIDlet Evaluation
        2. 1.2.2. CLDC Applications
          1. 1.2.2.1. CLDC Behavior
          2. 1.2.2.2. CLDC UI
          3. 1.2.2.3. A CLDC Example
          4. 1.2.2.4. CLDC Evaluation
        3. 1.2.3. Libraries
          1. 1.2.3.1. Library Functions
          2. 1.2.3.2. A Library Example
          3. 1.2.3.3. Library Evaluation
      3. 1.3. Connecting to Files and Networks
        1. 1.3.1. A GCF Overview
        2. 1.3.2. File Access
          1. 1.3.2.1. Paths
          2. 1.3.2.2. Access
          3. 1.3.2.3. Streams
          4. 1.3.2.4. Other Operations
        3. 1.3.3. Networking
          1. 1.3.3.1. Types of Connections
          2. 1.3.3.2. HTTP Requests
          3. 1.3.3.3. Simpler Networking
      4. 1.4. App: Media Grabber
        1. 1.4.1. Writing the App
        2. 1.4.2. Debugging on the Simulator
        3. 1.4.3. Debugging on the BlackBerry Device
        4. 1.4.4. Working with Devices
        5. 1.4.5. Sign Me Up
      5. 1.5. Excelsior
    2. 2. Media Capture
      1. 2.1. BlackBerry vs. Java ME APIs
        1. 2.1.1. The Java ME Standard: A MediaPlayer Connection
        2. 2.1.2. Push Me/Pull You
        3. 2.1.3. The Life of a Player
        4. 2.1.4. Listen to Me
        5. 2.1.5. Have Content, Will Travel
        6. 2.1.6. What Else Is There?
      2. 2.2. Creating a MediaPlayer
      3. 2.3. Controlling Output
      4. 2.4. Recording Audio
        1. 2.4.1. Audio Formats
        2. 2.4.2. Capture
      5. 2.5. Using the Camera
        1. 2.5.1. Image Formats
        2. 2.5.2. Taking a Picture
      6. 2.6. Video Capture
      7. 2.7. Invoking the RIM Alternative
      8. 2.8. App: Media Grabber
      9. 2.9. Excelsior
    3. 3. Media Playback
      1. 3.1. Finding Content
        1. 3.1.1. Local Filesystem
          1. 3.1.1.1. How to Use
          2. 3.1.1.2. When to Use
          3. 3.1.1.3. An Example
        2. 3.1.2. Network Download
          1. 3.1.2.1. How to Use
          2. 3.1.2.2. When to Use
          3. 3.1.2.3. An Example
        3. 3.1.3. Network Stream
          1. 3.1.3.1. How to Use
          2. 3.1.3.2. When to Use
          3. 3.1.3.3. An Example
        4. 3.1.4. Manual Buffering
          1. 3.1.4.1. How to Use
          2. 3.1.4.2. When to Use
          3. 3.1.4.3. An Example
        5. 3.1.5. COD Resource
          1. 3.1.5.1. How to Use
          2. 3.1.5.2. When to Use
          3. 3.1.5.3. An Example
        6. 3.1.6. Other
          1. 3.1.6.1. How to Use
          2. 3.1.6.2. When to Use
          3. 3.1.6.3. An Example
      2. 3.2. Playing Audio
        1. 3.2.1. The Player Returns
        2. 3.2.2. Listening In
        3. 3.2.3. All About Codecs
          1. 3.2.3.1. Containers and Content
          2. 3.2.3.2. Codec Support
        4. 3.2.4. Where Does the Sound Go?
        5. 3.2.5. Mixing Music
        6. 3.2.6. Bringing It Together
        7. 3.2.7. Other Audio Options: MIDI and Tones
      3. 3.3. Playing Video
      4. 3.4. Displaying Images
        1. 3.4.1. Static Image Display in BlackBerry CLDC Applications
        2. 3.4.2. SVG Image Playback
        3. 3.4.3. Getting Plazmic
        4. 3.4.4. GIF Animation
        5. 3.4.5. MIDP Images
      5. 3.5. Invoking Native Apps
        1. 3.5.1. Playing Video Through the Browser
        2. 3.5.2. Using CHAPI to Play Audio
      6. 3.6. App: Media Reviewer
      7. 3.7. Excelsior
    4. 4. Wireless Messaging
      1. 4.1. The Messaging Quiver
        1. 4.1.1. SMS
          1. 4.1.1.1. Pros
          2. 4.1.1.2. Cons
        2. 4.1.2. MMS
          1. 4.1.2.1. Pros
          2. 4.1.2.2. Cons
        3. 4.1.3. E-mail
          1. 4.1.3.1. Pros
          2. 4.1.3.2. Cons
        4. 4.1.4. Push E-mail
          1. 4.1.4.1. Pros
          2. 4.1.4.2. Cons
        5. 4.1.5. BlackBerry PIN Messaging
          1. 4.1.5.1. Pros
          2. 4.1.5.2. Cons
      2. 4.2. Sending Text Messages
        1. 4.2.1. Creating Texts
        2. 4.2.2. Sending Data
        3. 4.2.3. When Things Go Wrong
        4. 4.2.4. SMSC Lookup
        5. 4.2.5. Sending SMS on CDMA
      3. 4.3. Sending Multimedia Messages
        1. 4.3.1. Talk to the World
        2. 4.3.2. Constructing Parts
        3. 4.3.3. Making the Message
        4. 4.3.4. Get Out of Here
      4. 4.4. Plugging into E-mail
        1. 4.4.1. Taking Account
        2. 4.4.2. Creating the Message
        3. 4.4.3. Adding Attachments
        4. 4.4.4. Testing Sending
      5. 4.5. Receiving Text Messages
        1. 4.5.1. Getting the Message
        2. 4.5.2. Waking Up
        3. 4.5.3. We've Got Incoming
        4. 4.5.4. What Is It?
      6. 4.6. Testing SMS
      7. 4.7. Receiving MMS Messages
        1. 4.7.1. Reading MMS
        2. 4.7.2. Testing MMS
      8. 4.8. Reading E-mail
        1. 4.8.1. Listening
        2. 4.8.2. Reading Messages
        3. 4.8.3. Reading Attachments
      9. 4.9. PIN Messaging
        1. 4.9.1. Getting Pinned
        2. 4.9.2. Receiving PINs
      10. 4.10. App: Sending and Receiving Media Messages
      11. 4.11. Excelsior
    5. 5. Cryptography
      1. 5.1. Is It Secret? Is It Safe?
        1. 5.1.1. Data Encryption
        2. 5.1.2. Data Decryption
        3. 5.1.3. Validation
      2. 5.2. SATSA
      3. 5.3. Bouncy Castle
        1. 5.3.1. An Introduction
        2. 5.3.2. Adding Bouncy Castle to Your Project
        3. 5.3.3. Using Bouncy Castle in Encryption
        4. 5.3.4. Using Bouncy Castle in Decryption
        5. 5.3.5. Using Bouncy Castle to Create Digests
        6. 5.3.6. Using Bouncy Castle to Verify Digests
        7. 5.3.7. Bouncy Castle Analysis
      4. 5.4. RIM Crypto Classes
        1. 5.4.1. An Introduction
        2. 5.4.2. Encryption with the RIM Crypto Classes
        3. 5.4.3. Decryption with the RIM Crypto Classes
        4. 5.4.4. Using RIM Crypto with Digests
        5. 5.4.5. RIM Crypto Analysis
      5. 5.5. Using the Certicom Classes
        1. 5.5.1. An Introduction
        2. 5.5.2. Encryption with Certicom Public Keys
        3. 5.5.3. Decryption with Certicom Public Keys
        4. 5.5.4. Certicom Analysis
      6. 5.6. Other Encryption Choices
        1. 5.6.1. HTTPS Encryption
        2. 5.6.2. MDS Encryption
        3. 5.6.3. File Encryption
      7. 5.7. App: Securing MediaGrabber
        1. 5.7.1. Adding Encryption
        2. 5.7.2. Better Choices
        3. 5.7.3. Decryption
        4. 5.7.4. Paranoia
      8. 5.8. Excelsior
  7. II. Device Integration
    1. 6. Personal Information
      1. 6.1. Contacts
        1. 6.1.1. An Overview of PIM
          1. 6.1.1.1. PIM and Lists
          2. 6.1.1.2. Categories
          3. 6.1.1.3. Items
          4. 6.1.1.4. Fields
        2. 6.1.2. Contacts
          1. 6.1.2.1. Hello, Stranger
          2. 6.1.2.2. Representing a Contact
          3. 6.1.2.3. A BlackBerry Contact
      2. 6.2. Adding Contacts
        1. 6.2.1. Creating Blank Contacts
        2. 6.2.2. Importing a Contact
      3. 6.3. Editing Contacts
        1. 6.3.1. Modifying Basic Fields
          1. 6.3.1.1. Editing Strings
          2. 6.3.1.2. Editing Dates
          3. 6.3.1.3. Editing Binary
        2. 6.3.2. Modifying Email Addresses
        3. 6.3.3. Modifying Names
        4. 6.3.4. Modifying Phone Numbers
        5. 6.3.5. Modifying Addresses
      4. 6.4. Saving Contacts
      5. 6.5. Searching for Contacts
        1. 6.5.1. I Want It All
        2. 6.5.2. Particular Retrieval
        3. 6.5.3. Broader Searches
        4. 6.5.4. Template Matching
        5. 6.5.5. Remote Lookup
      6. 6.6. Reading Contact Data
      7. 6.7. Deleting Contacts
      8. 6.8. Invoking the Native Address Book
      9. 6.9. The BlackBerry Calendar
        1. 6.9.1. Calendar Syncing
        2. 6.9.2. Repeat After Me
        3. 6.9.3. Eventful Data
      10. 6.10. Using BlackBerry Calendar Events
        1. 6.10.1. Creating and Editing Events
        2. 6.10.2. Searching and Reading Events
        3. 6.10.3. Exporting and Deleting Events
      11. 6.11. Showing Calendars
        1. 6.11.1. Invoking the Native Calendar
        2. 6.11.2. Picking a Date
      12. 6.12. I Have A ToDo List?
      13. 6.13. Take a Memo
      14. 6.14. Personal Changes
      15. 6.15. App: Selecting Recipients
      16. 6.16. Excelsior
    2. 7. Browser with Web Apps
      1. 7.1. Browser Types
        1. 7.1.1. WAP
        2. 7.1.2. HTML and XHTML
        3. 7.1.3. Embedding Content
        4. 7.1.4. HTML5
        5. 7.1.5. Widgets
        6. 7.1.6. Other Browser Options
      2. 7.2. Web, Widget, or App Development?
        1. 7.2.1. Lightweight Web
        2. 7.2.2. Versatile Widgets
        3. 7.2.3. Heavy-duty Apps
      3. 7.3. Launching the Browser
        1. 7.3.1. Starting the Browser
        2. 7.3.2. Service Options
        3. 7.3.3. Launching with HTML
      4. 7.4. Embedding a Browser in Your App
        1. 7.4.1. An Overview
        2. 7.4.2. Supporting Players
          1. 7.4.2.1. BrowserFieldConfig
          2. 7.4.2.2. BrowserFieldListener
        3. 7.4.3. An Example
      5. 7.5. Embedding Your App in a Browser
        1. 7.5.1. MIME Type Providers
        2. 7.5.2. Writing a Plug-in
        3. 7.5.3. Registering the Plug-in
      6. 7.6. App: Friend Tracker
        1. 7.6.1. MIME Configuration
        2. 7.6.2. Creating the Plug-in Library
        3. 7.6.3. Running the App
      7. 7.7. Excelsior
    3. 8. Integrating with the BlackBerry OS
      1. 8.1. A Content Handling System
        1. 8.1.1. The Content Handling Philosophy
        2. 8.1.2. The Content Handling Architecture
        3. 8.1.3. The Major Players
          1. 8.1.3.1. Invocation
            1. 8.1.3.1.1. Locating Hints
            2. 8.1.3.1.2. Actions
            3. 8.1.3.1.3. Parameters
            4. 8.1.3.1.4. Invocation Life Cycle
            5. 8.1.3.1.5. Examples
          2. 8.1.3.2. ActionNameMap
          3. 8.1.3.3. ContentHandler
          4. 8.1.3.4. ContentHandlerServer
          5. 8.1.3.5. Registry
            1. 8.1.3.5.1. Client Use of Registry
            2. 8.1.3.5.2. Server Use of Registry
        4. 8.1.4. Alternate Entry
        5. 8.1.5. Installing Handlers
          1. 8.1.5.1. Default Handlers
        6. 8.1.6. Built-in Handlers
        7. 8.1.7. CHAPI Alternatives
      2. 8.2. Iconic
        1. 8.2.1. Design Notes
        2. 8.2.2. Technical Notes
        3. 8.2.3. Providing an Icon
        4. 8.2.4. Changing Icons
      3. 8.3. Native Menus
        1. 8.3.1. Defining Native Menu Options
        2. 8.3.2. Inserting into the Native Menu
      4. 8.4. App: Enter from Anywhere
        1. 8.4.1. Adding CHAPI Handling
          1. 8.4.1.1. Listening for and Handling Requests
        2. 8.4.2. Running with CHAPI
        3. 8.4.3. More Native Menu Integration
      5. 8.5. Excelsior
  8. III. Going Pro
    1. 9. RIM Security
      1. 9.1. The Ownership Question
      2. 9.2. Security Policies: "You Can't Do That!"
        1. 9.2.1. Background
        2. 9.2.2. IT Policy Examples
          1. 9.2.2.1. Device Security Policy Examples
          2. 9.2.2.2. Application Control Policy Examples
        3. 9.2.3. Pushing Policies
        4. 9.2.4. Beware of eBay
        5. 9.2.5. Replacing an Old Policy
        6. 9.2.6. What Can You Do?
      3. 9.3. User Permissions: "May I Do This?"
        1. 9.3.1. Setting User Permissions on OTA Installs
        2. 9.3.2. Default Permissions
        3. 9.3.3. Specific Application Settings
        4. 9.3.4. Programmatic Control
          1. 9.3.4.1. ApplicationPermissions
          2. 9.3.4.2. ApplicationPermissionsManager
            1. 9.3.4.2.1. Checking Permissions
            2. 9.3.4.2.2. Changing Permissions
        5. 9.3.5. Give Me a Reason
          1. 9.3.5.1. APIs with Customized Prompts
      4. 9.4. Firewall: "Don't Go There!"
        1. 9.4.1. Firewall Actions
        2. 9.4.2. Firewall Settings
        3. 9.4.3. Firewall Effects
        4. 9.4.4. Dealing with the Firewall
      5. 9.5. Application Signing: "Do I Know You?"
        1. 9.5.1. Identity Establishment
        2. 9.5.2. Code Signing Impacts
      6. 9.6. App: Ask for Permissions
        1. 9.6.1. Checking and Requesting Permissions
        2. 9.6.2. Plugging In
        3. 9.6.3. Running the App
      7. 9.7. Excelsior
    2. 10. Porting Your App
      1. 10.1. Understanding Hardware Differences
        1. 10.1.1. Processors
        2. 10.1.2. Radios
          1. 10.1.2.1. GSM
          2. 10.1.2.2. CDMA
          3. 10.1.2.3. Dual Band
          4. 10.1.2.4. iDEN
          5. 10.1.2.5. Wi-Fi
        3. 10.1.3. External Memory Storage
        4. 10.1.4. keyboard
          1. 10.1.4.1. keyboard_profiles
          2. 10.1.4.2. detecting_keyboards
          3. 10.1.4.3. Changing Keyboards
          4. 10.1.4.4. Porting Impact
        5. 10.1.5. Hardware Features
          1. 10.1.5.1. Determining by Model Number
          2. 10.1.5.2. Determining by API
          3. 10.1.5.3. Porting Impact
        6. 10.1.6. Screen Sizes
      2. 10.2. Understanding OS Differences
        1. 10.2.1. OS Availability and Updates
          1. 10.2.1.1. Determining the Vsersion
          2. 10.2.1.2. Version Effects
        2. 10.2.2. Porting Impact
          1. 10.2.2.1. The Lowest Common Denominator
          2. 10.2.2.2. Multiple Builds
          3. 10.2.2.3. Mandate Change
      3. 10.3. Understanding Language Differences
        1. 10.3.1. Localization Overview
        2. 10.3.2. Adding Multi-Language Support
          1. 10.3.2.1. Defining Resource Files
          2. 10.3.2.2. Understanding Bundles
          3. 10.3.2.3. Adding Resources to Java Classes
          4. 10.3.2.4. Testing Languages
        3. 10.3.3. Managing Resource Bundles
          1. 10.3.3.1. One Bundle, Many Implementors
          2. 10.3.3.2. One Bundle, Single Implementor
          3. 10.3.3.3. Multiple Bundles
        4. 10.3.4. Other Localization Concerns
          1. 10.3.4.1. Dealing with Images
          2. 10.3.4.2. Locale-aware Formatting
          3. 10.3.4.3. Dynamic Localization
        5. 10.3.5. Porting Impact
      4. 10.4. Understanding Platform Differences
        1. 10.4.1. Forget Porting the UI
        2. 10.4.2. Functionally Divide the App
        3. 10.4.3. Identify Language Reuse Opportunities
        4. 10.4.4. Back to the Drawing Board
      5. 10.5. App: Localized Text
        1. 10.5.1. Create the Resource Files
        2. 10.5.2. Modify Source
        3. 10.5.3. Testing Localization
      6. 10.6. Excelsior
    3. 11. Advanced Build Techniques
      1. 11.1. Moving Beyond Eclipse
        1. 11.1.1. The Command Line
          1. 11.1.1.1. rapc
            1. 11.1.1.1.1. Operations
            2. 11.1.1.1.2. Arguments
          2. 11.1.1.2. SignatureTool
        2. 11.1.2. Build Environments
          1. 11.1.2.1. Build Options
            1. 11.1.2.1.1. Batch Files
            2. 11.1.2.1.2. Ant Scripts
            3. 11.1.2.1.3. Makefiles
      2. 11.2. Versioning Strategies
        1. 11.2.1. Version Numbers
        2. 11.2.2. Distribution Options
        3. 11.2.3. Where's My Data?
          1. 11.2.3.1. Files
          2. 11.2.3.2. RMS
          3. 11.2.3.3. Blackberry Persistent Storage
      3. 11.3. Debugging and Logging
        1. 11.3.1. Capturing Logging
        2. 11.3.2. Visual Logging
        3. 11.3.3. On or Off?
        4. 11.3.4. Data Collection
      4. 11.4. Other Build Issues
        1. 11.4.1. Obfuscation
        2. 11.4.2. Packaging OTA Installs
        3. 11.4.3. Packaging ALX Installs
      5. 11.5. App: Logging, Building, and Updating
        1. 11.5.1. Adding a Logger
        2. 11.5.2. Build Script
        3. 11.5.3. Updates
      6. 11.6. Excelsior
  9. IV. The New Frontier
    1. 12. Push Services
      1. 12.1. Why Push?
        1. 12.1.1. Right Here, Right Now
        2. 12.1.2. A Few Examples
          1. 12.1.2.1. Medical Emergencies
          2. 12.1.2.2. Going Fast
          3. 12.1.2.3. Speedy Delivery
        3. 12.1.3. Faster and Easier
      2. 12.2. How Does It Work?
        1. 12.2.1. Old BES Model
        2. 12.2.2. New BIS Model
          1. 12.2.2.1. Push System Overview
          2. 12.2.2.2. Tooling Up
      3. 12.3. Server in Depth
        1. 12.3.1. Directing the Push
          1. 12.3.1.1. Sending a BES Push
          2. 12.3.1.2. Sending a BIS Push
        2. 12.3.2. Configuring the Push
          1. 12.3.2.1. BES PAP Push Attributes
          2. 12.3.2.2. BES RIM Push Attributes
          3. 12.3.2.3. BIS Push Attributes
        3. 12.3.3. Finding Your Audience
      4. 12.4. Infrastructure in Depth
        1. 12.4.1. BES MDS
        2. 12.4.2. BIS Push Proxy Gateway
        3. 12.4.3. Registering the Client
      5. 12.5. Client in Depth
      6. 12.6. App: Media Pusher
        1. 12.6.1. A Simple Pushing Server
        2. 12.6.2. A Listening Client
        3. 12.6.3. Testing Pushing
      7. 12.7. Excelsior
    2. 13. BlackBerry 6 UI
      1. 13.1. Progress Indicators
        1. 13.1.1. Progress Indicator Designa
          1. 13.1.1.1. AbstractProgressIndicatorModel
          2. 13.1.1.2. AbstractProgressIndicatorView
          3. 13.1.1.3. AbstractProgressIndicatorController
          4. 13.1.1.4. ProgressIndicatorListener
          5. 13.1.1.5. Adjustment
        2. 13.1.2. Activity Indicator
          1. 13.1.2.1. ActivityIndicatorModel
          2. 13.1.2.2. ActivityImageField
          3. 13.1.2.3. ActivityIndicatorView
          4. 13.1.2.4. ActivityIndicatorController
          5. 13.1.2.5. An Example
        3. 13.1.3. Progress Indicator
          1. 13.1.3.1. ProgressIndicatorModel
          2. 13.1.3.2. ProgressBarField
          3. 13.1.3.3. ProgressIndicatorView
          4. 13.1.3.4. ProgressIndicatorController
          5. 13.1.3.5. An Example
      2. 13.2. Overlapping Fields
        1. 13.2.1. Usage
        2. 13.2.2. Example
      3. 13.3. Tables and Lists
        1. 13.3.1. Table Design
        2. 13.3.2. Models
          1. 13.3.2.1. DataModel
          2. 13.3.2.2. AbstractTableModel
          3. 13.3.2.3. TableModelAdapter
          4. 13.3.2.4. TableModel
          5. 13.3.2.5. SortedTableModel
        3. 13.3.3. View Supporters
          1. 13.3.3.1. TemplateColumnProperties
          2. 13.3.3.2. TemplateRowProperties
          3. 13.3.3.3. RegionStyles
          4. 13.3.3.4. DataTemplate
          5. 13.3.3.5. SimpleListDataTemplate
          6. 13.3.3.6. RichListDataTemplate
          7. 13.3.3.7. SimpleList
          8. 13.3.3.8. RichList
        4. 13.3.4. Views
          1. 13.3.4.1. DataView
          2. 13.3.4.2. TableView
        5. 13.3.5. Controllers
          1. 13.3.5.1. DataController
          2. 13.3.5.2. TableController
        6. 13.3.6. Examples
      4. 13.4. Pick Me Up
        1. 13.4.1. FilePicker
        2. 13.4.2. HomeScreenLocationPicker
        3. 13.4.3. DateTimePicker
      5. 13.5. App: Screen Bling
        1. 13.5.1. Picking Files
        2. 13.5.2. Wait For It....
      6. 13.6. Excelsior
    3. 14. Cross-Platform Libraries
      1. 14.1. A Scanner, Darkly
        1. 14.1.1. Barcode Basics
          1. 14.1.1.1. Types of Barcodes
          2. 14.1.1.2. Mobile Scanner
        2. 14.1.2. Google's ZXing
          1. 14.1.2.1. BarcodeFormat
          2. 14.1.2.2. DecodeHintType
        3. 14.1.3. RIM's Wrappers
          1. 14.1.3.1. BarcodeDecoder
          2. 14.1.3.2. BarcodeDecoderListener
          3. 14.1.3.3. BarcodeBitmap and BitmapLuminanceSource
        4. 14.1.4. Return of Media Players
        5. 14.1.5. An Example
      2. 14.2. SQLite
        1. 14.2.1. Database Overview
        2. 14.2.2. Initializing a Database
        3. 14.2.3. Creating Tables
        4. 14.2.4. Inserting Data
        5. 14.2.5. Querying
        6. 14.2.6. Other SQL Commands
      3. 14.3. OpenGL
        1. 14.3.1. Acceleration Overview
        2. 14.3.2. APIs
        3. 14.3.3. An Example
      4. 14.4. App: Selection Memory
      5. 14.5. Additional Resources
      6. 14.6. Summit
  10. A. Codec Support
    1. A.1. Notes