About Metric Rat

Facilities Manager by trade, working at an independent school for children with special needs (autism & learning difficulties). Enjoys classic cars (1962 MG Midget owner), running an L322 Range Rover (and also an Audi cab 3.0 and MX5, whilst constantly reparting my daughters Ford Ka) and fiddling with computers (which generally means fixing everyone elses problems with Windows, whilst I sail along happily on Xubuntu Linux :) ). Play guitar, bass and ukelele for fun, and when time allows do a spot of sailing and keep active in the garden. My blog is in essence an echo of my daily trials and tribulations and triumphs :)

AppInventor: HOW TO: Turn your AI2 app into a Voice Activated App (Google Now)

Leading on from my initial enquiry here:

Using Google Now on your Android phone you can start several “Google” apps with voice commands.
It is possible to convert your AI2 app for the same thing. For the purposes of this howto:
The apk filename is  MyVoiceApp.apk
The appname is “My Voice App”   << what you see in the App Name on Screen 1 Designer
1. What you will need:
  • A PC
  • apktool (Windows/Linux) or AppToMarket (Windows)
  • Your apk file
2. Decode your apk using your preferred decoder/encoder
3. Browse to the res folder in the decoded apk and create a new folder called xml
4. Browse into the xml folder you have just created and create a new text file called searchable.xml
5. Open up searchable.xml and copy and paste this into it:


whilst replacing “My Voice App” with the appname of your app

Save searchable.xml.
6. In the root folder of your expanded apk, find the file “AndroidManifest.xml” and open it with your preferred text editor.
It may look something like this:  (the apkfilename and the appname should be correct in this file and match that of your apk)


7. You now need to add a new intent filter section and some configuration lines. Do this just above the <intent-filter> line

This is what you should add:


and your resultant AndroidManifest.xml file should then look like this:


Once this is done, save AndroidManifest.xml, and your work on editing the apk is done!

8. Now re-encode your apk using your preferred encoder/decoder, deal with the signing and zip aligning of apk as needed.
Sideload you new apk onto your device
Get Google Now running and ask it to: “run ‘My Voice App'” or “start ‘My Voice App'”  (both seem to work for different things???)
Your app should open up from closed or in the background.
If you need help with how to use apktool, just ask.
Credits due to the original poster on techrepublic here

AppInventor: HOWTO: Upload Image to Google Drive using base64 and Google Apps Script Web App

This question was asked on the forum recently, and due to changes in google authentication has become more difficult to achieve. However, by using a “man in the middle” web app, it is possible to upload images to a private or public google drive folder, using base64 to convert the image to a string, and back again!

Credits must go to TANAIKE whose blog post on achieving this in several different ways, primarily using curl from a command line, lead me to a solution, and also to ghostfox for the base64 conversion extension over on thunkable.
I used the imagePicker to select files for upload, as this provides a full path to the file. It doesn’t have to be done this way. To upload image assets in your app for the base64 extension, one must first copy the image to the internal sdcard.
To wet your whistle, here is a video of a sample app in action:
You are going to need three elements for all this to work (assuming you already have a google account in place!):
  1. A google drive folder to upload your files to, along with the ID for that folder
  2. A google apps script web app to handle the decoding of the base64 string
  3. An AI2 app to select and upload the file from
Lets get started
1. Google Drive Folder
Create a google drive folder for your uploads.
Note the folder ID
Decide on sharing options for your folder
2. Google Apps Script Web App
Somewhere else in your google drive, create a new Google Apps Script and name it accordingly
In the already created code.gs add the following code, overwriting the default code

Replace FOLDER ID HERE with your chosen folder ID
Save the project and the publish as a web app, running the app as you, and available to anyone.
You should be asked to authorise permissions, do so. If you are not asked then select the doGet() function and run this to get permissions sorted
You will also get a popup telling you the url to your published app (the one in the box). Note this down as you will need this for your AI2 app.
The web app requires three parameters: a filename, a file type, and the file itself ( in this case the base64 string )
3. AI2 App
These are the blocks used in the sample app from the video.
The only item you need to edit for it to work is the value for Web1.Url in the Button.click event. This is the url to the web app created earlier.

NOTE: after writing this howto, I discovered that some devices, or devices in some locales will convert jpeg extensions to jpg, and others from jpg extensions to jpeg

If when your image is selected by the listpicker and comes through as jpeg please change your ImagePicker1.AfterPicking blocks to the following: (and additional if statement to account for the jpeg extension

You should now have everything you need to upload files to google drive :)

aia attached :) uploadImage2GoogleDrive

AppInventor: HOWTO: Dynamic Scrolling Image List with Titles using webviewer (with select)

