Monday, February 28, 2011

Eclipse Android Autocomplete Hangs

Here is the solution to that terrible 1.2 second pause during autocomplete in the Android ADT API:

Thursday, February 24, 2011

Hot Swap AHCI Bay Rocks Socks

OK guys this Super-Micro AHCI hot-swap SATA enclosure rocks socks. I am super happy.

Today is boxing day for my huge collection of external drives. I am no longer a slave to your crappy firewire interface, stupid power bricks or extreme heat generation and low quality fans!

Now I use a fully backed AHCI hotswap 8-bay and buy the SATA drives internal and on the cheap!

Tuesday, February 22, 2011

I'm backing Google on this one

Guess what? A loose alliance of hardware and software manufacturers are going to create an ecosystem that topples Apple tech-monotone

Thursday, February 17, 2011

Adding EULA or Introduction Screen to Android App

Have some important text that always needs to be displayed and approved by the user when it changes? Common use case includes compliance notifications, license text or tutorials.

This useful Android development blog post outlines an excellent pattern for adding an EULA to your Android Java application:

Wednesday, February 16, 2011

Android Disappointment

Shouldn't Android / Java have a CORE SDK / Language feature like "File.IO.File.Copy()" because it really seems obvious to me.

I am totally shocked that I spent 30 minutes trying to determine the optimal way to copy a file and it is like 30 lines long and looks dangerous.

Why not make it simple? Write once, run anywhere. What happened to that?

Servers Direct

I have been having a wonderful time working with the system integration Servers Direct.

After more than five years of upgrading, extending and repairing a pair of workstations from earlier in the decade I decided to upgrade.

The two machines I was using were AMD x64 CPU systems and were built around gaming motherboards from DFI and NVidia. Never really intended as gaming boxes, I suffered a lot from expandability, heat and space issues using essentially consumer grade components for workstation grade work.

So this time I decided to make sure that it got done, and got done right. To that end I selected only workstation class components to build a machine that is certain to last comfortably for several long years of hard service.

For me, when I think about workstation class motherboards I think about Tyan and SuperMicro.

In the 1990s I was a die-hard Intel user and made the switch to AMD around the time of the Tyan Tiger and the Opteron (around 2003.) I ended up settling on Athlon64 processors in the end, but the Intel components were retired.

Now, in 2011 I have returned to my roots with the Xeon and Intel chipsets. Thank you Super Micro and Servers Direct.

More to come in future posts about the new computer experience ...

Windows 7 x64 Woes

I am having some small issues as I work towards adjusting to the new operating system.

One issue that hurts me is that I cannot seem to make PreviewExtractor.exe (x86) like the Windows 7 environment, even with XP SP2 compatibility turned on.

If you are not using Windows 7, I suggest you take a look at this:

Really useful if you need fast JPG of NEF or RAW files.

Tuesday, February 15, 2011

Chrome MailTo: Links in Windows 7 x64

Windows 7 seems to have a lot of configuration issues. It doesn't come with (at least my disk) mapping for the MailTo: URL type.

I installed this Google Chrome Extension to make it work in my browser.

Monday, February 14, 2011

Robotium Enables Black Box Unit Testing with Android Mobile Applications and Games

JUnit is the unit testing framework that really started it all and has a great number of mature features and add-on projects. One such project is Robotium which enabled wonderful black box testing of your Android application:

http://code.google.com/p/robotium/

You can even control it with the very friendly Selenium Remote-Control:


While I was searching Twitter for real-time updates to these subjects that I could include in this blog, I found a reference to RoboGuice which is an Android DI / IOC container. I did not know it existed, but I do like Guice:


Perhaps something to look at for an upcoming complex application ...

G-Mail Tasks Day #1

I am going to start a few day adventure based on using Google Tasks to keep track of my to do issue list.

Email To Tasks
I will make use of the "Add E-Mail to Tasks" feature found under the "More Actions" button.

Tasks To Email
I will make use of the "E-Mail Tasks to Me" to have a list on my phone or when I need a summary on a big screen.

Interesting Android UI Study

This interesting Android mobile UI study includes side-by-side comparisons of several popular social media applications running on Android.

Why I am not Publishing on Amazon.com Android App Store

Dear Amazon,

I am still trying to find someone to talk to about the DRM system! I've been poking around on Twitter and reading blogs but have had little success.

Most of the information I've been able to locate is regarding how to remove the DRM protection, which seems to be more detailed than Amazon's own docs.

Any feedback or explanation on the lack of details? Seems like a pretty big miss. Here is what I get from Google.

