This session will provide an introduction to Android and will illustrate how SL4A (Scripting Layer for Android) allows us to create Android apps using a variety of programming languages including: Python, Javascript, Perl, JRuby and Lua. We’ll demonstrate how to perform simple tasks like accessing the GPS location, taking a picture or sending a text message without writing a single line of Java code.
Then we’ll delve deeper into Android’s APIs and learn how to create a full blown Android App using a combination of Javascript and Python, complete with packaging the app for distribution on the Android Market.


Juan Gomez

April 27, 2012


  1. ANDROID SCRIPTING A Java-less approach to building apps Juan Gomez

    Android Dev @ Handmark, Inc Co-founder PythonKC Friday, April 27, 12
  2. AGENDA • Android 101 • Scripting Layer for Android (SL4A)

    • Basic tasks (WiFi, GPS, camera, SMS) and basic UI • Using WebViews and Javascript for better UIs • Advanced Scripts (Twisted, PyBluez) • Packaging your scripts on an APK • Q & A Friday, April 27, 12
  3. ANDROID 101 An Android application is actually a collection of

    several components, each defined in a file called AndroidManifest.xml The 4 main types of components are: • Activities • Services • Content Providers • Broadcast Receivers Apps are packaged on an APK file (myApp.apk) Friday, April 27, 12
  4. INTENTS • Apps can communicate with each other by providing

    and consuming each other’s Intents • Intents “link” activities, services, and receivers together • Intents consists of • An action (i.e. ACTION_VIEW) • Categories (i.e. CATEGORY_DEFAULT) • A URI (i.e. content://contacts/people/123) • “Extras” metadata • Intents can also be sent to hard-coded class names ( Friday, April 27, 12
  5. HOW DO I GET STARTED? • Download the Android SDK: • Add Android platforms and other packages to your SDK • Install the ADT plug-in for Eclipse (optional) • Enable app side-loading on your phone: • Settings > Application > Unknown Sources Friday, April 27, 12
  6. WHERE CAN I LEARN MORE? • Android’s Dev Guide

    • Lots of Android Books • StackOverflow • Recommended resource: • • The Busy Coder’s Guide to Android Development • Yearly subscription Friday, April 27, 12
  7. SCRIPTING LAYER FOR ANDROID (SL4A) • Brings scripting languages to

    Android • Allows you to edit and execute scripts and interactive interpreters directly on the Android device. • Scripts have access to many of the APIs available to full- fledged Android apps. • Supported languages include: Python, Perl, JRuby, Lua, BeanShell, JavaScript and Tcl • There’s limited support for PHP and Shell scripts Friday, April 27, 12
  8. SL4A ARCHITECTURE • As it name implies, SL4A sits between

    the actual Android JVM (Dalvik) and the executable Scripts. • The Facade API exposes a subset of Android system API's via JSON RPC calls • Only the parts of Android's APIs which has been wrapped by facades are available to interpreter • This is a fundamental feature of SL4A added by Google to avoid security concerns. AUTHENTICATION
  9. WHAT CAN SL4A DO? • Handle intents • Start activities

    • Make phone calls • Send text messages • Scan bar codes • Poll location and sensor data • Use text-to-speech &IGURE
  10. HOW TO DOWNLOAD? • Go to: Friday, April 27,

  11. HOW TO USE IT? SL4A installs as an App on

    your phone, you need to install separate interpreters for each language you want to use Friday, April 27, 12
  12. INTERPRETERS Open up the App, click on Menu > View

    > Interpreters to get a list of the available interpreters Friday, April 27, 12
  13. DOWNLOAD Click on Menu > Add to get a list

    of new interpreters you can install on your phone Friday, April 27, 12
  14. INSTALL Click on an Interpreter from the list and this

    will download an .APK with the installer. Friday, April 27, 12
  15. SCRIPTS When you open the SL4A app you get a

    list of your available scripts. You can use a quick action menu to run, edit, save or delete Friday, April 27, 12
  16. EDIT/RUN SL4A offers an environment to edit and run scripts

    on the phone but really limited Friday, April 27, 12
  17. USING ADB PUSH/PULL • It’s easier to edit scripts on

    your computer using your favorite text editor and leverage the Android Debug Bridge (ADB) to load them on the phone. • ADB is installed on /<android_sdk_folder>/platform-tool/ • adb pull /mnt/sdcard/sl4a/scripts/Camera.js ~/Documents/ sl4a_scripts/ • adb push ~/Documents/sl4a_scripts/Camera.js /mnt/sdcard/sl4a/ scripts Friday, April 27, 12
  18. Friday, April 27, 12

  19. HELLO WORLD (PYTHON) import android droid = android.Android() droid.makeToast('Hello, Android!')

    print 'Hello world!' Friday, April 27, 12
  20. TAKING A PICTURE (JS) load("/sdcard/ com.googlecode.rhinoforandroid/extras/rhino/ android.js"); var droid =

    new Android(); result = droid.cameraCapturePicture("/mnt/ sdcard/sl4a/pic.jpg", true); Friday, April 27, 12
  21. WIFI List all surrounding WiFi networks and their connection information

    Friday, April 27, 12
  22. LISTING WIFI NETWORKS (JS) load("/sdcard/com.googlecode.rhinoforandroid/extras/rhino/ android.js"); var droid = new

    Android(); wifi_on = droid.checkWifiState(); if (wifi_on) { success = droid.wifiStartScan(); if (success) { list_of_networks = droid.wifiGetScanResults(); for (var i = 0; i < list_of_networks.length; i++) { for (attr in list_of_networks[i]) { print(attr + ": " + list_of_networks[i][attr]); } print("\n"); } } droid.makeToast("Done obtaining list of WiFi networks!"); } else { droid.makeToast("WiFi radio is off"); } Friday, April 27, 12
  23. USING GPS AND SMS (RUBY) require "android"; def get_location(droid) droid.startLocating()

    droid.eventWaitFor("location") raw_location = droid.readLocation() droid.stopLocating() return raw_location["result"]["network"] end def format_address(loc_info) return loc_info["feature_name"] + " " + loc_info["thoroughfare"] + " " + loc_info["locality"] + ", " + loc_info["admin_area"] + " " + loc_info["postal_code"] end def get_address(droid, location) loc_info= droid.geocode(location["latitude"], location["longitude"]) return format_address(loc_info["result"][0]) end droid = location = get_location droid address = get_address droid, location phone = droid.pickPhone droid.smsSend phone["result"], "Greetings from SL4A, I'm at " + address puts "done sending SMS with location" Friday, April 27, 12
  24. BASIC UI SL4A provides basic Android UI elements to be

    used in scripts. But these UI elements are generally very limited Friday, April 27, 12
  25. USING NATIVE TYPES AND LIBRARIES import android from datetime import

    date droid = android.Android() today = droid.dialogCreateDatePicker(today.year, today.month, droid.dialogShow() selectedDate = droid.dialogGetResponse().result first_date = date(selectedDate['year'], selectedDate['month'], selectedDate['day']) droid.dialogCreateDatePicker(today.year, today.month, droid.dialogShow() selectedDate = droid.dialogGetResponse().result second_date = date(selectedDate['year'], selectedDate['month'], selectedDate['day']) timediff = abs(first_date - second_date) droid.dialogCreateAlert("Difference", "Days: " + str(timediff.days)) droid.dialogSetPositiveButtonText('OK') droid.dialogShow() Friday, April 27, 12
  26. SIMPLE TWITTER CLIENT (RUBY) require 'android' require 'net/http' droid = url = URI.parse("") req = req.basic_auth('user', 'password') status = droid.getInput 'Twitter Update', "What's going on?" req.set_form_data({'status' => status["result"], 'source' => 'Android'}) response =, url.port).start do |http| http.request(req) end if response.code == "200" droid.makeToast "Your toot was successfully sent." end Friday, April 27, 12
  27. WEBVIEWS AS ADVANCED UI <html> <head> <title>Text to Speech</title> <script>

    var droid = new Android(); var speak = function() { droid.eventPost("say", document.getElementById("say").value); } </script> </head> <body> <form onsubmit="speak(); return false;"> <label for="say">What would you like to say?</ label> <input type="text" id="say" /> <input type="submit" value="Speak" /> </form> </body> </html> Friday, April 27, 12
  28. BACKGROUND SERVICE import android droid = android.Android() droid.webViewShow('file:///sdcard/sl4a/scripts/ text_to_speech.html') while

    True: result = droid.eventWaitFor('say').result if result is not None: droid.ttsSpeak(result['data']) You can create a background service that acts as a controller in you favorite language to support your Web UI Friday, April 27, 12
  29. ADVANCED SCRIPTS • Python is by far the most complete

    language on SL4A • You can import more advanced libraries that are not part of the Python Standard Library. • Like PyBluez for Bluetooth • Or Twisted • Twisted is an extremely powerful event- driven networking engine written in Python. • Projects like BitTorrent and Launchpad use twisted as their networking engine. Friday, April 27, 12

    this step you will need Eclipse :( • Download the skeleton Android project from here: • Follow these instructions to configure the project: • Make sure you can generate an APK and do a test install. • Follow these instructions to sign your APK: • Viola! you can upload your APK to the Play Store Friday, April 27, 12
  31. THAT’S IT FOR ME! Friday, April 27, 12

  32. Thanks To Our Sponsors Friday, April 27, 12

  33. BEGINNERS PYTHON WORKSHOP • The Beginners Python Workshop is a

    2-day free event focused on teaching the basics of programming in the Python language. • Everybody is encouraged to attend, regardless of your previous experience with programming • The only requirements to attend are a laptop and a willingness to learn. • When: Friday, June 22nd 6pm - 10pm Saturday, June 23rd 10am - 4pm • Where: UMKC Campus 302 Flarsheim Hall 5110 Rockhill Road, Kansas City, MO RSVP at: Friday, April 27, 12
  34. @_JUANDG Friday, April 27, 12