Been working on this for a while, time to share the fruits of my labours!
There are many different ways to achieve much the same thing, but I wanted to have a go at building things up from scratch, just use pure javascript, and provide some user functionality in the process.
Youtube video to start things off:
How it works:
The Ai2 blocks feed the html file with all the data: image files, file locations, titles and subtitles, shape of image (square/circle), colour scheme.
The html file pulls all this information in through the webviewstring, and then by creating arrays from the webviewstring, dynamically builds a “card” for each image.
Note the use of classes from the w3.css and w3mobile.css to assist with the cards layout
A click on the image returns the file to the AI2 app and displays it.
Developers can choose to set all the variables to their liking, or can also provide a settings area for the user to do likewise (further demo hopefully coming on this!)
A couple of Taifun’s wonderful extensions used.

aia attached :)  ImagePicker2

AppInventor: HOWTO: Test If Image Exists on Device (no extension required)

This one has been bugging me for a few days, and despite the wonderfulness of the File extension from Taifun, I have been searching for a way to test for the existence of an image file using just AI2 blocks and components.

Why do you need this? (for whatever reason you don’t want to use an extension
You may have a situation where you download image files to the app when the user visits a particular part of the app.
Once downloaded, it makes more sense to use the image on the device, as opposed to downloading it again.
My solution was to use a little bit of javascript, a webviewer with webviewstring, a clock and some logic.
Works with webviewer not visible as well
I also used the file component to install the html file needed to the sdcard
Default location is file:///mnt.sdcard, but subdirectories work too, if the additional path is added
My example simply check for an image file, and if it exists displays it, along with a message.
If the file doesn’t exist, displays a different “Sorry” image in the app, and a message.
Developers will be able to apply their own logic, so that if the file is not on the device, it
can be downloaded from online resources.
Most of the components used are likely to already be in an app whilst developing, so often simply a matter of reuse
Please note, in production, for the filepath for the initial webviewstring and for the “else” setting of Image1.Picture
you may not need to include “file:///mnt/sdcard”.
Also you can create a specific directory on the sdcard when you create the html file in Screen Initialise.


Credits: in html

aia attached :) TestForFile


ApInventor: HOWTO: Get Data from Private Google Sheet with A Google WebApp

I have done this before in another HOWTO: Download Google Sheet as CSV

but this one uses an intermediary Google Apps Script Web App to grab the data
This example uses a google sheet set as accessible only to me and the standalone
google apps script is set similarly. The script runs as me, but can be used by anyone
The app calls the script using the web component, then the script returns the specified
data to the app, which can then be used as a master list, and manipulated thereon
The example shows all the data retrieved, and then offers a spinner to choose a name
from the master list, and shows the email associated with the name
I used the obsfuscated text block for the script link.
  • protects your spreadsheet itself
  • allows anyone to access the data needed for the app, while not storing it on the app
  • easy data manipulation using the lists facility in the app
  • provides a pseudo api solution for other platforms and variants (e.g. Thunkable X at the time of writing)
  • impress your friends 😉

note: I grabbed some dummy data from Mockaroo useful for this sort of thing


I won’t go into detail about how to create a google apps script web app, well enough covered elsewhere


Note the work done with the spinner. In the Web.gottext block I replace the first item in the list with the “header” text i want for the spinner.

I use Jorg Kowalski’s development of my spin on resetting the spinner


aia attached – should work using the spreadsheet and script I have set up, or create your own


Goodbye Awesome Tables :(

It was all going so well… Having found Awesome Tables in 2016, the creation of tables , charts and graphs suddenly became simple and straight-forward, and made me look cool in front of my colleagues :)

Then I started checking the view stats, in November last we hit 926 views! Guess what happens when you (routinely) hit 1000 views, regardless of the number of different tables, and any within the same domain? Awesome Tables slaps a £5000 per annum fee on your usage!

My educational not-for-profit organisation was not going to stump up for that, no way, no how. I needed a solution, and alternative. I knew that Awesome used javascript and Google Visualizations / Charts on its back end (not forgetting the html and css), I therefore decided to apply myself to the somewhat steep learning curve of google charts/visualizations. Continue reading

Google Visualization Table with Modal on Selection

Couldn’t find anything on this, other than a post about angular.js, so had a go at displaying a modal popup after making a row selection on a google visualization table. I had already got to grips with creating modals and used the code provided by W3-Modal.css, so I simply had to put the pieces together. I used the spreadsheet query method for generating data, if done using a google apps script, it is possible (see other posts) to keep the spreadsheet private. I also used the W3.css file for formatting and layout.

The html page created to do all of this is well commented and you can see the results using the demo after the code. Continue reading

Google Visualization – Gauges

This is fun, a simple couple of gauges linked together, one showing revolutions per minute (rpm) the other showing speed, based upon 5th gear in a L322 Range Rover! I guess with more time than I have got it would be possible to code for the entire gearbox 😉


Continue reading

Google Visualization – Basic Slideshow from Google Sheet

Here is the code for a simple automatic slideshow using google visualizations

Example Slideshow