Documentation, Source Code and Reference Implementations:

I would really like to use your Amazon Application Store, but you are making it very hard to entrust my APK and hard work to your DRM system.

Tuesday, January 25, 2011

Blocking E-Freedom

EFreedom.com is an annoying StackOverflow clone.

You can block is by adding "-site:efreedom.com" to your Google searches.

Best way to do this using Chrome:

1> Options
2> Default Search Providers -> Click "Manage"
3> Add "-site:efreedom.com" to your Android search customs OR all Google searches

Or you could use use it ad-hoc

Monday, January 10, 2011

Make Google Chrome Search Twitter

Options > Default Search > Manage

Select "Add" in the Mange Search Providers dialog

Field1: Twitter
Field2: tw
Field3: http://twitter.com/#!/search/%s

now just type "tw Star Traders" into Google Chrome to search twitter for Star Traders

Make Google Chrome Search Checkout

Options > Default Search > Manage

Select "Add"

Field1: Checkout
Field2: Checkout
Field3: https://checkout.google.com/sell/searchResults?searchField=%s&searchSubmit=Search&ordersTable=1&backToSearch=false&backToInbox=1&showClosed=false

Make Chrome Search Android Documentation

Open: Options
In the "Default Search" section of "Basics" configuration, find the "Manage" button for Search Providers.

To add a Google Android search provider, in the Search dialog, press "Add"

Field 1: Android
Field 2: Droid
Field 3: http://developer.android.com/search.html#q=%s&t=0

Now you can type "Droid View" to search the Android documentation for the word 'View'

Try it out!

Wednesday, December 15, 2010

WTF

