Slide 1

Slide 1 text

ANDROID SCRIPTING A Java-less approach to building apps Juan Gomez Android Dev @ Handmark, Inc Co-founder PythonKC Friday, April 27, 12

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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 (com.foo.FooActivity) Friday, April 27, 12

Slide 5

Slide 5 text

HOW DO I GET STARTED? • Download the Android SDK: http://developer.android.com/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

Slide 6

Slide 6 text

WHERE CAN I LEARN MORE? • Android’s Dev Guide http://developer.android.com/guide • Lots of Android Books • StackOverflow • Recommended resource: • http://commonsware.com/ • The Busy Coder’s Guide to Android Development • Yearly subscription Friday, April 27, 12

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

HOW TO DOWNLOAD? • Go to: http://code.google.com/p/android-scripting/ Friday, April 27, 12

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

INTERPRETERS Open up the App, click on Menu > View > Interpreters to get a list of the available interpreters Friday, April 27, 12

Slide 13

Slide 13 text

DOWNLOAD Click on Menu > Add to get a list of new interpreters you can install on your phone Friday, April 27, 12

Slide 14

Slide 14 text

INSTALL Click on an Interpreter from the list and this will download an .APK with the installer. Friday, April 27, 12

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

EDIT/RUN SL4A offers an environment to edit and run scripts on the phone but really limited Friday, April 27, 12

Slide 17

Slide 17 text

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 //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

Slide 18

Slide 18 text

Friday, April 27, 12

Slide 19

Slide 19 text

HELLO WORLD (PYTHON) import android droid = android.Android() droid.makeToast('Hello, Android!') print 'Hello world!' Friday, April 27, 12

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

WIFI List all surrounding WiFi networks and their connection information Friday, April 27, 12

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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 = Android.new 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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

USING NATIVE TYPES AND LIBRARIES import android from datetime import date droid = android.Android() today = date.today() droid.dialogCreateDatePicker(today.year, today.month, today.day) droid.dialogShow() selectedDate = droid.dialogGetResponse().result first_date = date(selectedDate['year'], selectedDate['month'], selectedDate['day']) droid.dialogCreateDatePicker(today.year, today.month, today.day) 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

Slide 26

Slide 26 text

SIMPLE TWITTER CLIENT (RUBY) require 'android' require 'net/http' droid = Android.new url = URI.parse("http://twitter.com/statuses/update.xml") req = Net::HTTP::Post.new(url.path) req.basic_auth('user', 'password') status = droid.getInput 'Twitter Update', "What's going on?" req.set_form_data({'status' => status["result"], 'source' => 'Android'}) response = Net::HTTP.new(url.host, 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

Slide 27

Slide 27 text

WEBVIEWS AS ADVANCED UI Text to Speech var droid = new Android(); var speak = function() { droid.eventPost("say", document.getElementById("say").value); } What would you like to say? Friday, April 27, 12

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

PACKAGING YOU APP FOR THE GOOGLE PLAY STORE • For this step you will need Eclipse :( • Download the skeleton Android project from here: http://android-scripting.googlecode.com/hg/android/ script_for_android_template.zip • Follow these instructions to configure the project: http://code.google.com/p/android-scripting/wiki/SharingScripts • Make sure you can generate an APK and do a test install. • Follow these instructions to sign your APK: http://developer.android.com/guide/publishing/app-signing.html • Viola! you can upload your APK to the Play Store Friday, April 27, 12

Slide 31

Slide 31 text

THAT’S IT FOR ME! Friday, April 27, 12

Slide 32

Slide 32 text

Thanks To Our Sponsors Friday, April 27, 12

Slide 33

Slide 33 text

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: http://www.meetup.com/pythonkc/events/62339552 Friday, April 27, 12

Slide 34

Slide 34 text

@_JUANDG http://speakerdeck.com/u/juandg/p/androidscripting_kcdc2012# Friday, April 27, 12