The official site for Android developers. Provides the Android SDK and documentation for app developers and designers.
Galaxy Nexus now on sale in Google Play
Galaxy Nexus by Samsung runs the latest Android software, Ice Cream Sandwich, with Google mobile services, Google Play and new features like Android Beam and Google+ mobile hangouts. It also offers a 4.65” HD Super AMOLED display that’s perfect for watching movies, playing games or reading books on the go.
First available in the U.S., Galaxy Nexus costs $399 and arrives at your door unlocked, without a carrier commitment or contract. You can use it on the GSM network of your choice, including T-Mobile and AT&T. It also comes pre-installed with the Google Wallet app which lets you easily make purchases and redeem offers with a tap of your phone. Best of all, we'll give you a $10 credit to get you started with your new mobile wallet.
We’ve come a long way since the first Android devices started hitting shelves three and a half years ago and since the launch of the first Nexus device. More than 300 million Android devices have been activated globally. We’ve worked with developers and content partners to launch Google Play, offering more than 500,000 apps, millions of songs and books, and thousands of movies. And we’ve implemented new customer support services to improve the purchasing experience on Google Play. We’ve taken all of this into consideration in designing Devices on Google Play. We hope to bring it to more countries soon.
Android C2DM — Client Login key expiration
[This post is by Francesco Nerieri, engineering team lead for C2DM — Tim Bray]
In the upcoming weeks, some of the older Client Login authentication keys will expire. If you generated the token you’re currently using to authenticate with the C2DM servers before October 2011, it will stop working.
If the response from the C2DM servers contains an Update-Client-Auth
header, you’ll need to replace the current token with the one included in the header.
// Check for updated token header
String updatedAuthToken = conn.getHeaderField(UPDATE_CLIENT_AUTH);
if (updatedAuthToken != null && !authToken.equals(updatedAuthToken)) {
log.info("Got updated auth token from datamessaging servers: " +
updatedAuthToken);
serverConfig.updateToken(updatedAuthToken);
}
We suggest that you start using the Update-Client-Auth response header to update tokens regularly, as keys will expire periodically from now on. For example, have a look at the Chrome to Phone service hosted on code.google.com; this code takes care of authenticating via Client Login and then sending a message:
Alternatively, you can manually generate a new Client Login token now and replace the one currently in use. ClientLogin can be used with any application that can make an HTTPS POST request. The POST request should be structured as a form post with the default encoding application/x-www-form-urlencoded, like this:
POST /accounts/ClientLogin HTTP/1.0
Content-type: application/x-www-form-urlencoded
accountType=GOOGLE&Email=johndoe@gmail.com&Passwd=north23AZ&service=ac2dm
If the POST succeeds, the response contains the authorization token, labeled "Auth", which is your new token. You could even do this from the command line:
curl -d \
"accountType=HOSTED_OR_GOOGLE&Email=johndoe@gmail.com&Passwd=north23AZ&service=ac2dm" \
https://www.google.com/accounts/ClientLogin | \
grep Auth
If your request fails or if you are prompted for captchas, please read ClientLogin for Installed Applications. And of course, if you updated your code to use the Update-Client-Auth header after the keys had expired, then you will first need to manually generate a new token.
Have fun with C2DM!
New Seller Countries in Google Play
If you develop Android apps in one of the new countries and want to get started selling them, visit play.google.com/apps/publish and set up a new Google Play developer account. Once you’ve uploaded your apps, you can price them in any available buyer currencies, publish, and then receive payouts and financial data in your local currency.
If you are based in Israel or Mexico and are currently selling apps through an AdSense merchant account, you will need to migrate your apps to a new Google Play developer account in your local currency. Watch for an email that provides complete information on the migration process and timeline.
Additionally, we encourage developers everywhere to visit the Developer Console as soon as possible to set prices for their products in the currencies of these new countries. Stay tuned for more announcements soon as we continue to roll out our new billing infrastructure to buyers and sellers throughout the world.
+Android Developers
Google Currents goes international
After the U.S. launch, the top features readers requested were to make the app available internationally and to allow content to sync quickly. We’ve heard you, and today we’re making Google Currents 1.1 available around the world. Hundreds of U.S. editions are now readable in your preferred language with a new publisher-selected translation feature, and local publishers can begin adding their content to the catalog through Google Currents Producer. Plus, a new dynamic sync feature improves your reading experience with fresh content wherever you are.
Whatever you’re interested in—whether it’s science (Popular Science, Scientific American, Space.com), sports (Bleacher Report, CBS Sports, Surfer), business (Harvard Business Review, Inc.), celebrities (Celebuzz, HollywoodLife, Now magazine, TMZ), health & wellness (Men’s Health, Yoga Journal), design (Colossal, Dwell) or news (The Atlantic, PRI, Slate)—it’s easy to find a great edition to read in Google Currents.
Read in more places
With this update, we’ve made Google Currents available globally, wherever apps are available on Google Play and the Apple App Store. International publishers, using Google Currents Producer, can now begin adding local content for an international audience, choosing where to make it available globally and whether to enable auto-translation. For example The Guardian in the UK, LaStampa in Italy, Financial Times Deutschland in Germany, ABC News in Australia, Neue Zürcher Zeitung in Switzerland and Hindustan Times in India have already started publishing editions with local content. Readers can also add their favorite local blogs which are instantly converted into Currents editions.
Read in your favorite language
To help you enjoy content in your preferred language, we’ve integrated Google Translate into Google Currents. Just press the globe icon while reading an edition, and you can automatically translate that edition to one of 38 supported languages. So it’s easier than ever to keep up with Italian and German sports (Corriere dello Sport, kicker.de), or read Scientific American, in your preferred language.
Read fresh content, automatically
With our new dynamic sync feature, you’ll always have fresh content to read. As you open each edition, new content is dynamically delivered, using a minimum of your phone or tablet's battery, bandwidth and storage. Those of you who travel on planes and trains can choose which editions you would like fully packaged for offline reading, including images.
Learn more about what’s new in Currents here.
Google Currents is now available for download on Google Play and in the Apple App Store, wherever apps are available. Whether you’re a reader or a publisher, we hope that Google Currents helps you easily experience the best content on the web, now in even more languages.
Posted by Mussie Shore, Product Manager
Accessibility: Are You Serving All Your Users?
[This post is by Joe Fernandez, a technical writer for developer.android.com who cares about accessibility and usability. — Tim Bray.]
We recently published some new resources to help developers make their Android applications more accessible:
“But,” you may be thinking, “What is accessibility, exactly? Why should I make it a priority? How do I do it? And most importantly, how do I spell it?” All good questions. Let’s hit some of the key points.
Accessibility is about making sure that Android users who have limited vision or other physical impairments can use your application just as well as all those folks in line at the supermarket checking email on their phones. It’s also about the Mom over in the produce section whose kids are driving her to distraction, and really needs to see that critical notification your application is trying to deliver. It’s also about you, in the future; Is your eyesight getting better over time? How about that hand-eye coordination?
When it comes down to it, making an application accessible is about having a deep commitment to usability, getting the details right and delighting your users. It also means stepping into new territory and getting a different perspective on your application. Try it out: Open up an application you developed (or your all-time favorite app), then close your eyes and try to complete a task. No peeking! A little challenging, right?
How Android Enables Accessibility
One of main ways that Android enables accessibility is by allowing users to hear spoken feedback that announces the content of user interface components as they interact with applications. This spoken feedback is provided by an accessibility service called TalkBack, which is available for free on Google Play and has become a standard component of recent Android releases.
Now enable TalkBack, and try that eyes-closed experiment again. Being able to hear your application’s interface probably makes this experiment a little easier, but it’s still challenging. This type of interaction is how many folks with limited vision use their Android devices every day. The spoken feedback works because all the user interface components provided by the Android framework are built so they can provide descriptions of themselves to accessibility services like TalkBack.
Another key element of accessibility on Android devices is the ability to use alternative navigation. Many users prefer directional controllers such as D-pads, trackballs or keyboard arrows because it allows them to make discrete, predictable movements through a user interface. You can try out directional control with your apps using the virtual keyboard in the Android emulator or by installing and enabling the Eyes-Free Keyboard on your device. Android enables this type of navigation by default, but you, as a developer, may need to take a few steps to make sure users can effectively navigate your app this way.
How to Make Your Application Accessible
It would be great to be able to give you a standard recipe for accessibility, but the truth of the matter is that the right answer depends on the design and functionality of your application. Here are some key steps for ensuring that your application is accessible:
Task flows: Design well-defined, clear task flows with minimal navigation steps, especially for major user tasks, and make sure those tasks are navigable via focus controls (see item 4).
- Action target size: Make sure buttons and selectable areas are of sufficient size for users to easily touch them, especially for critical actions. How big? We recommend that touch targets be 48dp (roughly 9mm) or larger.
Label user interface controls: Label user interface components that do not have visible text, especially ImageButton, ImageView, and EditText components. Use the android:contentDescription XML layout attribute or setContentDescription() to provide this information for accessibility services.
Enable focus-based navigation: Make sure users can navigate your screen layouts using hardware-based or software directional controls (D-pads, trackballs and keyboards). In a few cases, you may need to make UI components focusable or change the focus order to be more logical.
Use framework-provided controls: Use Android's built-in user interface controls whenever possible, as these components provide accessibility support by default.
Custom view controls: If you build custom interface controls for your application, implement accessibility interfaces for your custom views and provide text labels for the controls.
Test: Checking off the items on this list doesn’t guarantee your app is accessible. Test accessibility by attempting to navigate your application using directional controls, and also try eyes free navigation with the TalkBack service enabled.
Here’s an example of implementing some basic accessibility features for an ImageButton inside an XML layout:
<ImageButton
android:id="@+id/add_note_button"
android:src="@drawable/add_note_image"
android:contentDescription="@string/add_note_description"/>
Notice that we’ve added a content description that accessibility services can use to provide an audible explanation of the button. Users can navigate to this button and activate it with directional controls, because ImageButton objects are focusable by default (so you don’t have to include the android:focusable="true"
attribute).
The good news is that, in most cases, implementing accessibility isn’t about radically restructuring your application, but rather working through the subtle details of accessibility. Making sure your application is accessible is an opportunity to look at your app from a different perspective, improve the overall quality of your app and ensure that all your users have a great experience.
A Faster Emulator with Better Hardware Support
[This post is by Xavier Ducrohet and Reto Meier of the Android engineering team. — Tim Bray.]
The Android emulator is a key tool for Android developers in building and testing their apps. As the power and diversity of Android devices has grown quickly, it’s been hard for the emulator keep pace.
Today we’re thrilled to announce several significant improvements to the emulator, including a dramatic performance upgrade and support for a broader range of hardware features, notably sensors and multi-finger input.
Added GPU Support
The system image we’re shipping today has built-in GPU support (Android 4.0.3 r2). With Android’s growing reliance on using the GPU to improve performance, the difference is significant. In the video below, the emulator is still interpreting ARM instructions; the performance boost is the effect of putting the GPU to work.
As a bonus, since we’re now supporting OpenGL ES 2.0, your OpenGL games can now run inside the emulator.
Please note that there are a lot of GPUs out there, and we haven’t tested all of them for this beta release, so let us know if you have feedback or encounter issues.
More Hardware Feature Emulation
The hardware features of mobile devices are a significant part of what makes them a unique platform for development, so we’re also pleased to announce that in addition to the camera support we added last year, it’s now possible to use a tethered Android device to supply inputs for sensors and multi-touch input.
We’re working on providing emulator support for more hardware features including Bluetooth and NFC.
Improved CPU Performance
We’ve also improved the CPU performance of the Android emulator. Hardware floating point operation has been available for system images since Ice Cream Sandwich (Android 4.0), allowing CPU operations to be emulated roughly twice as quickly.
Last week’s r17 developer tools release included x86 system images and host drivers (available through the SDK Manager), allowing the emulator to access the host CPU natively and offer significantly faster execution.
This video shows a CPU-bound application on two emulators running the same system image, one with virtualization, one without.
Building a modern emulator
Because the Android platform allows deep interaction between applications, and with system components, we need to provide an emulator with a complete system image. Our emulator virtualizes a complete device: hardware, kernel, low-level system libraries, and app framework.
Of course, the system being emulated typically has an ARM CPU; historically, we’d been emulating those instructions in software, and that worked OK until the advent of tablet support with additional animations and complexity in Android 3.0.
The missing pieces were the completion of Android x86 support, and the GPU support in last week’s release of SDK Tools r17. This works by funneling the OpenGL ES 2.0 instructions from the emulator to the host OS, converted to standard OpenGL 2.0, and running natively on the host GPU.
Conclusion
The Android ecosystem has a lot of devices in many different form factors. Developers need a good way of testing these apps without having to own everything out there and a fast, rich Android emulator is immensely helpful.
We hope that these new improvements will make the emulator a more useful tool in your development and testing, and look forward to improving it further for you.
The Gmail Public Labels API
[This post is by Nadav Aharony, a product manager on the Android team — Tim Bray]
We’re rolling out new developer features for the Gmail Android app: It now includes a public ContentProvider that you can use to retrieve label data. You can use this to access up-to-date unread counts for specific accounts’ inboxes and labels.
To use the API, the Gmail app needs to be at version 2.3.6 or higher on Froyo or Gingerbread; 4.0.5 or higher on Honeycomb and ICS. Before using it, be sure you first check the Gmail app version; we’ve provided a handy GmailContract.canReadLabels(Context)
method to help with this. Your app will need the com.google.android.gm.permission.READ_CONTENT_PROVIDER
permission.
Finding the Gmail accounts set up on the device
The Labels API needs a valid Gmail account to build a query for per-label information. Assuming the GET_ACCOUNTS permission, the AccountManager can be used to fetch this information:
// Get the account list, and pick the first one
final String ACCOUNT_TYPE_GOOGLE = "com.google";
final String[] FEATURES_MAIL = {
"service_mail"
};
AccountManager.get(this).getAccountsByTypeAndFeatures(ACCOUNT_TYPE_GOOGLE, FEATURES_MAIL,
new AccountManagerCallback() {
@Override
public void run(AccountManagerFuture future) {
Account[] accounts = null;
try {
accounts = future.getResult();
if (accounts != null && accounts.length > 0) {
String selectedAccount = accounts[0].name;
queryLabels(selectedAccount);
}
} catch (OperationCanceledException oce) {
// TODO: handle exception
} catch (IOException ioe) {
// TODO: handle exception
} catch (AuthenticatorException ae) {
// TODO: handle exception
}
}
}, null /* handler */);
Getting and accessing existing labels
Once you’ve got the email account, you can get a ContentProvider URI to query against. We've provided a simple support class called GmailContract.java for constructing the URI and defining the columns and relevant constants.
You can access any label, predefined or user-defined. The predefined labels include (you have to use symbolic constants rather than these strings, see below):
Priority Inbox
Starred
Chats
Sent
Drafts
All mail
Spam
Trash
To obtain a Cursor with information for all labels in an account, your app can either query this URI directly or use a CursorLoader. Here’s an example:
Cursor c =
getContentResolver().query(GmailContract.Labels.getLabelsUri(selectedAccount),
null, null, null, null);
You can query and watch for changes on a single label by storing the URI value in the GmailContract.Labels.URI
column from the cursor data.
The NAME
value for pre-defined labels can vary by locale, so don’t use GmailContract.Labels.NAME
. Instead, identify pre-defined labels like Inbox, Sent or Drafts using the String value in the GmailContract.Labels.CANONICAL_NAME
column. Here’s an example:
// loop through the cursor and find the Inbox
if (c != null) {
final String inboxCanonicalName = GmailContract.Labels.LabelCanonicalName.CANONICAL_NAME_INBOX;
final int canonicalNameIndex = c.getColumnIndexOrThrow(GmailContract.Labels.CANONICAL_NAME);
while (c.moveToNext()) {
if (inboxCanonicalName.equals(c.getString(canonicalNameIndex))) {
// this row corresponds to the Inbox
}
}
}
If you choose to use a CursorLoader, it will keep the label counts up to date as they change over time.
Sample App
You can find a sample app that makes use of the new API here. The app provides a basic readout of label and message-count information.
People care about their incoming mail; we’re looking forward to seeing what you do with access to this information. We’re also open to suggestions as to how to improve and extend this new API.