12-15 15:32:45.037: WARN/PackageManager(12002): Unknown permission android.permission.ADD_SYSTEM_SERVICE in package com.android.phone
12-15 15:32:45.057: WARN/PackageManager(12002): Not granting permission android.permission.ACCESS_DRM to package com.htc.fm (protectionLevel=2 flags=0xbe65)
12-15 15:32:45.067: WARN/PackageManager(12002): Unknown permission android.permission.RECEIVE_SYNC_DM_NOTIFICATION in package com.htc.android.futuredial
12-15 15:32:45.067: WARN/PackageManager(12002): Unknown permission com.android.providers.htccdma.Specific in package com.htc.android.futuredial
12-15 15:32:45.067: WARN/PackageManager(12002): Unknown permission android.permission.FOTA_UPDATE in package com.htc.android.futuredial
12-15 15:32:45.077: WARN/PackageManager(12002): Unknown permission android.permission.QUERY_DRM in package com.htc.android.mail
12-15 15:32:45.087: WARN/PackageManager(12002): Unknown permission com.google.android.providers.gmail.permission.READ_GMAIL in package com.htc.android.mail
12-15 15:32:45.087: WARN/PackageManager(12002): Unknown permission android.permission.RECEIVE_EMAIL_NOTIFICATION in package com.htc.android.mail
12-15 15:32:45.097: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.READ_ACCOUNT in package com.htc.htcmailwidgets
12-15 15:32:45.097: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.WRITE_ACCOUNT in package com.htc.htcmailwidgets
12-15 15:32:45.097: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.READ_MAIL in package com.htc.htcmailwidgets
12-15 15:32:45.097: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.WRITE_MAIL in package com.htc.htcmailwidgets
12-15 15:32:45.107: WARN/PackageManager(12002): Not granting permission android.permission.ACCOUNT_MANAGER to package com.htc.htctwitter (protectionLevel=2 flags=0xbe45)
12-15 15:32:45.117: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_ASSISTED_GPS in package com.htc.htclocationservice
12-15 15:32:45.117: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_NETWORK_LOCATION in package com.htc.htclocationservice
12-15 15:32:45.117: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_LOCATION in package com.htc.htclocationservice
12-15 15:32:45.117: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_GPS in package com.htc.htclocationservice
12-15 15:32:45.137: WARN/PackageManager(12002): Unknown permission android.permission.RAISED_THREAD_PRIORITY in package com.android.mms
12-15 15:32:45.137: WARN/PackageManager(12002): Unknown permission android.permission.FULLSCREEN in package com.android.mms
12-15 15:32:45.137: WARN/PackageManager(12002): Unknown permission com.google.android.providers.gmail.permission.READ_GMAIL in package com.android.mms
12-15 15:32:45.147: WARN/PackageManager(12002): Unknown permission android.Manifest.permission.BLUETOOTH in package com.google.android.fieldtrial
12-15 15:32:45.147: WARN/PackageManager(12002): Not granting permission android.permission.ACCESS_DRM to package com.android.htccontacts (protectionLevel=2 flags=0xbe45)
12-15 15:32:45.147: WARN/PackageManager(12002): Unknown permission com.android.providers.im.permission.READ_ONLY in package com.android.htccontacts
12-15 15:32:45.157: WARN/PackageManager(12002): Unknown permission com.android.providers.im.permission.WRITE_ONLY in package com.android.htccontacts
12-15 15:32:45.157: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_LOCATION in package com.android.htccontacts
12-15 15:32:45.157: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_NETWORK_LOCATION in package com.android.htccontacts
12-15 15:32:45.167: WARN/PackageManager(12002): Unknown permission com.htc.socialnetwork.plurk.permission.useprovider in package com.android.htccontacts
12-15 15:32:45.167: WARN/PackageManager(12002): Unknown permission com.htc.permission.SOCIAL_NETWORK in package com.android.htccontacts
12-15 15:32:45.167: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.READ_ACCOUNT in package com.android.htccontacts
12-15 15:32:45.167: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.WRITE_ACCOUNT in package com.android.htccontacts
12-15 15:32:45.167: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.READ_MAIL in package com.android.htccontacts
12-15 15:32:45.167: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.WRITE_MAIL in package com.android.htccontacts
12-15 15:32:45.167: WARN/PackageManager(12002): Unknown permission com.android.providers.htccdma.Specific in package com.android.htccontacts
12-15 15:32:45.167: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_DOWNLOAD_DATA in package com.android.updater
12-15 15:32:45.167: WARN/PackageManager(12002): Unknown permission android.permission.FOTA_UPDATE in package com.android.updater
12-15 15:32:45.187: WARN/PackageManager(12002): Unknown permission com.android.launcher.permission.READ_SETTINGS in package com.android.settings
12-15 15:32:45.187: WARN/PackageManager(12002): Unknown permission com.android.launcher.permission.WRITE_SETTINGS in package com.android.settings
12-15 15:32:45.197: WARN/PackageManager(12002): Unknown permission android.permission.FULLSCREEN in package com.htc.pdfreader
12-15 15:32:45.197: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_ASSISTED_GPS in package com.htc.android.locationpicker
12-15 15:32:45.197: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_NETWORK_LOCATION in package com.htc.android.locationpicker
12-15 15:32:45.197: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_LOCATION in package com.htc.android.locationpicker
12-15 15:32:45.207: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_GPS in package com.htc.android.locationpicker
12-15 15:32:45.207: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.READ_ACCOUNT in package com.htc.htccontactwidgets
12-15 15:32:45.217: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.WRITE_ACCOUNT in package com.htc.htccontactwidgets
12-15 15:32:45.227: WARN/PackageManager(12002): Unknown permission android.webkit.permission.PLUGIN in package com.adobe.flashplayer
12-15 15:32:45.247: WARN/PackageManager(12002): Unknown permission com.android.providers.im.permission.READ_ONLY in package com.google.android.apps.maps
12-15 15:32:45.247: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_GPS in package com.telenav.app.android.sprint
12-15 15:32:45.247: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_LOCATION in package com.telenav.app.android.sprint
12-15 15:32:45.247: WARN/PackageManager(12002): Not granting permission android.permission.DEVICE_POWER to package com.telenav.app.android.sprint (protectionLevel=2 flags=0xbe45)
12-15 15:32:45.267: WARN/PackageManager(12002): Unknown permission com.android.providers.htccdma.Specific in package com.google.android.epst
12-15 15:32:45.277: WARN/PackageManager(12002): Not granting permission android.permission.ACCESS_CHECKIN_PROPERTIES to package com.google.android.apps.googlevoice (protectionLevel=3 flags=0xbe44)
12-15 15:32:45.277: WARN/PackageManager(12002): Unknown permission com.google.android.apps.googlevoice.REMOTE_INTENT in package com.google.android.apps.googlevoice
12-15 15:32:45.277: WARN/PackageManager(12002): Not granting permission android.permission.INSTALL_PACKAGES to package nextapp.systempanel (protectionLevel=3 flags=0xbe44)
12-15 15:32:45.287: WARN/PackageManager(12002): Unknown permission com.android.providers.htccdma.Specific in package com.htc.android.htcsetupwizard
12-15 15:32:45.287: WARN/PackageManager(12002): Unknown permission com.htc.VzWBackupAssistantClient.PROVISION in package com.htc.android.htcsetupwizard
12-15 15:32:45.297: WARN/PackageManager(12002): Unknown permission com.google.android.providers.gmail.permission.WRITE_GMAIL in package com.qo.android.htc
12-15 15:32:45.297: WARN/PackageManager(12002): Unknown permission com.google.android.providers.gmail.permission.READ_GMAIL in package com.qo.android.htc
12-15 15:32:45.297: WARN/PackageManager(12002): Unknown permission com.android.email.permission.ACCESS_PROVIDER in package com.qo.android.htc
12-15 15:32:45.297: WARN/PackageManager(12002): Unknown permission com.android.email.permission.READ_ATTACHMENT in package com.qo.android.htc
12-15 15:32:45.297: WARN/PackageManager(12002): Not granting permission android.permission.DEVICE_POWER to package com.htc.android.teeter (protectionLevel=2 flags=0xbe45)
12-15 15:32:45.307: WARN/PackageManager(12002): Unknown permission com.htc.permission.SOCIAL_NETWORK in package com.htc.album
12-15 15:32:45.317: WARN/PackageManager(12002): Unknown permission com.google.android.providers.gmail.permission.READ_GMAIL in package com.htc.album
12-15 15:32:45.317: WARN/PackageManager(12002): Unknown permission android.permission.INJECT_AUDIO_VOLUME_SETTINGS in package com.htc.album
12-15 15:32:45.317: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.READ_ACCOUNT in package com.htc.calendar
12-15 15:32:45.317: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.WRITE_ACCOUNT in package com.htc.calendar
12-15 15:32:45.327: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.READ_MAIL in package com.htc.calendar
12-15 15:32:45.327: WARN/PackageManager(12002): Unknown permission com.htc.android.mail.permission.WRITE_MAIL in package com.htc.calendar
12-15 15:32:45.327: WARN/PackageManager(12002): Not granting permission android.permission.CLEAR_APP_USER_DATA to package com.htc.htcsettingwidgets (protectionLevel=2 flags=0xbe45)
12-15 15:32:45.337: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_LOCATION in package com.htc.htcsettingwidgets
12-15 15:32:45.337: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_ASSISTED_GPS in package com.htc.htcsettingwidgets
12-15 15:32:45.337: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_NETWORK_LOCATION in package com.htc.htcsettingwidgets
12-15 15:32:45.337: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_GPS in package com.htc.htcsettingwidgets
12-15 15:32:45.357: WARN/PackageManager(12002): Not granting permission android.permission.SET_PREFERRED_APPLICATIONS to package com.htc.HtcNaviPanel (protectionLevel=2 flags=0xbe45)
12-15 15:32:45.357: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_ASSISTED_GPS in package com.htc.HtcNaviPanel
12-15 15:32:45.357: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_NETWORK_LOCATION in package com.htc.HtcNaviPanel
12-15 15:32:45.357: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_LOCATION in package com.htc.HtcNaviPanel
12-15 15:32:45.357: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_GPS in package com.htc.HtcNaviPanel
12-15 15:32:45.357: WARN/PackageManager(12002): Unknown permission com.android.providers.htccdma.Specific in package com.android.htcdialer
12-15 15:32:45.367: WARN/PackageManager(12002): Unknown permission com.android.email.permission.READ_ATTACHMENT in package com.google.android.apps.uploader
12-15 15:32:45.377: WARN/PackageManager(12002): Unknown permission android.permission.ACCESS_COARSE_UPDATES in package com.layar
12-15 15:32:45.377: WARN/PackageManager(12002): Unknown permission com.android.launcher.permission.READ_SETTINGS in package com.htc.Weather
12-15 15:32:45.397: WARN/PackageManager(12002): Not granting permission android.permission.SEND_DOWNLOAD_COMPLETED_INTENTS to package com.android.vending (protectionLevel=2 flags=0x2be85)
12-15 15:32:45.397: WARN/PackageManager(12002): Unknown permission android.permission.SEND in package com.android.vending
12-15 15:32:45.397: WARN/PackageManager(12002): Unknown permission com.google.android.voicesearch.AUDIO_FILE_ACCESS in package com.google.android.gm
12-15 15:32:45.407: WARN/PackageManager(12002): Unknown permission android.permission.INJECT_AUDIO_VOLUME_SETTINGS in package com.android.camera
12-15 15:32:45.407: WARN/PackageManager(12002): Unknown permission com.android.launcher.permission.READ_SETTINGS in package com.metago.astro
12-15 15:32:45.407: WARN/PackageManager(12002): Unknown permission com.android.launcher.permission.WRITE_SETTINGS in package com.metago.astro
12-15 15:32:45.447: WARN/PackageManager(12002): Not granting permission android.permission.SHUTDOWN to package com.htc.android.worldclock (protectionLevel=2 flags=0xbe45)
12-15 15:32:45.447: WARN/PackageManager(12002): Unknown permission android.permission.READ_SETTINGS in package com.htc.android.htcime.misc
12-15 15:32:45.447: WARN/PackageManager(12002): Unknown permission android.permission.RUN_INSTRUMENTATION in package com.htc.android.htcime.misc

Saturday, August 28, 2010

How Do You Know Which Android API To Develop Against

If you are building any Android Applications you already know that you must declare a http://schemas.android.com/apk/res/android:uses-sdk@android:minSdkVersion in your application, like this in XML:

    <uses-sdk android:minSdkVersion="3" />

But how do you know which version to use?  Heck, how do you even know what version your current application code supports?

Google says to just keep backing it off until you find a bug:

Selecting a platform version and API Level

When you are developing your application, you will need to choose the platform version against which you will compile the application. In general, you should compile your application against the lowest possible version of the platform that your application can support.

You can determine the lowest possible platform version by compiling the application against successively lower build targets. After you determine the lowest version, you should create an AVD using the corresponding platform version (and API Level) and fully test your application. Make sure to declare a android:minSdkVersion attribute in the application's manifest and set its value to the API Level of the platform version.



Google also maintains a very, very useful resource here that shows the current state of the Android ecosystem (or as some people call it, fragmentation!)

Basically the idea is, declare an absolute bare minimum in your Android manifest so you can penetrate the market as much as possible.

I am using minSdkVersion = 3, but I can see 4 being another logical choice.  If you are minSdkVersion=7 you must have a really good reason -- like you are using some API7 and above only features. 

Otherwise, you are just missing out on customers.

FILL_PARENT was renamed to MATCH_PARENT will cause String types not allowed (at 'layout_height' with value 'match_parent')

Having "Error: String types not allowed (at 'layout_height' with value 'match_parent').    Android AAPT Problem" in Eclipse?

Check what API Level you are using.

FILL_PARENT was renamed to MATCH_PARENT in API Level 8 (Android 2.2)

I personal think "FILL_PARENT" makes more sense, but I was using them both thinking they did different things.  Probably best to just use "FILL_PARENT" for everything for now. 

API 8 is pretty new.

Thursday, August 26, 2010

Lets Talk about TabHosts and ActivityResult, finish() and so on

If you are using TabHosts and Activities in your application, you should read http://stackoverflow.com/questions/2497205/how-to-return-a-result-startactivityforresult-from-a-tabhost-activity

The is a quick stackoverflow question that everyone should read if you intend to use TabHosts and Activities.  If you have Activities returning results and Intents from inside the tab, or tab group, you will need to use the methods discussed.

There is even a nice paste of some Android 1.6 source code that helps explain finish().  It is really impressive how light the Android framework really is.

- Cory

Tuesday, August 17, 2010

TextView and NewLine in Java

One way to save on the number of nodes in your UI is to use the '\n' newline in TextView as show in this page.

http://stackoverflow.com/questions/2840608/how-do-i-add-a-newline-to-a-textview-in-android
Here is a nice Visual Guide to Android 2.0 UI Widgets. An IBM hosted page about working with XML in Android.

Here are some partially answered questions about SQLite database paths. Regarding SQLite database paths and Android, here is a very widely read page about Using your own SQLite database in Android applications.

I really like the Intent and Intent Filters system in Android 2.0

Some applications people are creating are crazy impressive and amazingly complex. LIke OSMDroid! Before you publish, you have to Sign Your Android Applications and you had better Test your Application on an Android Device before you put it on the Market! Whatever you publish, don't publish NotePadv2.

I tried to use Android Google Map View but my experience with the v2 and v3 JavaScript Google Map API has poisoned me. I struggle.

Getting Eclipse to ignore your SVN folders (you are using SVN I hope) is a good idea and is critical to do before you try to publish to the Market. How Do I get Eclipse to Ignore my .SVN Folders?

TableLayouts are fun, but they are even more fun when you can add rows to them! Adding Dynamic Rows to an Android TableLayout. Oh man, Icon Design scares me. I can load Bitmaps with the best of them, but I can't make them to save my life. I guess my applications will always sport that "I hate my users" stock icon look from the Google Android Free Icon Basics and Icon Packs.