Share
Embed
AndroidScripting_KCDC2012
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
Transcript
34 slides
-
ANDROID SCRIPTING A Java-less approach to building apps Juan Gomez
Android Dev @ Handmark, Inc Co-founder PythonKC Friday, April 27, 12 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
INTERPRETERS Open up the App, click on Menu > View
> Interpreters to get a list of the available interpreters Friday, April 27, 12 -
DOWNLOAD Click on Menu > Add to get a list
of new interpreters you can install on your phone Friday, April 27, 12 -
INSTALL Click on an Interpreter from the list and this
will download an .APK with the installer. Friday, April 27, 12 -
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 -
EDIT/RUN SL4A offers an environment to edit and run scripts
on the phone but really limited Friday, April 27, 12 -
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 -
HELLO WORLD (PYTHON) import android droid = android.Android() droid.makeToast('Hello, Android!')
print 'Hello world!' Friday, April 27, 12 -
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 -
WIFI List all surrounding WiFi networks and their connection information
Friday, April 27, 12 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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 -
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