Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AndroidScripting_KCDC2012

 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
Tweet

More Decks by Juan Gomez

Other Decks in Technology

Transcript

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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  5. 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

    View Slide

  6. 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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

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

    View Slide

  18. Friday, April 27, 12

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

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

    View Slide

  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

    View Slide

  25. 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

    View Slide

  26. 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

    View Slide

  27. WEBVIEWS AS ADVANCED UI


    Text to Speech
    <br/>var droid = new Android();<br/>var speak = function() {<br/>droid.eventPost("say",<br/>document.getElementById("say").value);<br/>}<br/>



    What would you like to say?
    label>





    Friday, April 27, 12

    View Slide

  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

    View Slide

  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

    View Slide

  30. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide