<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:postrank="http://www.postrank.com/xsd/2007-11-30/postrank-2007-11-30.xsd" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
<title>OpenData Feeds - PostRank (PostRank: Best)</title>
<postrank:searchPostrank>7.6</postrank:searchPostrank>
<opensearch:startIndex>0</opensearch:startIndex>
<opensearch:itemsPerPage>10</opensearch:itemsPerPage>
<image><title>PostRank</title>
<url>http://www.postrank.com/graphics/header_logo.png</url>
<link>http://www.postrank.com/feed/b367cd57a0a8b2fd5fe28a467bc8dcdd</link>
</image>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/OpendataFeeds-Aiderssbest" /><feedburner:info uri="opendatafeeds-aiderssbest" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
<title>Android’s HTTP Clients</title>
<link>http://android-developers.blogspot.com/2011/09/androids-http-clients.html</link>
<description>[This post is by Jesse Wilson from the Dalvik team. —Tim Bray]Most network-connected Android apps will use HTTP to send and receive data. Android includes two HTTP clients: HttpURLConnection and Apache HTTP Client. Both support HTTPS, streaming uploads and downloads, configurable timeouts, IPv6 and connection pooling.Apache HTTP ClientDefaultHttpClient and its sibling AndroidHttpClient are extensible HTTP clients suitable for web browsers. They have large and flexible APIs. Their implementation is stable and they have few bugs. But the large size of ...</description>
<guid>http://android-developers.blogspot.com/2011/09/androids-http-clients.html</guid>
<pubDate>Thu, 29 Sep 2011 10:17:00 GMT</pubDate>
<content:encoded>&lt;a href="http://4.bp.blogspot.com/-vhNi2_GZQ9U/ToOhtHmmCPI/AAAAAAAAAr0/kfHjHZKQdVE/s1600/jessehawaii.jpg"&gt;&lt;img alt="Jesse Wilson" border="0" id="BLOGGER_PHOTO_ID_5657543353414584562" src="http://4.bp.blogspot.com/-vhNi2_GZQ9U/ToOhtHmmCPI/AAAAAAAAAr0/kfHjHZKQdVE/s200/jessehawaii.jpg" style="border: 5px solid #ddd; float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 200px; height: 199px;" /&gt;&lt;/a&gt;&lt;p&gt;&lt;i&gt;[This post is by &lt;a href="http://www.publicobject.com/"&gt;Jesse Wilson&lt;/a&gt; from the Dalvik team. —Tim Bray]&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Most network-connected Android apps will use HTTP to send and receive data. Android includes two HTTP clients: HttpURLConnection and Apache HTTP Client. Both support HTTPS, streaming uploads and downloads, configurable timeouts, IPv6 and connection pooling.&lt;/p&gt;&lt;h3&gt;Apache HTTP Client&lt;/h3&gt;&lt;p&gt;&lt;a href="http://developer.android.com/reference/org/apache/http/impl/client/DefaultHttpClient.html"&gt;DefaultHttpClient&lt;/a&gt; and its sibling &lt;a href="http://developer.android.com/reference/android/net/http/AndroidHttpClient.html"&gt;AndroidHttpClient&lt;/a&gt; are extensible HTTP clients suitable for web browsers. They have large and flexible APIs. Their implementation is stable and they have few bugs. &lt;/p&gt;&lt;p&gt;But the large size of this API makes it difficult for us to improve it without breaking compatibility. The Android team is not actively working on Apache HTTP Client.&lt;/p&gt;&lt;h3&gt;HttpURLConnection&lt;/h3&gt;&lt;p&gt;&lt;a href="http://developer.android.com/reference/java/net/HttpURLConnection.html"&gt;HttpURLConnection&lt;/a&gt; is a general-purpose, lightweight HTTP client suitable for most applications. This class has humble beginnings, but its focused API has made it easy for us to improve steadily.&lt;/p&gt;&lt;p&gt;Prior to Froyo, HttpURLConnection had some frustrating bugs. In particular, calling &lt;code&gt;close()&lt;/code&gt; on a readable InputStream could &lt;a href="http://code.google.com/p/android/issues/detail?id=2939"&gt;poison the connection pool&lt;/a&gt;. Work around this by disabling connection pooling:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;private void disableConnectionReuseIfNecessary() {
    // HTTP connection reuse which was buggy pre-froyo
    if (Integer.parseInt(Build.VERSION.SDK) &lt; Build.VERSION_CODES.FROYO) {
        System.setProperty("http.keepAlive", "false");
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In Gingerbread, we added transparent response compression. HttpURLConnection will automatically add this header to outgoing requests, and handle the corresponding response:&lt;/p&gt;&lt;p&gt;&lt;code&gt;Accept-Encoding: gzip&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Take advantage of this by configuring your Web server to compress responses for clients that can support it. If response compression is problematic, the &lt;a href="http://developer.android.com/reference/java/net/HttpURLConnection.html"&gt;class documentation&lt;/a&gt; shows how to disable it.&lt;/p&gt;&lt;p&gt;Since HTTP’s &lt;code&gt;Content-Length&lt;/code&gt; header returns the compressed size, it is an error to use &lt;a href="http://developer.android.com/reference/java/net/URLConnection.html#getContentLength()"&gt;getContentLength()&lt;/a&gt; to size buffers for the uncompressed data. Instead, read bytes from the response until &lt;a href="http://developer.android.com/reference/java/io/InputStream.html#read(byte[])"&gt;InputStream.read()&lt;/a&gt; returns -1.&lt;/p&gt;&lt;p&gt;We also made several improvements to HTTPS in Gingerbread. &lt;a href="http://developer.android.com/reference/javax/net/ssl/HttpsURLConnection.html"&gt;HttpsURLConnection&lt;/a&gt; attempts to connect with &lt;a href="http://en.wikipedia.org/wiki/Server_Name_Indication"&gt;Server Name Indication&lt;/a&gt; (SNI) which allows multiple HTTPS hosts to share an IP address. It also enables compression and session tickets. Should the connection fail, it is automatically retried without these features. This makes HttpsURLConnection efficient when connecting to up-to-date servers, without breaking compatibility with older ones.&lt;/p&gt;&lt;p&gt;In Ice Cream Sandwich, we are adding a response cache. With the cache installed, HTTP requests will be satisfied in one of three ways:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Fully cached responses are served directly from local storage. Because no network connection needs to be made such responses are available immediately. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Conditionally cached responses must have their freshness validated by the webserver. The client sends a request like “Give me /foo.png if it changed since yesterday” and the server replies with either the updated content or a &lt;code&gt;304&amp;nbsp;Not&amp;nbsp;Modified&lt;/code&gt; status. If the content is unchanged it will not be downloaded!&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Uncached responses are served from the web. These responses will get stored in the response cache for later.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Use reflection to enable HTTPS response caching on devices that support it. This sample code will turn on the response cache on Ice Cream Sandwich without affecting earlier releases:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;private void enableHttpResponseCache() {
    try {
        long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
        File httpCacheDir = new File(getCacheDir(), "http");
        Class.forName("android.net.http.HttpResponseCache")
            .getMethod("install", File.class, long.class)
            .invoke(null, httpCacheDir, httpCacheSize);
    } catch (Exception httpResponseCacheNotAvailable) {
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You should also configure your Web server to set cache headers on its HTTP responses.&lt;/p&gt;&lt;h3&gt;Which client is best?&lt;/h3&gt;&lt;p&gt;Apache HTTP client has fewer bugs on Eclair and Froyo. It is the best choice for these releases.&lt;/p&gt;&lt;p&gt;For Gingerbread and better, HttpURLConnection is the best choice. Its simple API and small size makes it great fit for Android. Transparent compression and response caching reduce network use, improve speed and save battery. New applications should use &lt;a href="http://developer.android.com/reference/java/net/HttpURLConnection.html"&gt;HttpURLConnection&lt;/a&gt;; it is where we will be spending our energy going forward.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/6755709643044947179-2415412611315413372?l=android-developers.blogspot.com" width="1" /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=66uCQtyHwU4:8Nz1oGm4ZLw:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=66uCQtyHwU4:8Nz1oGm4ZLw:-BTjWOF_DHI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=66uCQtyHwU4:8Nz1oGm4ZLw:-BTjWOF_DHI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/66uCQtyHwU4" width="1" /&gt;</content:encoded>
<postrank:feed_hash>b367cd57a0a8b2fd5fe28a467bc8dcdd</postrank:feed_hash>
<postrank:postrank>7.6</postrank:postrank>
<postrank:postrank_color>#ff8934</postrank:postrank_color>
<postrank:id>b61ef8b4d7d346b8ed5f8255a3c9a9f5</postrank:id>
</item>
<item>
<title>A Deep Dive Into Location</title>
<link>http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html</link>
<description>[This post is by Reto Meier, Tech Lead for Android Developer Relations, who wrote the book on Android App development.—TimBray]I'm a big fan of location-based apps, but not their seemingly-inevitable startup latency. Whether it's finding a place to eat or searching for the nearest Boris Bike, I find the delay while waiting for the GPS to get a fix, and then for the results list to populate, to be interminable. Once I’m in a venue and ready to get some tips, ...</description>
<guid>http://android-developers.blogspot.com/2011/06/deep-dive-into-location.html</guid>
<pubDate>Thu, 23 Jun 2011 15:08:00 GMT</pubDate>
<content:encoded>&lt;p&gt;&lt;i&gt;[This post is by &lt;a href="https://twitter.com/retomeier"&gt;Reto Meier&lt;/a&gt;, Tech Lead for Android Developer Relations, who &lt;a href="http://www.amazon.com/gp/product/0470565527?tag=interventione-20"&gt;wrote the book&lt;/a&gt; on Android App development.&amp;nbsp;—&amp;nbsp;Tim&amp;nbsp;Bray]&lt;/i&gt;&lt;/p&gt;&lt;a href="http://3.bp.blogspot.com/-xpevUuRG5to/TgKBoB2GKWI/AAAAAAAAAdY/CBD2eimfS1c/s1600/reto.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5621197809601882466" src="http://3.bp.blogspot.com/-xpevUuRG5to/TgKBoB2GKWI/AAAAAAAAAdY/CBD2eimfS1c/s400/reto.jpg" style="border: 5px solid #ddd; float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 302px; height: 381px;" /&gt;&lt;/a&gt;&lt;p&gt;I'm a big fan of location-based apps, but not their seemingly-inevitable startup latency. &lt;/p&gt;&lt;p&gt;Whether it's finding a place  to eat or searching for the nearest &lt;a href="http://en.wikipedia.org/wiki/Barclays_Cycle_Hire"&gt;Boris Bike&lt;/a&gt;, I find the delay while waiting for the GPS to get a fix, and then for the results list to populate, to be interminable. Once I’m in a venue and ready to get some tips, check-in, or review the food, I’m frequently thwarted by a lack of data connection.&lt;/p&gt;&lt;p&gt;Rather than shaking my fist at the sky, I’ve  written an open-source reference app that incorporates all of the tips, tricks, and cheats I know to reduce the time between opening an app and seeing an up-to-date list of nearby venues - as well as providing a reasonable level of offline support — all while keeping the impact on battery life to a minimum.&lt;/p&gt;&lt;h3&gt;Show Me the Code&lt;/h3&gt;&lt;p&gt;You can check-out the &lt;a href="http://code.google.com/p/android-protips-location/"&gt;Android Protips for Location&lt;/a&gt; open source project from Google Code. Don’t forget to read the &lt;a href="http://code.google.com/p/android-protips-location/source/browse/trunk/Readme.txt"&gt;Readme.txt&lt;/a&gt; for the steps required to make it compile and run successfully.&lt;/p&gt;&lt;h3&gt;What Does it Actually Do?&lt;/h3&gt;&lt;p&gt;It uses the &lt;a href="http://code.google.com/apis/maps/documentation/places/"&gt;Google Places API&lt;/a&gt; to implement the core functionality of apps that use location to provide a list of nearby points of interest, drill down into their details, and then check-in/rate/review them.&lt;/p&gt;&lt;p&gt;The code implements many of the best-practices I detailed in my Google I/O 2011 session, &lt;a href="http://www.google.com/events/io/2011/sessions/android-protips-advanced-topics-for-expert-android-app-developers.html"&gt;Android Protips: Advanced Topics for Expert Android Developers&lt;/a&gt; (&lt;a href="http://www.youtube.com/watch?v=twmuBbC_oB8"&gt;video&lt;/a&gt;), including using Intents to receive location updates, using the Passive Location Provider, using and monitoring device state to vary refresh rates, toggling your manifest Receivers at runtime, and using the Cursor Loader. &lt;/p&gt;&lt;p&gt;The app targets Honeycomb but supports Android platforms from 1.6 and up. &lt;/p&gt;&lt;p&gt;Nothing would make me happier than for you to cut/copy/borrow / steal this code  to build better location-based apps. If you do, I’d love it if you &lt;a href="http://www.twitter.com/retomeier"&gt;told me about it&lt;/a&gt;!&lt;/p&gt;&lt;h3&gt;Now that you’ve got the code, let’s take a closer look at it&lt;/h3&gt;&lt;p&gt;My top priority was &lt;em&gt;freshness&lt;/em&gt;: Minimize the latency between opening the app and being able to check in to a desired location, while still minimizing the impact of the app on battery life.&lt;/p&gt;&lt;p&gt;Related requirements:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The current location has to be found as quickly as possible.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The list of venues should update when the location changes.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The list of nearby locations and their details must be available when we’re offline.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Check-ins must be possible while we’re offline.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Location data and other user data must be handled properly (see our &lt;a href="http://android-developers.blogspot.com/2010/08/best-practices-for-handling-android.html"&gt;prior blog post on best practices&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Freshness means never having to wait&lt;/h3&gt;&lt;p&gt;You can significantly reduce the latency for getting your first location fix by retrieving the last known location from the Location Manager each time the app is resumed. &lt;/p&gt;&lt;p&gt;In this snippet taken from the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/utils/GingerbreadLastLocationFinder.java"&gt;GingerbreadLastLocationFinder&lt;/a&gt;, we iterate through each location provider on the device — including those that aren't currently available — to find the most timely and accurate last known location.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;List&lt;string&gt; matchingProviders = locationManager.getAllProviders();
for (String provider: matchingProviders) {
  Location location = locationManager.getLastKnownLocation(provider);
  if (location != null) {
    float accuracy = location.getAccuracy();
    long time = location.getTime();
        
    if ((time &gt; minTime &amp;&amp; accuracy &lt; bestAccuracy)) {
      bestResult = location;
      bestAccuracy = accuracy;
      bestTime = time;
    }
    else if (time &lt; minTime &amp;&amp; 
             bestAccuracy == Float.MAX_VALUE &amp;&amp; time &gt; bestTime){
      bestResult = location;
      bestTime = time;
    }
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If there is one or more locations available from within the allowed latency, we return the most accurate one. If not, we simply return the most recent result.&lt;/p&gt;&lt;p&gt;In the latter case (where it’s determined that the last location update isn't recent enough) this newest result is still returned, but we also request a single location update using that fastest location provider available.  &lt;/p&gt;&lt;pre&gt;&lt;code&gt;if (locationListener != null &amp;&amp;
   (bestTime &lt; maxTime || bestAccuracy &gt; maxDistance)) { 
  IntentFilter locIntentFilter = new IntentFilter(SINGLE_LOCATION_UPDATE_ACTION);
  context.registerReceiver(singleUpdateReceiver, locIntentFilter);      
  locationManager.requestSingleUpdate(criteria, singleUpatePI);
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Unfortunately we can’t specify “fastest” when using Criteria to choose a location provider, but in practice we know that coarser providers — particularly the network location provider — tend to return results faster than the more accurate options. In this case I’ve requested coarse accuracy and low power in order to select the Network Provider when it’s available.&lt;/p&gt;&lt;p&gt;Note also that this code snippet shows the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/utils/GingerbreadLastLocationFinder.java"&gt;GingerbreadLastLocationFinder&lt;/a&gt; which uses the &lt;code&gt;requestSingleUpdate&lt;/code&gt; method to receive a one-shot location update. This wasn’t available prior to Gingerbread - check out the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/utils/LegacyLastLocationFinder.java"&gt;LegacyLastLocationFinder&lt;/a&gt; to see how I have implemented the same functionality for devices running earlier platform versions.&lt;/p&gt;&lt;p&gt;The &lt;code&gt;singleUpdateReceiver&lt;/code&gt; passes the received update back to the calling class through a registered Location Listener.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;protected BroadcastReceiver singleUpdateReceiver = new BroadcastReceiver() {
  @Override
  public void onReceive(Context context, Intent intent) {
    context.unregisterReceiver(singleUpdateReceiver);
      
    String key = LocationManager.KEY_LOCATION_CHANGED;
    Location location = (Location)intent.getExtras().get(key);
      
    if (locationListener != null &amp;&amp; location != null)
      locationListener.onLocationChanged(location);
      
    locationManager.removeUpdates(singleUpatePI);
  }
};&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Use Intents to receive location updates&lt;/h3&gt;&lt;p&gt;Having obtained the most accurate/timely estimate of our current location, we also want to receive location updates.&lt;/p&gt;&lt;p&gt;The &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/PlacesConstants.java"&gt;PlacesConstants&lt;/a&gt; class includes a number of values that determine the frequency of location updates (and the associated server polling). Tweak them to ensure that updates occur exactly as often as required.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;// The default search radius when searching for places nearby.
public static int DEFAULT_RADIUS = 150;
// The maximum distance the user should travel between location updates. 
public static int MAX_DISTANCE = DEFAULT_RADIUS/2;
// The maximum time that should pass before the user gets a location update.
public static long MAX_TIME = AlarmManager.INTERVAL_FIFTEEN_MINUTES; &lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The next step is to request the location updates from the Location Manager. In this snippet taken from the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/utils/GingerbreadLocationUpdateRequester.java"&gt;GingerbreadLocationUpdateRequester&lt;/a&gt; we can pass the Criteria used to determine which Location Provider to request updates from directly into the &lt;code&gt;requestLocationUpdates&lt;/code&gt; call.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;public void requestLocationUpdates(long minTime, long minDistance, 
  Criteria criteria, PendingIntent pendingIntent) {

  locationManager.requestLocationUpdates(minTime, minDistance, 
    criteria, pendingIntent);
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note that we're passing in a Pending Intent rather than a Location Listener. &lt;/p&gt;&lt;pre&gt;&lt;code&gt;Intent activeIntent = new Intent(PlacesConstants.ACTIVE_LOCATION_UPDATE_ACTION);
locationListenerPendingIntent = PendingIntent.getBroadcast(
  this, 0, activeIntent, PendingIntent.FLAG_UPDATE_CURRENT);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I generally prefer this over using Location Listeners as it offers the flexibility of registering receivers in multiple Activities or Services, or directly in the manifest. &lt;/p&gt;&lt;p&gt;In this app, a new location means an updated list of nearby venues. This happens via a Service that makes a server query and updates the Content Provider that populates the place list.&lt;/p&gt;&lt;p&gt;Because the location change isn’t directly updating the UI, it makes sense to create and register the associated &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/receivers/LocationChangedReceiver.java"&gt;LocationChangedReceiver&lt;/a&gt; in the manifest rather than the main Activity.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;receiver android:name=".receivers.LocationChangedReceiver"&gt;
  &lt;intent-filter&gt;
    &lt;action android:name="com.radioactiveyak.places.active_location_update_action"&gt;
  &lt;/intent-filter&gt;
&lt;/receiver&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The Location Changed Receiver extracts the location from each update and starts the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/services/PlacesUpdateService.java"&gt;PlaceUpdateService&lt;/a&gt; to refresh the database of nearby locations.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;public void onReceive(Context context, Intent intent) {
  String key = LocationManager.KEY_LOCATION_CHANGED;
  if (intent.hasExtra(key)) {
    Location location = (Location)intent.getExtras().get(key);

    Intent updateServiceIntent = 
      new Intent(PlacesConstants.PLACES_UPDATE_SERVICE_ACTION);
    updateServiceIntent.putExtra(PlacesConstants.EXTRA_KEY_LOCATION, location);
    updateServiceIntent.putExtra(PlacesConstants.EXTRA_KEY_RADIUS,
                                 PlacesConstants.DEFAULT_RADIUS);
    updateServiceIntent.putExtra(PlacesConstants.EXTRA_KEY_FORCEREFRESH, true);
    context.startService(updateServiceIntent);
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Monitor inactive providers for a better option&lt;/h3&gt;&lt;p&gt;The snippet from &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/UI/PlaceActivity.java"&gt;PlacesActivity&lt;/a&gt; below shows how to monitor two important conditions:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;The Location Provider we are using being deactivated.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A better Location Provider becoming available.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;In either case, we simply re-run the process used to determine the best available provider and request location updates.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;// Listens for the provider I'm using being disabled. 
IntentFilter intentFilter = new 
  IntentFilter(PlacesConstants.ACTIVE_LOCATION_UPDATE_ACTION);
registerReceiver(locProviderDisabledReceiver, intentFilter);

// Listen for a better provider becoming available.
String bestProvider = locationManager.getBestProvider(criteria, false);
String bestAvailableProvider = locationManager.getBestProvider(criteria, true);
if (bestProvider != null &amp;&amp; !bestProvider.equals(bestAvailableProvider))
  locationManager.requestLocationUpdates(bestProvider, 0, 0, 
    bestInactiveLocationProviderListener, getMainLooper());&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Freshness means always being up to date. What if we could reduce startup latency to zero?&lt;/h3&gt;&lt;p&gt;You can start the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/services/PlacesUpdateService.java"&gt;PlacesUpdateService&lt;/a&gt; in the background to refresh the list of nearby locations while your app is in the background. Done correctly, a relevant list of venues can be immediately available when you open the app.&lt;/p&gt;&lt;p&gt;Done poorly, your users will never find this out as you’ll have drained their battery too quickly.&lt;/p&gt;&lt;p&gt;Requesting location updates (particularly using the GPS) while your app isn’t in the foreground is poor practice, as it can significantly impact battery life. Instead, you can use the Passive Location Provider to receive location updates alongside other apps that have already requested them.&lt;/p&gt;&lt;p&gt;This extract from the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/utils/FroyoLocationUpdateRequester.java"&gt;FroyoLocationUpdateRequester&lt;/a&gt; enables passive updates on Froyo+ platforms.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;public void requestPassiveLocationUpdates(long minTime, long minDistance, PendingIntent pendingIntent) {
  locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER,
    PlacesConstants.MAX_TIME, PlacesConstants.MAX_DISTANCE, pendingIntent);    
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As a result receiving background location updates is effectively free! Unfortunately the battery cost of your server downloads aren’t, so you’ll still need to carefully balance how often you act on passive location updates with battery life.&lt;/p&gt;&lt;p&gt;You can achieve a similar effect in pre-Froyo devices using inexact repeating non-wake alarms as shown in the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/utils/LegacyLocationUpdateRequester.java"&gt;LegacyLocationUpdateRequester&lt;/a&gt;. &lt;/p&gt;&lt;pre&gt;&lt;code&gt;public void requestPassiveLocationUpdates(long minTime, long minDistance, 
  PendingIntent pendingIntent) {

  alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,   
    System.currentTimeMillis()+PlacesConstants.MAX_TIME, 
    PlacesConstants.MAX_TIME, pendingIntent);    
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rather than receiving updates from the Location Manager, this technique manually checks the last known location at a frequency determined by the maximum location update latency.&lt;/p&gt;&lt;p&gt;This legacy technique is significantly less efficient, so you may choose to simply disable background updates on pre-Froyo devices.&lt;/p&gt;&lt;p&gt;We handle updates themselves within the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/receivers/PassiveLocationChangedReceiver.java"&gt;PassiveLocationChangedReceiver&lt;/a&gt; which determines the current location and starts the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/services/PlacesUpdateService.java"&gt;PlaceUpdateService&lt;/a&gt;.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;if (location != null) {
  Intent updateServiceIntent = new 
    Intent(PlacesConstants.PLACES_UPDATE_SERVICE_ACTION);
  
  updateServiceIntent.putExtra(PlacesConstants.EXTRA_KEY_LOCATION, location);
  updateServiceIntent.putExtra(PlacesConstants.EXTRA_KEY_RADIUS, 
    PlacesConstants.DEFAULT_RADIUS);
  updateServiceIntent.putExtra(PlacesConstants.EXTRA_KEY_FORCEREFRESH, false);
  context.startService(updateServiceIntent);   
}&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;Using Intents to passively receive location updates when your app isn't active&lt;/h3&gt;&lt;p&gt;You’ll note that we registered the Passive Location Changed Receiver in the application manifest. &lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;receiver android:name=".receivers.PassiveLocationChangedReceiver"&gt;
  &lt;intent-filter&gt;
    &lt;action android:name="com.radioactiveyak.places.passive_location_update_action"&gt;
  &lt;/intent-filter&gt;
&lt;/receiver&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As a result we can continue to receive these background updates even when the application has been killed by the system to free resources.  &lt;/p&gt;&lt;p&gt;This offers the significant advantage of allowing the system to reclaim the resources used by your app, while still retaining the advantages of a zero latency startup. &lt;/p&gt;&lt;p&gt;If your app recognizes the concept of “exiting” (typically when the user clicks the back button on your home screen), it’s good form to turn off passive location updates - including disabling your passive manifest Receiver.&lt;/p&gt;&lt;h3&gt;Being fresh means working offline&lt;/h3&gt;&lt;p&gt;To add offline support we start by caching all our lookup results to the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/content_providers/PlacesContentProvider.java"&gt;PlacesContentProvider&lt;/a&gt; and &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/content_providers/PlaceDetailsContentProvider.java"&gt;PlaceDetailsContentProvider&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Under certain circumstances we will also pre-fetch location details. This snippet from the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/services/PlacesUpdateService.java"&gt;PlacesUpdateService&lt;/a&gt; shows how pre-fetching is enabled for a limited number of locations. &lt;/p&gt;&lt;p&gt;Note that pre-fetching is also potentially disabled while on mobile data networks or when the battery is low.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;if ((prefetchCount &lt; PlacesConstants.PREFETCH_LIMIT) &amp;&amp;
    (!PlacesConstants.PREFETCH_ON_WIFI_ONLY || !mobileData) &amp;&amp;
    (!PlacesConstants.DISABLE_PREFETCH_ON_LOW_BATTERY || !lowBattery)) {
  prefetchCount++;
      
  // Start the PlaceDetailsUpdateService to prefetch the details for this place.
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;We use a similar technique to provide support for offline checkins. The &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/services/PlaceCheckinService.java"&gt;PlaceCheckinService&lt;/a&gt; queues failed checkins, and checkins attempted while offline, to be retried (in order) when the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/receivers/ConnectivityChangedReceiver.java"&gt;ConnectivityChangedReceiver&lt;/a&gt; determines that we’re back online.&lt;/p&gt;&lt;h3&gt;Optimizing battery life: Smart Services and using device state to toggle your manifest Receivers&lt;/h3&gt;&lt;p&gt;There's no point running update services when we aren’t online, so the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/services/PlacesUpdateService.java"&gt;PlaceUpdateService&lt;/a&gt; checks for connectivity before attempting an update.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &amp;&amp;
                      activeNetwork.isConnectedOrConnecting();&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If we’re not connected, the Passive and Active Location Changed Receivers are disabled and the the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/receivers/ConnectivityChangedReceiver.java"&gt;ConnectivityChangedReceiver&lt;/a&gt; is turned on.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;ComponentName connectivityReceiver = 
  new ComponentName(this, ConnectivityChangedReceiver.class);
ComponentName locationReceiver = 
  new ComponentName(this, LocationChangedReceiver.class);
ComponentName passiveLocationReceiver = 
  new ComponentName(this, PassiveLocationChangedReceiver.class);

pm.setComponentEnabledSetting(connectivityReceiver,
  PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 
  PackageManager.DONT_KILL_APP);
            
pm.setComponentEnabledSetting(locationReceiver,
  PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
  PackageManager.DONT_KILL_APP);
      
pm.setComponentEnabledSetting(passiveLocationReceiver,
  PackageManager.COMPONENT_ENABLED_STATE_DISABLED, 
  PackageManager.DONT_KILL_APP);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/receivers/ConnectivityChangedReceiver.java"&gt;ConnectivityChangedReceiver&lt;/a&gt; listens for connectivity changes. When  a new connection is made, it simply disables itself and re-enables the location listeners.&lt;/p&gt;&lt;h3&gt;Monitoring battery state to reduce functionality and save power&lt;/h3&gt;&lt;p&gt;When your phone is on its last 15%, most apps are firmly in the back seat to conserving what watts you have remaining.  We can register manifest Receivers to be alerted when the device enters or leaves the low battery state.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;receiver android:name=".receivers.PowerStateChangedReceiver"&gt;
  &lt;intent-filter&gt;
    &lt;action android:name="android.intent.action.ACTION_BATTERY_LOW"&gt;
    &lt;action android:name="android.intent.action.ACTION_BATTERY_OKAY"&gt;
  &lt;/intent-filter&gt;
&lt;/receiver&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This snippet from the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/receivers/PowerStateChangedReceiver.java"&gt;PowerStateChangedReceiver&lt;/a&gt; disables the &lt;a href="https://code.google.com/p/android-protips-location/source/browse/trunk/src/com/radioactiveyak/location_best_practices/receivers/PassiveLocationChangedReceiver.java"&gt;PassiveLocationChangedReceiver&lt;/a&gt; whenever the device enters a low battery state, and turns it back on once the battery level is okay.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;boolean batteryLow = intent.getAction().equals(Intent.ACTION_BATTERY_LOW);
 
pm.setComponentEnabledSetting(passiveLocationReceiver,
  batteryLow ? PackageManager.COMPONENT_ENABLED_STATE_DISABLED :
               PackageManager.COMPONENT_ENABLED_STATE_DEFAULT,  
  PackageManager.DONT_KILL_APP);&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;You can extend this logic to disable all prefetching or reduce the frequency of your updates during low battery conditions.&lt;/p&gt;&lt;h3&gt;What’s Next?&lt;/h3&gt;&lt;p&gt;This is already a monster post, so I’m going to leave it there. I’ll follow up in the next week with a post on my personal blog, &lt;a href="http://blog.radioactiveyak.com/"&gt;The Radioactive Yak&lt;/a&gt;, that will go in to more detail on the &lt;em&gt;psychic&lt;/em&gt; and &lt;em&gt;smooth&lt;/em&gt; elements of this app like using the Backup Manager and the Cursor Loader.&lt;/p&gt;&lt;p&gt;I also plan to build a similar reference app for news apps, so that I can spend more time reading and less time wa</content:encoded>
<postrank:feed_hash>b367cd57a0a8b2fd5fe28a467bc8dcdd</postrank:feed_hash>
<postrank:postrank>9.5</postrank:postrank>
<postrank:postrank_color>#ff6c1a</postrank:postrank_color>
<postrank:id>f2a83bd8391156e6836f1a2e4aa312e1</postrank:id>
</item>
<item>
<title>53 New APIs: Google+ Hangouts, PicYou, 2009 Recovery Act data</title>
<link>http://blog.programmableweb.com/2011/09/25/53-new-apis-google-hangouts-picyou-2009-recovery-act-data</link>
<description>This week we had 53 new APIs added to our API directory including a photo sharing service, web application analytics service, video chat service, Recovery Act 2009 data, web advertising analytics service and a cloud database service. Below are more details on each of these new APIs. Adigami Web Analytics API: Adigami offers a web analytics monitoring and aggregation tool that lets users view their data in a single dashboard. The REST API is designed to jumpstart developers who need ...</description>
<guid>http://blog.programmableweb.com/2011/09/25/53-new-apis-google-hangouts-picyou-2009-recovery-act-data</guid>
<pubDate>Sun, 25 Sep 2011 09:00:00 GMT</pubDate>
<content:encoded>&lt;p&gt;&lt;a href="http://www.programmableweb.com/apis/directory" title="API Directory"&gt;&lt;img class="imgRight" src="http://blog.programmableweb.com/wp-content/programmableweb.png" /&gt;&lt;/a&gt;
&lt;p&gt;This week we had 53 new APIs added to our &lt;a href="http://www.programmableweb.com/apis/directory" title="API Directory"&gt;API directory&lt;/a&gt; including a photo sharing service, web application analytics service, video chat service, Recovery Act 2009 data, web advertising analytics service and a cloud database service. Below are more details on each of these new APIs.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/adigami-web-analytics"&gt;&lt;img align="left" alt="Adigami Web Analytics" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4420.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/adigami-web-analytics"&gt;Adigami Web Analytics API&lt;/a&gt;: Adigami offers a web analytics monitoring and aggregation tool that lets users view their data in a single dashboard. The REST API is designed to jumpstart developers who need access to all the major web advertising analytics data. Support is included for Google AdWords and Analytics, Microsoft adCenter (Bing and Yahoo search ads), Facebook Ads, Facebook Social (Graph API), DoubleClick (display and search results from ReportCentral), Yahoo APT (display ads),and Twitter. It gives users a few dozen or so standard calls that are applicable across many platforms. Responses are formatted in JSON.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/archimedes-project-donatus"&gt;&lt;img align="left" alt="Archimedes Project Donatus" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4447.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/archimedes-project-donatus"&gt;Archimedes Project Donatus API&lt;/a&gt;: The Donatus system provides a unified frontend to a variety of morphological analysis software and databases. Morphological services are provided through an XML-RPC interface that can be utilized by specialized user applications. In addition to providing access to pre-existing linguistic data, Donatus allows for the dynamic extension of morphological datasets by a user. The API can be used to abstract the linguistic content of a document from its structure and to add entries to the databases. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/burstly"&gt;&lt;img align="left" alt="Burstly" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4412.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/burstly"&gt;Burstly API&lt;/a&gt;: Burstly is a monetization platform for application developers. It allows developers to integrate ads into their applications for profit.&lt;/p&gt;
&lt;p&gt;The Burstly Download Tracking API allows developers to track downloads of their applications, as well as the ad conversions within the applications.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/chicago-metropulse"&gt;&lt;img align="left" alt="Chicago Metropulse" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4446.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/chicago-metropulse"&gt;Chicago Metropulse API&lt;/a&gt;: The Metropulse website is a joint project of the Chicago Metropolitan Agency for Planning (CMAP) and The Chicago Community Trust (the Trust). Metropulse makes available data about the regional quality of life over time in metropolitan Chicago. Available data sets include demographic, economic, transportation and related data for the greater Chicago region. &lt;/p&gt;
&lt;p&gt;The Metropulse API is a service of CMAP. It uses RESTful and GETful protocols and returns responses in XML, AMF and HTML formats. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/cing"&gt;&lt;img align="left" alt="Cing" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4404.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/cing"&gt;Cing API&lt;/a&gt;: Cing is a deal service that provides daily emails, as well as search on their website, for available deals in a city. Deals include food and drink, services, events, retail, and other activities. &lt;/p&gt;
&lt;p&gt;The Cing API allows developers to access deal information from Cing. The API can be used to search and retrieve all available deals within a 25-mile radius of a zip code. The API returns merchant information and deal information.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/cloudsigma"&gt;&lt;img align="left" alt="CloudSigma" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4436.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/cloudsigma"&gt;CloudSigma API&lt;/a&gt;: CloudSigma is an Infrastructure-as-a-Service (IaaS) provider offering high availability, flexible cloud servers and cloud hosting. The API provides access to the full feature set including user management, drives management, servers management and more. The API uses RESTful calls and responses are formatted in TXT.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/curebit"&gt;&lt;img align="left" alt="Curebit" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4430.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/curebit"&gt;Curebit API&lt;/a&gt;: Curebit is a social marketing campaign platform that enables companies to get their customers to refer their friends from social networking services to purchase their products or services. &lt;/p&gt;
&lt;p&gt;The Curebit API allows developers to access the subscribe function in Curebit. As the API is in the initial stage, developers are asked to contact Curebit if they plan on using the API.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/data-translation-web-service-dtws"&gt;&lt;img align="left" alt="Data Translation Web Service (DTWS)" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4398.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/data-translation-web-service-dtws"&gt;Data Translation Web Service (DTWS) API&lt;/a&gt;: The Data Translation Web Service (DTWS) is a service of NASA/Goddard Space Flight Center's Space Physics Data Facility (SPDF) to facilitate and promote data exchanges among space scientists. DTWS supports data in Common Data Format (CDF). The API uses the SOAP protocol and allows users to translate one or more local and/or remote files into other data formats.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/demandware-open-commerce"&gt;&lt;img align="left" alt="Demandware Open Commerce" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4434.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/demandware-open-commerce"&gt;Demandware Open Commerce API&lt;/a&gt;: Demandware offers an on-demand ecommerce platform and is the ecommerce foundation of more than 200 ecommerce websites. The Open Commerce APIs let developers build shopping widgets and experiences – including transactions – external of the native Demandware Commerce platform by allowing outside web applications and enterprise software to interface with all shopping functionality.&lt;/p&gt;
&lt;p&gt;Developers can extend enterprise and commerce functionality to Facebook applications, shoppable blogs, mobile and tablet applications, and recommendation widgets. The APIs expose functionality such as product, catalog, search, promotion, customer account, cart and checkout. Full documentation is not publicly available.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/dialogue-bulk-sms"&gt;&lt;img align="left" alt="Dialogue Bulk SMS" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4448.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/dialogue-bulk-sms"&gt;Dialogue Bulk SMS API&lt;/a&gt;: Dialogue provides interactive services for mobile messaging and mobile billing. Dialogue’s bulk SMS API product lets users send bulk SMS text messages to global networks from their applications using an SMS gateway platform. Users can connect to Dialogue’s SMS gateway platform with one of the following SMS API interfaces: HTTP, SOAP, SMTP, SMPP. Developers must contact Dialogue for API documentation.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/edupedia"&gt;&lt;img align="left" alt="Edupedia" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4450.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/edupedia"&gt;Edupedia API&lt;/a&gt;: Edupedia bills their service as a social learning platform. Edupedia is designed for teachers and students in primary and secondary schools in Hong Kong. All content is from Wikipedia and classified according to the Hong Kong Curriculum Development Program, to enable teachers and students to more quickly search for and use Wikipedia.&lt;/p&gt;
&lt;p&gt;Edupedia provides an API so that schools and other developers can integrate the site content with their applications. Documentation is available to registered members only.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/encodercloud"&gt;&lt;img align="left" alt="EncoderCloud" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4442.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/encodercloud"&gt;EncoderCloud API&lt;/a&gt;: EncoderCloud is a service that allows users to encode video files into compatible formats for web and mobile from any website or application EncoderCloud is integrating into.&lt;/p&gt;
&lt;p&gt;The EncoderCloud API allows developers to integrate EncoderCloud functionality into other websites and applications. Some example API methods include accessing encoding job information and status, creating a new encoding job, and retrieving notifications and details about encoding jobs.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/ersusda-per-capita-food-availability-data"&gt;&lt;img align="left" alt="ERS/USDA Per Capita Food Availability Data" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4400.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/ersusda-per-capita-food-availability-data"&gt;ERS/USDA Per Capita Food Availability Data API&lt;/a&gt;: The Economic Research Service (ERS) is a primary source of economic information and research in the U.S. Department of Agriculture (USDA). The Food Availability (per capita) Data System provides data series on food and nutrient availability. The API provides access to this data using the SOAP protocol and returns responses in .NET DataTable/DataSet and XML. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/fluidvm"&gt;&lt;img align="left" alt="FluidVM" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4298.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/fluidvm"&gt;FluidVM API&lt;/a&gt;: FluidVM is a service that handles systems management, local and iSCSI SAN storage, and network management, along with supporting virtualization technologies, web hosting, and data center environments. For integration into existing products, FluidVM provides an XML-RPC API and a JSON based proxy service. The FluidVM API can handle starting and executing multiple queued tasks, and can later retrieve the status of any tasks. FluidVM also provides two different license options, a permanent license or a monthly license. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/game-jolt"&gt;&lt;img align="left" alt="Game Jolt" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4451.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/game-jolt"&gt;Game Jolt API&lt;/a&gt;: Game Joltis a web site and community centered on free online video games. The API provides access to site data. Data includes users, sessions, trophies, scores and the data store. The API uses RESTful calls and responses are formatted in XML and JSON.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/google-plus-hangouts"&gt;&lt;img align="left" alt="Google Plus Hangouts" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4443.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/google-plus-hangouts"&gt;Google Plus Hangouts API&lt;/a&gt;: Google+ Hangouts is a feature of Google Plus that lets users video chat in the same room as their friends while on the web. The Google+ Hangouts JavaScript API allows users to develop collaborative apps that run inside of a Google+ Hangout. Hangout apps are like normal web apps, but with the addition of the rich, real-time functionality provided by the Hangouts APIs. Apps have the ability to control aspects of the user interface, synchronize data between hangout participants, list hangout participants and respond to various events in the hangout. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/groundlink"&gt;&lt;img align="left" alt="GroundLink" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4423.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/groundlink"&gt;GroundLink API&lt;/a&gt;: GroundLink is a platform that aggregates, manages, and executes ground transportation services. GroundLink works with consumers, travel agents, and travel and transportation providers to offer an engine where users can search for and book ground transportation.&lt;/p&gt;
&lt;p&gt;The GroundLink API allows developers to integrate and access GroundLink functionality and data into other applications. The three API methods are converting addresses to geocode, searching for transportation, and booking transportation. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/groupflier"&gt;&lt;img align="left" alt="GroupFlier" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4432.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/groupflier"&gt;GroupFlier API&lt;/a&gt;: GroupFlier is platform to set up group communications. Users can set up groups to share text messages, voicemails, and conference calls. &lt;/p&gt;
&lt;p&gt;The GroupFlier API allows developers to integrate the functionality of GroupFlier into other applications. Some example API methods include creating and managing groups, finding and managing group members, managing and creating messages, and accessing account information.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/health-indicators-warehouse"&gt;&lt;img align="left" alt="Health Indicators Warehouse" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4399.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/health-indicators-warehouse"&gt;Health Indicators Warehouse API&lt;/a&gt;: The Health Indicators Warehouse (HIW) is a collaboration of many agencies and offices within the Department of Health and Human Services. The HIW is maintained by the Center for Disease Control’s National Center for Health Statistics. The purpose of HIW is to "provide a single, user-friendly, source for national, state, and community health indicators; meet the needs of multiple population health initiatives; facilitate harmonization of indicators across initiatives; link indicators with evidence-based interventions; serve as the data hub for the HHS Community Health Data Initiative to release data, encourage innovative application development, and catalyze change to improve community health."&lt;/p&gt;
&lt;p&gt;The HIW provides an API which uses both the SOAP and RESTful protocols.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/idirectdebit"&gt;&lt;img align="left" alt="iDirectDebit" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4438.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/idirectdebit"&gt;iDirectDebit API&lt;/a&gt;: iDirectDebit provides payment processing services in the UK and abroad including paper and paperless Direct Debits, credit cards, debit cards, checks and postal orders. The iDirectDebit API allows service users to integrate sign up functionality into third party applications. The API supports the creation of a customized Direct Debit sign up wizard and allows Direct Debit Instructions (DDIs) to be easily managed and maintained. It provides users with control over branding, payer sign up, Direct Debit collections, edits, confirmation and reports. The API uses RESTful calls and responses are formatted in XML. Full documentation is not publicly available.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/img-to-css"&gt;&lt;img align="left" alt="IMG to CSS" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4428.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/img-to-css"&gt;IMG to CSS API&lt;/a&gt;: IMG to CSS is a conversion tool that converts image files into HTML/CSS. Using IMG to CSS, users can make sure their images will be seen in emails, as email clients won't block CSS.&lt;/p&gt;
&lt;p&gt;The IMG to CSS API allows developers to access the functionality of IMG to CSS. The API method is generating CSS from image files. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/inveni"&gt;&lt;img align="left" alt="Inveni" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4415.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/inveni"&gt;Inveni API&lt;/a&gt;: Inveni is a movie and TV show recommendation service. Inveni uses both an algorithm and recommendations from user's friends to recommend new movies and TV shows based on a user's taste profile. Inveni also integrates with Netflix.&lt;/p&gt;
&lt;p&gt;Inveni has an API that is available to business partners, but public documentation and information is not available. Those interested should email bizdev@inveni.com to learn more.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/lets-crate"&gt;&lt;img align="left" alt="Let's Crate" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4406.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/lets-crate"&gt;Let's Crate API&lt;/a&gt;: Let's Crate is a file sharing service that allows users to create "crates" to upload files to and generate a link to share with others.&lt;/p&gt;
&lt;p&gt;The Let's Crate API allows developers to access data from Let's Crate. Some example API methods include listing files, uploading files, deleting files, adding crates, listing crates, and deleting crates.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/loggr"&gt;&lt;img align="left" alt="Loggr" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4426.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/loggr"&gt;Loggr API&lt;/a&gt;: Loggr is a service that provides web application analytics. Loggr includes event logging, analytics, and notifications. The analytics and information are completely searchable for users.&lt;/p&gt;
&lt;p&gt;The Loggr API allows developers to access and integrate Loggr functionality and data into other applications. Some example API methods include searching and listing event logs, listing and creating events, listing and creating alerts, and listing and creating bookmarks of events.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/melissa-data-data-quality-suite"&gt;&lt;img align="left" alt="Melissa Data Data Quality Suite" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4463.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/melissa-data-data-quality-suite"&gt;Melissa Data Data Quality Suite API&lt;/a&gt;: Melissa Data provides data quality and data integration services to websites and businesses. Their data can be used to standardize, verify and validate a business' contact data. The Data Quality Suite is a toolkit of APIs for postal address verification, phone verification, email validation and name parsing. The APIs use both REST and SOAP protocol and responses are formatted in XML.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/monitro"&gt;&lt;img align="left" alt="Monitro" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4425.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/monitro"&gt;Monitro API&lt;/a&gt;: Monitro is a website monitoring service. Users can monitor up to three sites for free, and then subscribe to monitor more sites. Monitro will let users know if and when their sites monitored go down.&lt;/p&gt;
&lt;p&gt;Monitro's API is in beta stage, and is asking for developers to let them know if they would like to access the API. Interested developers should email support@monitro.net for access. Some example API methods include adding, deleting, and editing URLs to be monitored, turning on and off monitoring services, and accessing account information.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/multiurl"&gt;&lt;img align="left" alt="MultiURL" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4440.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/multiurl"&gt;MultiURL API&lt;/a&gt;: MultiURL is a tool that lets users combine multiple links into one short link that that can be shared with others. It makes the process of sharing multiple links at once easier, quicker and safer. The links are trackable to see who opens them, as well as customizable. &lt;/p&gt;
&lt;p&gt;The MultiURL API allows developers to integrate the functionality of MultiURL into other applications. Some example API methods include creating a new group of links, deleting links, and accessing information about the links.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/myanimelist"&gt;&lt;img align="left" alt="MyAnimeList" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4437.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/myanimelist"&gt;MyAnimeList API&lt;/a&gt;: MyAnimeList.net is an anime and manga community that introduces visitors to people, anime, manga, and helps them organize their collections. The API lets users interact with the site's data programatically. Functionality includes site search, anime and manga listing, and account verification. The API uses RESTful calls and responses are formatted in XML.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/nasa-coordinated-data-analysis-system-cdas"&gt;&lt;img align="left" alt="NASA Coordinated Data Analysis System (CDAS)" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4397.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/nasa-coordinated-data-analysis-system-cdas"&gt;NASA Coordinated Data Analysis System (CDAS) API&lt;/a&gt;: The Coordinated Data Analysis System (CDAS) supports the plotting of data variables from multiples instruments produced by multiple space physics investigations. Any data that has been produced in Common Data Format (CDF) with the ISTP/IACG Guidelines is accessible. CDAS is a service of NASA/GSFC Space Physics Data Facility (SPDF). There are about 600+ data variables from Geotail, Wind, Interball, Polar, SOHO, ancilliary spacecraft and ground-based investigations accessible in the publicly available database.&lt;/p&gt;
&lt;p&gt;The CDAS Web Services API allows developers to access CDAS data services.  &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/newsfeed-lab"&gt;&lt;img align="left" alt="Newsfeed Lab" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4460.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/newsfeed-lab"&gt;Newsfeed Lab API&lt;/a&gt;: Newsfeed Lab is a hosted API for adding scalable news feeds and activity streams to web and mobile apps. Users can add single or multiple news feeds to their apps and can have newsfeeds across multiple apps depending on their plan. The API uses RESTful calls and responses are formatted in JSON.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/overpass-openstreetmap"&gt;&lt;img align="left" alt="Overpass OpenStreetMap" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4304.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/overpass-openstreetmap"&gt;Overpass OpenStreetMap API&lt;/a&gt;: OpenStreetMap is a free editable map of the whole world, made by users, that allows users to view, edit and use geographical data in a collaborative way from anywhere on Earth. The OpenStreetMap Overpass API is a read-only API that returns XML encoded OSM map data in response to requests. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/picyou"&gt;&lt;img align="left" alt="PicYou" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4427.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/picyou"&gt;PicYou API&lt;/a&gt;: PicYou is a photo sharing site that also works with Facebook and Twitter. Users can upload photos, edit and enhance photos, and share with their friends.&lt;/p&gt;
&lt;p&gt;The PicYou API allows developers to access and integrate PicYou functionality into other applications. Some example API methods include uploading photos, retrieving recently added photos, and accessing information about photos.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/planbox"&gt;&lt;img align="left" alt="Planbox" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4405.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/planbox"&gt;Planbox API&lt;/a&gt;: Planbox is a project</content:encoded>
<postrank:feed_hash>b367cd57a0a8b2fd5fe28a467bc8dcdd</postrank:feed_hash>
<postrank:postrank>9.1</postrank:postrank>
<postrank:postrank_color>#ff7220</postrank:postrank_color>
<postrank:id>f58753d9d2fe869e7458978ea3214dda</postrank:id>
</item>
<item>
<title>Short List of RESTful API Frameworks for PHP</title>
<link>http://blog.programmableweb.com/2011/09/23/short-list-of-restful-api-frameworks-for-php</link>
<description>Having a web API is an essential part of doing business online today.  We wanted to help get you started. So we took some time to pull together a list of the RESTful or RESTish (however you choose to view it) API frameworks, that can help you deploy your API faster. Today we are going to take a look at seven RESTful API frameworks for PHP: Dave - DAVE is a minimalist, multi-node, transactional API framework written in PHP. which contains ...</description>
<guid>http://blog.programmableweb.com/2011/09/23/short-list-of-restful-api-frameworks-for-php</guid>
<pubDate>Fri, 23 Sep 2011 01:00:00 GMT</pubDate>
<content:encoded>&lt;p&gt;&lt;img alt="" class="imgRight" height="50" src="http://blog.programmableweb.com/wp-content/getmeapi.png" title="GET /me/api" width="150" /&gt;Having a web API is an essential part of doing business online today.  We wanted to help get you started. So we took some time to pull together a list of the RESTful or RESTish (however you choose to view it) API frameworks, that can help you deploy your API faster.&lt;/p&gt;
&lt;p&gt;Today we are going to take a look at seven RESTful API frameworks for PHP:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/evantahler/PHP-DAVE-API" title="Dave"&gt;&lt;img align="right" alt="" class="aligncenter size-full wp-image-22867" height="64" src="http://blog.programmableweb.com/wp-content/github-social-coding.png" title="github-social-coding" width="117" /&gt;&lt;/a&gt;&lt;a href="https://github.com/evantahler/PHP-DAVE-API" title="Dave"&gt;Dave&lt;/a&gt;&lt;/strong&gt; - DAVE is a minimalist, multi-node, transactional API framework written in PHP. which contains an end-to-end API test suite for TDD, a Task model, an Active Database Model, and a stand-alone development server to get you started.  DAVE is an acronym that stands for Delete, Add, Edit, and View. These 4 methods make up the core functionality of many transactional web applications. The DAVE API aims to simplify and abstract may of the common tasks that these types of APIs require.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/jmathai/epiphany" title="Epiphany"&gt;&lt;img align="right" alt="" class="aligncenter size-full wp-image-22867" height="64" src="http://blog.programmableweb.com/wp-content/github-social-coding.png" title="github-social-coding" width="117" /&gt;&lt;/a&gt;&lt;a href="https://github.com/jmathai/epiphany" title="Epiphany"&gt;Epiphany&lt;/a&gt;&lt;/strong&gt; – A micro PHP framework that's fast, easy, clean and RESTful. The framework does not do a lot of magic under the hood. It is, by design, very simple and very powerful. The documentation provides a few conventions that will lead to well better code, but you're free to use any style you'd like.  According to Epiphany,  the framework never dictates how you should write or structure your application.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://getfrapi.com/" title="FRAPI"&gt;&lt;img align="right" alt="" class="aligncenter size-full wp-image-22863" height="28" src="http://blog.programmableweb.com/wp-content/frapi-logo1.png" title="frapi-logo" width="79" /&gt;&lt;/a&gt;&lt;strong&gt;&lt;a href="http://getfrapi.com/" title="FRAPI"&gt;FRAPI&lt;/a&gt;&lt;/strong&gt; - FRAPI is a  high-level API framework that powers web apps, mobiles services and legacy systems, enabling a focus on business logic and not the presentation layer.  FRAPI handles multiple media types, response codes and generating API documentation. FRAPI was originally built by echolibre to support the needs of their client’s web apps, and now it’s been open-sourced.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.recessframework.org/" title="Recess"&gt;&lt;img align="right" alt="" class="aligncenter size-thumbnail wp-image-22864" height="50" src="http://blog.programmableweb.com/wp-content/Recess-PHP-Framework-150x50.png" title="Recess-PHP-Framework" width="150" /&gt;&lt;/a&gt;&lt;a href="http://www.recessframework.org/" title="Recess"&gt;Recess&lt;/a&gt;&lt;/strong&gt; - Recess is a RESTful PHP framework that can be used by both beginner and seasoned developers. Recess is fast, light-weight, and has a very small footprint—ideal for LAMP development and drag-and-drop deployment to shared hosts. Recess is a modern framework that uses a loosely-coupled Model-View-Controller architecture designed and optimized specifically for PHP 5.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.slimframework.com/" title="Slim"&gt;&lt;img align="right" alt="" class="aligncenter size-full wp-image-22865" src="http://blog.programmableweb.com/wp-content/Slim.png" title="Slim" width="110" /&gt;&lt;/a&gt;&lt;a href="http://www.slimframework.com/" title="Slim"&gt;Slim&lt;/a&gt;&lt;/strong&gt; - What began as a weekend project became a simple yet powerful PHP 5 framework to create RESTful web applications. The Slim micro framework is everything you need and nothing you don't. Slim lets you build a complete PHP web service with only a single PHP file. Features include: RESTful routing, Named routes, Route passing, Route redirects, Route halting, Custom views, HTTP caching, Signed cookies, Custom 404 page, Custom 500 page, Error handling and Logging.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://peej.github.com/tonic/" title="Tonic"&gt;&lt;img align="right" alt="" class="aligncenter size-thumbnail wp-image-22866" src="http://blog.programmableweb.com/wp-content/Tonic-API-Framework-150x139.png" title="Tonic-API-Framework" width="120" /&gt;&lt;/a&gt;&lt;a href="http://peej.github.com/tonic/" title="Tonic"&gt;Tonic&lt;/a&gt; – &lt;/strong&gt;Tonic is an open source less is more, RESTful Web application development PHP library, where everything useful is a resource, not a file, not a CGI script, a resource, an abstract concept of something useful that the client wants to grab hold of.  Resources are located by URLs, URLs are cheap and form the universal addressing system of the Web.  Tonic helps you develop Web applications that embrace the way the Web really works, enabling your applications to scale, extend and work with other systems easily.&lt;/p&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://framework.zend.com/manual/en/zend.rest.server.html" title="Zend Framework"&gt;&lt;img align="right" alt="" class="aligncenter size-thumbnail wp-image-22869" height="39" src="http://blog.programmableweb.com/wp-content/ZendFramework-logo-150x39.png" title="ZendFramework-logo" width="150" /&gt;&lt;/a&gt;&lt;a href="http://framework.zend.com/manual/en/zend.rest.server.html" title="Zend Framework"&gt;Zend Framework&lt;/a&gt; – &lt;/strong&gt;Zend_Rest_Server is intended as a fully-featured REST server.  To call a Zend_Rest_Server service, you must supply a GET and POST methods, with a value that is the method you wish to call. You can then follow that up with any number of arguments using either the name of the argument or using arg following by the numeric position of the argument. When returning values, you can return a custom status, you may return an array with each status.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;There are a number of Web and MVC frameworks out there that will also deliver a RESTful API, but the above frameworks focus more towards just delivering a RESTful API.&lt;/p&gt;
&lt;p&gt;If you know of any RESTful API framework written in PHP that you’d recommend, please let us know.&lt;/p&gt;
&lt;br /&gt;&lt;p align="center" style="border-top:1px solid black;"&gt;Sponsored by&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://www.programmableweb.com/adserver/www/delivery/ck.php?oaparams=2__bannerid=329__zoneid=33__cb=9771e95a2c__oadest=http%3A%2F%2Fwww.domaintools.com%2Fapi%2F%3Futm_source%3DProgrammableWeb%26utm_medium%3Dbanner%26utm_content%3DOrange_WebsitestoLife%26utm_campaign%3DProgWeb_468x60_RSS" target="_top"&gt;&lt;img alt="" border="0" height="60" src="http://www.programmableweb.com/adserver/www/images/7c41bf7798fd406cb5115401786de535.gif" title="" width="468" /&gt;&lt;/a&gt;&lt;div id="beacon_9771e95a2c"&gt;&lt;img alt="" height="0" src="http://www.programmableweb.com/adserver/www/delivery/lg.php?bannerid=329&amp;amp;campaignid=171&amp;amp;zoneid=33&amp;amp;cb=9771e95a2c" style="width: 0px; height: 0px;" width="0" /&gt;&lt;/div&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ProgrammableWeb?a=qxgnJgHhtVo:l5D8y-I8tY4:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/ProgrammableWeb?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ProgrammableWeb?a=qxgnJgHhtVo:l5D8y-I8tY4:7Q72WNTAKBA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/ProgrammableWeb?d=7Q72WNTAKBA" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/ProgrammableWeb/~4/qxgnJgHhtVo" width="1" /&gt;</content:encoded>
<postrank:feed_hash>b367cd57a0a8b2fd5fe28a467bc8dcdd</postrank:feed_hash>
<postrank:postrank>8.3</postrank:postrank>
<postrank:postrank_color>#ff7f2a</postrank:postrank_color>
<postrank:id>32a35bed16f90189e136f59848d7c6bb</postrank:id>
</item>
<item>
<title>Early Winners and Losers of the Platform Wars</title>
<link>http://blog.programmableweb.com/2011/09/22/early-winners-and-losers-of-the-platform-wars</link>
<description>Delyn Simons is Director of Developer Relations for Mashery (a ProgrammableWeb sponsor). Delyn previously worked in developer community for eBay and still believes that people are basically good. A long time ago in Internet years, in a galaxy not so far away, a handful of tech titans in Silicon Valley and Seattle began building business platforms and battling for supremacy. The mobile device and app revolution hadn't yet begun. Terms like “social networking” and “wisdom of crowds” were going “viral”. ...</description>
<guid>http://blog.programmableweb.com/2011/09/22/early-winners-and-losers-of-the-platform-wars</guid>
<pubDate>Thu, 22 Sep 2011 01:00:00 GMT</pubDate>
<content:encoded>&lt;p&gt;&lt;em&gt;Delyn Simons is Director of Developer Relations for &lt;a href="http://mashery.com/"&gt;Mashery&lt;/a&gt; (a ProgrammableWeb sponsor). Delyn previously worked in developer community for &lt;a href="http://www.ebay.com/"&gt;eBay&lt;/a&gt; and still believes that people are basically good.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="" class="imgRight" height="80" src="http://blog.programmableweb.com/wp-content/2006apis.png" title="Your API is so 2006" width="99" /&gt;A long time ago in Internet years, in a galaxy not so far away, a handful of tech titans in Silicon Valley and Seattle began building business platforms and battling for supremacy. The mobile device and app revolution hadn't yet begun. Terms like “social networking” and “wisdom of crowds” were going “viral”. Web services and APIs were still emerging. The Google IPO of late 2004 had effectively slammed shut the Web 1.0 dotbomb era, paving the way for the amazing evolution of &lt;a href="http://oreilly.com/web2/archive/what-is-web-20.html"&gt;Web 2.0&lt;/a&gt; services in 2005 that hit the mainstream in 2006.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" class="imgLeft" height="163" src="http://blog.programmableweb.com/wp-content/2006tomecruise.jpg" title="Yahoo, Google, YouTube and Tom Cruise" width="250" /&gt;Looking back, 2006 was a pivotal year for tech. &lt;a href="http://aws.amazon.com/"&gt;Amazon Web Services&lt;/a&gt; introduced S3 and EC2 in 2006, completely rewriting the conventional cost benchmarks for funding tech startups. &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt; was vying for the most highly trafficked site on the Internet with Google and Yahoo! &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt; was an upstart university and high school social networking site that wouldn’t open its doors to the public until that Fall. &lt;a href="http://www.yahoo.com/"&gt;Yahoo!&lt;/a&gt; was in the Terry Semel era of building its new media empire. TomKat would descend upon campus for Yahoo! employee meetings, Beck would play at its Hack Days, and business models behind newly acquired Flickr, del.icio.us, and Upcoming would happen in time. &lt;a href="http://www.google.com/"&gt;Google&lt;/a&gt; paid over $1B for new video-sharing service YouTube. A ‘microblogging' service called &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt; launched as an extremely open developer platform. &lt;a href="http://digg.com/"&gt;Digg&lt;/a&gt; was cool. The &lt;a href="http://www.zune.net/en-US/"&gt;Zune&lt;/a&gt; had potential.&lt;/p&gt;
&lt;p&gt;Five years later, it is easier to see now that thinking and acting like a platform was one of the clearest differentiators between winners and losers of these initial platform battles. For these pioneering companies who architected their platforms back in 2006 or earlier, however, the battlefield of today’s full-blown Platform Wars has now changed under their feet. Mobile and location strategies are now as important as social. The app economy has disrupted traditional product channels, enabling independent developers to distribute applications directly to consumers. The product and feature demands of 2011 have evolved, but in many cases the open platforms that developers are using to build applications have not kept pace.&lt;/p&gt;
&lt;p&gt;In my recent talk at Salesforce.com's Dreamforce event, &lt;a href="http://www.slideshare.net/delynsimons/your-api-is-so-2006-9182408"&gt;“Your API is So 2006”&lt;/a&gt;, I shared some top platform trends that companies might consider in order to modernize their services and APIs. Architecting your platform to meet 2011 development standards is one of the best ways you can to enable your company to meet the demands of today’s competitive markets. Thinking like a platform also helps your business prepare for disruptive forces you cannot possibly predict:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) REST is Best:&lt;/strong&gt; Particularly for mobile and front end developers, RESTful APIs that include the option of JSON output formats are an increasing trend. Over 70% of all APIs in ProgrammableWeb's API Directory are &lt;a href="http://blog.programmableweb.com/2011/03/08/3000-web-apis/"&gt;restful, increasingly at the expense of SOAP&lt;/a&gt;. More than 55% of those same APIs support JSON output, with &lt;a href="http://blog.programmableweb.com/2011/05/25/1-in-5-apis-say-bye-xml/"&gt;20% opting not to offer XML at all&lt;/a&gt;. Platforms that support modern protocols, formats and outputs enable developers to build great mobile, social, and location-aware experiences for their customers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2) Chat less, Do more:&lt;/strong&gt; Chatty protocols are out; push notifications are in. &lt;a href="http://www.etsy.com/"&gt;Etsy&lt;/a&gt;, &lt;a href="http://www.flickr.com/"&gt;Flickr&lt;/a&gt;, &lt;a href="http://www.salesforce.com/"&gt;Salesforce.com&lt;/a&gt;, &lt;a href="http://www.ebay.com/"&gt;eBay&lt;/a&gt;, and &lt;a href="https://foursquare.com/"&gt;Foursquare&lt;/a&gt; are just a few of the APIs that allow developers to utilize push notifications instead of constant polling to trigger event-based client notifications for mobile devices. If you don't offer push, you aren’t making it easy enough to build real-time functionality your users crave.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3) Interactive API Documentation:&lt;/strong&gt; Long form, technical manual documentation is great for reference, but not so great for trying to get started building with an API quickly. APIs including &lt;a href="http://developer.klout.com/iodocs"&gt;klout&lt;/a&gt;, &lt;a href="http://developer.alibris.com/iodocs"&gt;alibris&lt;/a&gt;, &lt;a href="http://posterous.com/api"&gt;posterous&lt;/a&gt;, &lt;a href="http://developer.wordnik.com/docs"&gt;wordnik&lt;/a&gt;, and &lt;a href="http://developer.fanfeedr.com/iodocs"&gt;fanfeedr&lt;/a&gt; are following a trend of combining testing tool functionality with API documentation. The result is interactive documentation that returns live data to developers, so they can explore new APIs, learn the underlying call structures, and debug methods quickly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4) The Most Value May Come From Within:&lt;/strong&gt; People hear the word “API” and often assume third party developers will primarily consume the API. More and more companies, including &lt;a href="http://twitter.com/"&gt;Twitter&lt;/a&gt;, &lt;a href="http://app.feeddigest.com/digest3/www.netflix.com/"&gt;netflix&lt;/a&gt;, and &lt;a href="http://www.npr.org/"&gt;npr&lt;/a&gt;, are architecting their APIs to optimize for internal and partner value. Company executives who treat and fund their API as a science experiment instead of a core business driver are not helping their companies realize the full value potential of their API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5) Disruption Happens:&lt;/strong&gt; Myopic, inward focus is a historically dangerous vantage point from which to address disruptive market forces. From the telegraph and railroads of the 19th century to the newspaper, airline travel, and telecommunications industries of today, disruption happens. Businesses who think like a platform can react to disruption more quickly, pivoting entire business models if necessary. The next &lt;a href="http://www.airbnb.com/"&gt;airbnb&lt;/a&gt;, &lt;a href="https://squareup.com/"&gt;square&lt;/a&gt;, &lt;a href="http://www.spotify.com/"&gt;spotify&lt;/a&gt;, or &lt;a href="http://www.skype.com/"&gt;skype&lt;/a&gt; will eventually happen in your industry. In a world of accelerating industry disruption, consolidation and fragmentation, APIs help prepare your company to take advantage.&lt;/p&gt;
&lt;div style="text-align: center"&gt;&lt;iframe frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/9182408" width="425"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;Look back to 2006 one more time, then fast forward to the business realities of today. Would you rather be Amazon or Borders? Facebook or MySpace? Netflix or Blockbuster? iTunes or any record label you can name? Best Buy or Circuit City? There are already early winners and losers of the Platform Wars. When you think like a platform and meet the needs of mobile and web developers today, your business is more likely to weather the inevitable disruptions of tomorrow. Prepare to be resilient. Market forces that will change your business are already forming and heading your way.&lt;/p&gt;
&lt;br /&gt;&lt;p align="center" style="border-top:1px solid black;"&gt;Sponsored by&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://www.programmableweb.com/adserver/www/delivery/ck.php?oaparams=2__bannerid=299__zoneid=33__cb=920088c63d__oadest=http%3A%2F%2Fwww.NN4D.com%2Fappwarehouse%2Fdeveloperswanted" target="_top"&gt;&lt;img alt="" border="0" height="60" src="http://www.programmableweb.com/adserver/www/images/9a72c4a74b571c5bc3dd5eff238d5759.gif" title="" width="468" /&gt;&lt;/a&gt;&lt;div id="beacon_920088c63d"&gt;&lt;img alt="" height="0" src="http://www.programmableweb.com/adserver/www/delivery/lg.php?bannerid=299&amp;amp;campaignid=130&amp;amp;zoneid=33&amp;amp;cb=920088c63d" style="width: 0px; height: 0px;" width="0" /&gt;&lt;/div&gt;&lt;/p&gt;&lt;div&gt;&lt;h5&gt;Related ProgrammableWeb Resources&lt;/h5&gt;&lt;p&gt;&lt;img alt="Etsy" src="http://www.google.com/s2/favicons?domain=www.etsy.com" /&gt; &lt;a href="http://www.programmableweb.com/api/etsy"&gt;Etsy API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/etsy/mashups"&gt;18 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Flickr" src="http://www.google.com/s2/favicons?domain=flickr.com" /&gt; &lt;a href="http://www.programmableweb.com/api/flickr"&gt;Flickr API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/flickr/mashups"&gt;583 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Salesforce.com" src="http://www.google.com/s2/favicons?domain=salesforce.com" /&gt; &lt;a href="http://www.programmableweb.com/api/salesforce.com"&gt;Salesforce.com API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/salesforce.com/mashups"&gt;43 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="eBay" src="http://www.google.com/s2/favicons?domain=ebay.com" /&gt; &lt;a href="http://www.programmableweb.com/api/ebay"&gt;eBay API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/ebay/mashups"&gt;213 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Foursquare" src="http://www.google.com/s2/favicons?domain=foursquare.com" /&gt; &lt;a href="http://www.programmableweb.com/api/foursquare"&gt;Foursquare API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/foursquare/mashups"&gt;51 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Klout" src="http://www.google.com/s2/favicons?domain=www.klout.com" /&gt; &lt;a href="http://www.programmableweb.com/api/klout"&gt;Klout API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/klout/mashups"&gt;3 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Alibris" src="http://www.google.com/s2/favicons?domain=www.alibris.com" /&gt; &lt;a href="http://www.programmableweb.com/api/alibris"&gt;Alibris API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/alibris/mashups"&gt;1 mashup&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Posterous" src="http://www.google.com/s2/favicons?domain=posterous.com" /&gt; &lt;a href="http://www.programmableweb.com/api/posterous"&gt;Posterous API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/posterous/mashups"&gt;2 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Wordnik" src="http://www.google.com/s2/favicons?domain=www.wordnik.com" /&gt; &lt;a href="http://www.programmableweb.com/api/wordnik"&gt;Wordnik API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/wordnik/mashups"&gt;2 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="FanFeedr Sports News" src="http://www.google.com/s2/favicons?domain=www.fanfeedr.com" /&gt; &lt;a href="http://www.programmableweb.com/api/fanfeedr-sports-news"&gt;FanFeedr Sports News API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/fanfeedr-sports-news/mashups"&gt;11 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Twitter" src="http://www.google.com/s2/favicons?domain=twitter.com" /&gt; &lt;a href="http://www.programmableweb.com/api/twitter"&gt;Twitter API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/twitter/mashups"&gt;618 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Netflix" src="http://www.google.com/s2/favicons?domain=www.netflix.com" /&gt; &lt;a href="http://www.programmableweb.com/api/netflix"&gt;Netflix API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/netflix/mashups"&gt;21 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="NPR" src="http://www.google.com/s2/favicons?domain=npr.org" /&gt; &lt;a href="http://www.programmableweb.com/api/npr"&gt;NPR API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/npr/mashups"&gt;5 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Spotify Metadata" src="http://www.google.com/s2/favicons?domain=spotify.com" /&gt; &lt;a href="http://www.programmableweb.com/api/spotify-metadata"&gt;Spotify Metadata API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/spotify-metadata/mashups"&gt;15 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Skype" src="http://www.google.com/s2/favicons?domain=skype.com" /&gt; &lt;a href="http://www.programmableweb.com/api/skype"&gt;Skype API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/skype/mashups"&gt;28 mashups&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ProgrammableWeb?a=cEwYW04Nkc0:_gUwK81CnM8:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/ProgrammableWeb?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ProgrammableWeb?a=cEwYW04Nkc0:_gUwK81CnM8:7Q72WNTAKBA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/ProgrammableWeb?d=7Q72WNTAKBA" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/ProgrammableWeb/~4/cEwYW04Nkc0" width="1" /&gt;</content:encoded>
<postrank:feed_hash>b367cd57a0a8b2fd5fe28a467bc8dcdd</postrank:feed_hash>
<postrank:postrank>7.7</postrank:postrank>
<postrank:postrank_color>#ff8832</postrank:postrank_color>
<postrank:id>be5643f9ac9879c8d0c735f812f2367b</postrank:id>
</item>
<item>
<title>Euro Android Developer Labs</title>
<link>http://android-developers.blogspot.com/2011/09/euro-android-developer-labs.html</link>
<description>This series started last month, and now registration is open for the European leg:Berlin—September 28 and 29.London—October 3 and 5.Paris—TBD (late October), but register now.Remember, this ADL series isn’t another set of introduction-to-Android sessions, nor any other kind of general overview. It's specifically aimed at optimizing Android apps for tablets, in particular creating high-quality tablet apps with an emphasis on polish and user-experience.Registration is a two-step process. Anyone can register, but we can only accommodate a relatively small number of ...</description>
<guid>http://android-developers.blogspot.com/2011/09/euro-android-developer-labs.html</guid>
<pubDate>Wed, 21 Sep 2011 10:26:00 GMT</pubDate>
<content:encoded>&lt;p&gt;This series &lt;a href="http://android-developers.blogspot.com/2011/08/android-developer-labs-2011.html"&gt;started last month&lt;/a&gt;, and now &lt;a href="https://sites.google.com/site/androiddevlabs2011/index"&gt;registration is open&lt;/a&gt; for the European leg:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Berlin&amp;nbsp;—&amp;nbsp;September 28 and 29.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;London&amp;nbsp;—&amp;nbsp;October 3 and 5.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Paris&amp;nbsp;—&amp;nbsp;TBD (late October), but register now.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Remember, this ADL series isn’t another set of introduction-to-Android sessions, nor any other kind of general overview. It's specifically aimed at optimizing Android apps for tablets, in particular creating high-quality tablet apps with an emphasis on polish and user-experience.&lt;/p&gt;&lt;p&gt;Registration is a two-step process. Anyone can register, but we can only accommodate a relatively small number of attendees from among the registrants, based on whether they already have an Android app with the potential to be a top-tier tablet app in terms of quality, fit, and finish. The goal is to bring your app to the ADL, and leave equipped to make it into one that makes Android tablet users smile.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/6755709643044947179-1934213262974721775?l=android-developers.blogspot.com" width="1" /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=raTI0Kx8R5s:UZ_yxirsPBI:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=raTI0Kx8R5s:UZ_yxirsPBI:-BTjWOF_DHI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=raTI0Kx8R5s:UZ_yxirsPBI:-BTjWOF_DHI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/raTI0Kx8R5s" width="1" /&gt;</content:encoded>
<postrank:feed_hash>b367cd57a0a8b2fd5fe28a467bc8dcdd</postrank:feed_hash>
<postrank:postrank>8.6</postrank:postrank>
<postrank:postrank_color>#ff7a26</postrank:postrank_color>
<postrank:id>fe8c6993b7ea409fe224207ea2e32b89</postrank:id>
</item>
<item>
<title>Preparing for Handsets</title>
<link>http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html</link>
<description>[This post is by Scott Main, lead tech writer for developer.android.com.—TimBray]Early this year, Honeycomb (Android 3.0) launched for tablets. Although Honeycomb remains tablets-only, the upcoming Ice Cream Sandwich (ICS) release will support big screens, small screens, and everything in between. This is the way Android will stay from now on: the same version runs on all screen sizes.Some Honeycomb apps assume that they’ll run only on a large screen, and have baked that into their designs. This assumption is currently ...</description>
<guid>http://android-developers.blogspot.com/2011/09/preparing-for-handsets.html</guid>
<pubDate>Mon, 19 Sep 2011 10:26:00 GMT</pubDate>
<content:encoded>&lt;a href="http://3.bp.blogspot.com/-ICF_-w7Of4o/Thsttq7Hr9I/AAAAAAAAAh8/UECE2TIepTs/s1600/scott.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5628142421969186770" src="http://3.bp.blogspot.com/-ICF_-w7Of4o/Thsttq7Hr9I/AAAAAAAAAh8/UECE2TIepTs/s400/scott.png" style="border: 5px solid #ddd; float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 185px; height: 228px;" /&gt;&lt;/a&gt;&lt;p&gt;&lt;i&gt;[This post is by Scott Main, lead tech writer for &lt;a href="http://developer.android.com"&gt;developer.android.com&lt;/a&gt;.&amp;nbsp;—&amp;nbsp;Tim&amp;nbsp;Bray]&lt;/i&gt;&lt;/p&gt;&lt;p&gt;Early this year, Honeycomb (Android 3.0) launched for tablets. Although Honeycomb remains tablets-only, the upcoming Ice Cream Sandwich (ICS) release will support big screens, small screens, and everything in between. This is the way Android will stay from now on: the same version runs on all screen sizes.&lt;/p&gt;&lt;p&gt;Some Honeycomb apps assume that they’ll run only on a large screen, and have baked that into their designs. This assumption is currently true, but will become false with the arrival of ICS, because Android apps are forward-compatible&amp;nbsp;—&amp;nbsp;an app developed for Honeycomb is compatible with a device running ICS, which could be a tablet, a phone, or something else.&lt;/p&gt;&lt;p&gt;So, if you’ve developed a tablet app on Honeycomb, it’s important that your app do one of two things: prevent installation on smaller screens or (preferably) support smaller screens with the same APK.&lt;/p&gt;&lt;h3&gt;Making your Honeycomb app for tablets only&lt;/h3&gt;&lt;p&gt;If you don’t want your app to be used on handsets (perhaps it truly makes sense only on a large screen) or you need more time to update it, add the following &lt;a href="http://developer.android.com/guide/topics/manifest/supports-screens-element.html"&gt;&lt;code&gt;&lt;supports-screens&gt;&lt;/code&gt;&lt;/a&gt; declaration to your manifest:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;manifest&gt;
    &lt;supports-screens android:largescreens="false" android:normalscreens="false" android:requiressmallestwidthdp="600" android:smallscreens="false" android:xlargescreens="true"&gt;
    &lt;application&gt;
        ...
    &lt;/application&gt;
&lt;/manifest&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This describes your app’s screen-size support in two different ways:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;It declares that the app does not support the screen size buckets “small”, “normal”, and “large”, which are traditionally not tablets&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;It declares that the app requires a screen size with a minimum usable area that is at least 600dp wide&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The first technique is for devices that are running Android 3.1 or older, because those devices declare their size based on generalized screen size buckets. The &lt;a href="http://developer.android.com/guide/topics/manifest/supports-screens-element.html#requiresSmallest"&gt;requiresSmallestWidthDp&lt;/a&gt; attribute is for devices running Android 3.2 and newer, which added the capability for apps to  specify their size requirements based on a minimum number of density-independent pixels.  In this example, the app declares a minimum width requirement of 600dp, which generally implies a 7”-or-greater screen. &lt;/p&gt;&lt;p&gt;Your size choice might be different, of course, based on how well your design works on different screen sizes; for example, if your design works well only on screens that are 9” or larger, you might require a minimum width of 720dp.&lt;/p&gt;&lt;p&gt;The catch is that you must compile your application against Android 3.2 or higher in order to use the &lt;code&gt;requiresSmallestWidthDp&lt;/code&gt; attribute. Older versions don’t understand this attribute and will raise a compile-time error. The safest thing to do is develop your app against the platform that matches the API level you’ve set for &lt;a href="http://developer.android.com/guide/topics/manifest/uses-sdk-element.html#min"&gt;minSdkVersion&lt;/a&gt;. When you’re making final preparations to build your release candidate, change the build target to Android 3.2 and add the &lt;code&gt;requiresSmallestWidthDp&lt;/code&gt; attribute. Android versions older than 3.2 simply ignore that XML attribute, so there’s no risk of a runtime failure.&lt;/p&gt;&lt;p&gt;For more information about why the “smallest width” screen size is important for supporting different screen sizes, read &lt;a href="http://android-developers.blogspot.com/2011/07/new-tools-for-managing-screen-sizes.html"&gt;New Tools for Managing Screen Sizes&lt;/a&gt; (really; it’s got lots of things you need to know).&lt;/p&gt;&lt;h3&gt;Making your Honeycomb app work on handsets&lt;/h3&gt;&lt;p&gt;On the other hand, if you want to distribute your app to devices of all sizes, we recommend that you update your existing Honeycomb app to work on smaller screens as well, rather than publishing multiple APKs. &lt;/p&gt;&lt;p&gt;Optimizing for handsets can be tricky if your designs currently use all of a large screen to deliver  content. It’s worth the effort, though, because Ice Cream Sandwich brings the Honeycomb APIs to handsets and you’ll significantly increase the user-base for your app. Using a single APK for all devices also simplifies your updating and publishing process and makes it easier for users to identify your app.&lt;/p&gt;&lt;p&gt;Here are two guidelines to help make your Honeycomb tablet app work well on handsets:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Build your design around Fragments that you can reuse in different combinations, in single-pane layouts on handsets and multi-pane layouts on tablets&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Be conservative with your Action Bar design so the system can adjust its layout based on the screen size&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h4&gt;Creating single-pane and multi-pane layouts&lt;/h4&gt;&lt;p&gt;The most effective way to optimize your app for both handsets and tablets is to combine fragments in different ways to create “single-pane” layouts for handsets and “multi-pane” layouts for tablets. There are two approaches to doing this:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;For any screen in which your tablet version displays multiple fragments, use the same activity for handsets, but show only one fragment at a time&amp;nbsp;—&amp;nbsp;swapping the fragments within the activity when necessary. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Use separate activities to host each fragment on a handset. For example, when the tablet UI uses two fragments in an activity, use the same activity for handsets, but supply an alternative layout that includes just one fragment. When you need to switch fragments (such as when the user selects an item), start another activity that hosts the other fragment.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The approach you choose depends on your app design and personal preferences. The first option (single activity) requires that you dynamically add each fragment to the activity at runtime---rather than declare the fragments in your activity’s layout file&amp;nbsp;—&amp;nbsp;because you cannot remove a fragment from an activity if it’s been declared in the XML layout. You might also need to update the action bar each time the fragments change, depending on what actions or navigation modes are provided for the fragment. In some cases, these factors might not matter to your app, so using one activity and swapping fragments will work well. Other times, however, using just one activity and dynamically swapping fragments can make your code more complicated, because you must manage all the fragment combinations in the activity’s code rather than leveraging alternative layout files.&lt;/p&gt;&lt;p&gt;I’m going to talk about the second option in more detail. It might be a little more up-front work, because each fragment must work well across separate activities, but it usually pays off. It means that you can use alternative layout files that define different fragment combinations, keep fragment code modular, simplify action bar management, and let the system handle all the back stack work.&lt;/p&gt;&lt;p&gt;The following figure demonstrates how an application with two fragments can be arranged for both handsets and tablets when using separate activities for the handset design:&lt;/p&gt;&lt;a href="http://2.bp.blogspot.com/-5tx-S4aRB70/Tnd2n4Ih4gI/AAAAAAAAArU/kqujPLvcgUk/s1600/fragments.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5654118284642083330" src="http://2.bp.blogspot.com/-5tx-S4aRB70/Tnd2n4Ih4gI/AAAAAAAAArU/kqujPLvcgUk/s400/fragments.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 228px;" /&gt;&lt;/a&gt;&lt;p&gt;In this app, Activity A is the “main activity” and uses different layouts to display either one or two fragments at a time, depending on the size of the screen. When on a handset-sized screen, the layout contains only Fragment A (the list view); when on a tablet-sized screen, the layout contains both Fragment A and Fragment B. &lt;/p&gt;&lt;p&gt;Here’s &lt;code&gt;res/layout/main.xml&lt;/code&gt; for handsets:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;framelayout android:layout_height="match_parent" android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"&gt;
    &lt;fragment android:id="@+id/list_frag" android:layout_height="match_parent" android:layout_width="match_parent" class="&amp;lt;b&amp;gt;com.example.android.TitlesFragment&amp;lt;/b&amp;gt;"&gt;
&lt;/framelayout&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And &lt;code&gt;res/layout-large/main.xml&lt;/code&gt; for tablets:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;linearlayout android:id="@+id/frags" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="horizontal" xmlns:android="http://schemas.android.com/apk/res/android"&gt;
  &lt;fragment android:id="@+id/list_frag" android:layout_height="match_parent" android:layout_width="@dimen/titles_size" class="&amp;lt;b&amp;gt;com.example.android.TitlesFragment&amp;lt;/b&amp;gt;"&gt;
  &lt;fragment android:id="@+id/details_frag" android:layout_height="match_parent" android:layout_width="match_parent" class="&amp;lt;b&amp;gt;com.example.android.DetailsFragment&amp;lt;/b&amp;gt;"&gt;
&lt;/linearlayout&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;How the application responds when a user selects an item from the list depends on whether Fragment B is available in the layout. If Fragment B is there,  Activity A notifies Fragment B to update itself. If Fragment B is not in the layout, Activity A starts Activity B (which hosts Fragment B).&lt;/p&gt;&lt;p&gt;To implement this pattern for your application, it's important that you develop your fragments to be highly compartmentalized. Specifically, you should follow two general guidelines:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;Do not manipulate one fragment directly from another.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Keep all code that concerns content in a fragment inside that fragment, rather than putting it in the host activity’s code.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;To avoid directly calling one fragment from another, declare a callback interface in each fragment class that it can use to deliver events to its host activity, which implements the callback interface. When the activity receives a callback due to an event (such as the user selecting a list item), it acts appropriately based on the current fragment configuration.&lt;/p&gt;&lt;p&gt;For example, Activity A from above handles item selections like this:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;/** This is a callback that the list fragment (Fragment A) calls
    when a list item is selected */
public void onItemSelected(int position) {
  DisplayFragment fragB = (DisplayFragment) getFragmentManager()
                              .findFragmentById(R.id.display_frag);
  if (fragB == null) {
      // DisplayFragment (Fragment B) is not in the layout, 
      // start DisplayActivity (Activity B)
      // and pass it the info about the selected item
      Intent intent = new Intent(this, DisplayActivity.class);
      intent.putExtra("position", position);
      startActivity(intent);
  } else {
      // DisplayFragment (Fragment B) is in the layout, tell it to update
      fragB.updateContent(position);
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When &lt;code&gt;DisplayActivity&lt;/code&gt; (Activity B) starts, it reads the data delivered by the Intent and passes it to the &lt;code&gt;DisplayFragment&lt;/code&gt; (Fragment B).&lt;/p&gt;&lt;p&gt;If Fragment B needs to deliver a result back to Fragment A, then the process works similarly with a callback interface between Fragment B and Activity B. That is, Activity B implements a callback interface defined by Fragment B. When Activity B gets the callback, it sets the result for the activity and finishes itself. Activity A then receives the result and delivers it to Fragment A.&lt;/p&gt;&lt;p&gt;For a complete demonstration of this technique for creating different fragment combinations for different tablets and handsets, look at the code for this updated version of the &lt;a href="http://developer.android.com/shareables/HoneycombGalleryV2.zip"&gt;Honeycomb Gallery sample&lt;/a&gt; (ZIP file).&lt;/p&gt;&lt;h3&gt;Making the Action Bar work on handsets&lt;/h3&gt;&lt;p&gt;As long as you’ve been using the framework’s implementation of &lt;a href="http://developer.android.com/reference/android/app/ActionBar.html"&gt;ActionBar&lt;/a&gt; for your tablet app (rather than building your own), the conversion from tablets to handsets should be painless. The Android system will do the work for you; all you need to do is ensure that your action bar design is flexible. Here are some important tips:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;When setting a menu item to be an action item, &lt;em&gt;avoid using the “always” value&lt;/em&gt;. Use “ifRoom” for action items you’d like to add to the action bar. Now, you might need “always” when an action view does not have an alternative action for the overflow menu or when a menu item added by a fragment is low in the menu order and it must jump into the action bar at all times. But you should not use “always” more than once or twice.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;When possible, &lt;em&gt;provide icons for all action items&lt;/em&gt; and declare &lt;code&gt;showAsAction="ifRoom|withText"&lt;/code&gt;. This way, if there’s not enough room for the text, but there is enough for the icon, then just the icon may be used.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;Avoid using custom navigation modes in the action bar&lt;/em&gt;. Use the built-in tab and drop-down navigation modes&amp;nbsp;—&amp;nbsp;they’re designed to be flexible and adapt to different screen sizes. For example, when the width is too narrow for both tabs and other action items, the tabs appear below the action bar. If your app requires a custom navigation mode in the action bar, thoroughly test it on smaller screens when Ice Cream Sandwich becomes available and make any adjustments necessary for a narrow action bar.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;For example, the mock ups below demonstrates how the system might adapt an app’s action bar based on the available screen space. On the handset, only two action items fit, so the remaining menu items appear in the traditional menu and the tabs appear in a separate row. On the tablet, more action items can fit in the action bar and so do the tabs.&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/-OxiegwhkSI8/Tnd20i8UFgI/AAAAAAAAArc/ZKeG4WPeeMA/s1600/actionbar-phone-tablet.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5654118502292002306" src="http://4.bp.blogspot.com/-OxiegwhkSI8/Tnd20i8UFgI/AAAAAAAAArc/ZKeG4WPeeMA/s400/actionbar-phone-tablet.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 205px;" /&gt;&lt;/a&gt;&lt;h3&gt;Some other tips&lt;/h3&gt;&lt;ul&gt;&lt;li&gt;&lt;p&gt;When working with a &lt;a href="http://developer.android.com/reference/android/widget/ListView.html"&gt;ListView&lt;/a&gt;, consider how you might provide more or less information in each list item based on the available space. That is, you can create alternative layouts to be used by the items in your list adapter such that a large screen might display more detail for each item.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Create &lt;a href="http://developer.android.com/guide/topics/resources/more-resources.html"&gt;alternative resource files&lt;/a&gt; for values such as integers, dimensions, and even booleans. Using size qualifiers for these resources, you can easily apply different layout sizes, font sizes, or enable/disable features based on the current screen size.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3&gt;Testing your handset support&lt;/h3&gt;&lt;p&gt;At this point you might be wondering, “How do I test my layout for smaller screens without a handset that runs Honeycomb?” Well, until Ice Cream Sandwich is available for the SDK, you technically can’t. So don’t publish your changes until you’re able to test on a device or emulator running ICS. &lt;/p&gt;&lt;p&gt;However, you can begin some early testing of your alternative layouts with a little trick: instead of using the “large” configuration qualifier for the tablet layouts, use the “land” qualifier (that is, instead of &lt;code&gt;res/layout-large/main.xml&lt;/code&gt;, use &lt;code&gt;res/layout-land/main.xml&lt;/code&gt;). This way, a Honeycomb tablet (or emulator) in landscape orientation uses your tablet design and the same device in portrait orientation uses your handset design. Just be certain to switch back to using the size qualifiers once you’re able to test on ICS.&lt;/p&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;p&gt;Ice Cream Sandwich is coming, and with it, handsets will be able to install apps built on Honeycomb. We haven’t released the ICS SDK just yet, but you can start preparing your Honeycomb apps by thinking about how they should work on smaller screens.&lt;/p&gt;&lt;p&gt;So if you have a Honeycomb tablet app out there (and by that, I mean an app with &lt;code&gt;minSdkVersion="11"&lt;/code&gt; or higher), you should make sure it’s available only on large screen devices for now. We hope that you’ll then follow our advice here and optimize your tablet app to support smaller screens, using the same APK for both tablets and handsets.&lt;/p&gt;&lt;p&gt;If your app supports API levels lower than 11, then there’s probably nothing you need to do right now, because your app is already running on handset devices. When the ICS SDK does arrive, though, it’ll still be important that you verify your app’s performance on the new platform. &lt;/p&gt;&lt;p&gt;Stay tuned to the blog for more information about ICS as it nears release.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/6755709643044947179-2402592046885452873?l=android-developers.blogspot.com" width="1" /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=zCp4pWmEZyU:OXUMGEZLn8E:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=zCp4pWmEZyU:OXUMGEZLn8E:-BTjWOF_DHI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=zCp4pWmEZyU:OXUMGEZLn8E:-BTjWOF_DHI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/zCp4pWmEZyU" width="1" /&gt;</content:encoded>
<postrank:feed_hash>b367cd57a0a8b2fd5fe28a467bc8dcdd</postrank:feed_hash>
<postrank:postrank>10.0</postrank:postrank>
<postrank:postrank_color>#ff6514</postrank:postrank_color>
<postrank:id>1bcd36a13c3c06b9d4d54f94d1b1c324</postrank:id>
</item>
<item>
<title>40 New APIs: Google Plus, Social Trip Planning, Foodspotting</title>
<link>http://blog.programmableweb.com/2011/09/18/40-new-apis-google-plus-social-trip-planning-foodspotting</link>
<description>This week we had 40 new APIs added to our API directory including a social trip planning service, content sharing service, startup financing community, website video recording tool, food review and sharing service, and a mobile marketing service. Below are more details on each of these new APIs. Add To Trip API: Add to Trip is a centralized white-label, graph-api platform where travelers can collaborate with friends and family on a trip via their website or application. The Add to ...</description>
<guid>http://blog.programmableweb.com/2011/09/18/40-new-apis-google-plus-social-trip-planning-foodspotting</guid>
<pubDate>Sun, 18 Sep 2011 09:00:00 GMT</pubDate>
<content:encoded>&lt;p&gt;&lt;a href="http://www.programmableweb.com/apis/directory" title="API Directory"&gt;&lt;img class="imgRight" src="http://blog.programmableweb.com/wp-content/programmableweb.png" /&gt;&lt;/a&gt;
&lt;p&gt;This week we had 40 new APIs added to our &lt;a href="http://www.programmableweb.com/apis/directory" title="API Directory"&gt;API directory&lt;/a&gt; including a social trip planning service, &lt;a href="http://blog.programmableweb.com/2011/09/15/google-plus-api-for-public-data-released"&gt;content sharing service&lt;/a&gt;, startup financing community, website video recording tool, &lt;a href="http://blog.programmableweb.com/2011/09/12/the-dish-on-foodspottings-semi-public-api"&gt;food review and sharing service&lt;/a&gt;,  and a mobile marketing service. Below are more details on each of these new APIs. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/add-to-trip"&gt;&lt;img align="left" alt="Add To Trip" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4389.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/add-to-trip"&gt;Add To Trip API&lt;/a&gt;: Add to Trip is a centralized white-label, graph-api platform where travelers can collaborate with friends and family on a trip via their website or application. &lt;/p&gt;
&lt;p&gt;The Add to Trip API lets users manage a social travel network including user creation/authentication, social notifications, geolocation searches, trip itineraries, travel related objects and more. With the API, developers can create trips; add hotels, flights and more to that trip; invite friends to join the trip via social tools such as Facebook, Twitter and LinkedIn; use geolocation to look up other user's trips and recommendations. &lt;/p&gt;
&lt;p&gt;The API also lets users create a social travel graph by relating objects to each other. Users can get information about travel-specific items such as restaurants, hotels, points of interest, activities, shopping, purchase history, and their relationships between each other and people. This functionality allows users to create believable recommendations based on where someone has traveled, their purchase behavior, and their friends. In addition, the Add to Trip API has a messaging mechanism, where any thread of messages can be related to any other API object. The API uses RESTful calls and responses are fomratted in JSON.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/adigami-web-analytics"&gt;&lt;img align="left" alt="Adigami Web Analytics" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4420.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/adigami-web-analytics"&gt;Adigami Web Analytics API&lt;/a&gt;: Adigami offers an SEO monitoring and aggregation tool that lets users view web analytics data. The REST API gives users access to all the major web advertising analytics data. Support is included for Google AdWords and Analytics Microsoft adCenter (Bing and Yahoo search ads) Facebook Ads Facebook Social (Graph API) DoubleClick (display and search results from ReportCentral) Yahoo APT (display ads) Twitter. It gives users a dozen or so standard calls that are applicable across many platforms. Responses are formatted in JSON.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/amadeus-cruise"&gt;&lt;img align="left" alt="Amadeus Cruise" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4409.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/amadeus-cruise"&gt;Amadeus Cruise API&lt;/a&gt;: Amadeus is the leading provider of IT solutions and transaction processor to the travel and tourism industry. Amadeus provides processing services including search, pricing, booking and ticketing in real-time to travel providers and travel agencies.&lt;/p&gt;
&lt;p&gt;Amadeus Cruise Direct Connect is a worldwide distribution channel and  provides a way to book cruises. It enables cruise providers to focus on customer service and reduce call center costs by increasing the automation rate; converting telephone bookings into online bookings.  &lt;/p&gt;
&lt;p&gt;The API is a connection between the Amadeus system and a user's own reservation system, enabling agencies to view their live, real-time inventory and availability when accessing Amadeus' sales and e-commerce solutions. The API offers the following functionality: distribution via online travel agencies and private-labeled cruise B2B and B2C applications. Full documentation is not publicly available.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/angellist"&gt;&lt;img align="left" alt="AngelList" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4407.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/angellist"&gt;AngelList API&lt;/a&gt;: AngelList is a community of startups and investors with the goal of making fund raising efficient. Angel investors are listed along with contact information which startups can use to set up introductions. The AngelList API provides developers with a RESTful interface to the AngelList data set. Data includes followers, reviews, startups and more. Responses are formatted in JSON and JSONP.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/audiomicro"&gt;&lt;img align="left" alt="AudioMicro" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4379.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/audiomicro"&gt;AudioMicro API&lt;/a&gt;: AudioMicro is a stock music and sound effects collection. AudioMicro licenses stock music and sound effects to producers to be included in their media. &lt;/p&gt;
&lt;p&gt;The AudioMicro API allows developers to access content and data from AudioMicro to create other applications. Some example API methods include searching the library by category and sub-categories, downloading track URLs, and retrieving the most recent tracks and the most popular tracks.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/automeme"&gt;&lt;img align="left" alt="Automeme" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4392.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/automeme"&gt;Automeme API&lt;/a&gt;: Automeme is an automated meme generator, churning out random nonsense on demand. The API lets users add memes to their web site or application. It uses RESTful calls and responses are formatted in JSON, HTML and TXT.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/citygroups"&gt;&lt;img align="left" alt="CityGroups" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4387.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/citygroups"&gt;CityGroups API&lt;/a&gt;: CityGroups is a searchable public directory that allows community organizers and residents to find community groups by location and topic. CityGroups helps connect and publicize these groups by working with local community groups, governments and local technologists to make an open platform for finding and recommending groups working to make cities better.&lt;/p&gt;
&lt;p&gt;The directory uses a simple data standard that allows humans and computers to import and export data from the system. Data can be imported using CSV and an API is available that allows for export using JSON. Developers can use this data to build new services on top of the group listings, such as a map, a text-message service, or group-to-group notification system.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/crop-pdf-for-amazon-kindle"&gt;&lt;img align="left" alt="Crop PDF for Amazon Kindle" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4408.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/crop-pdf-for-amazon-kindle"&gt;Crop PDF for Amazon Kindle API&lt;/a&gt;: This API lets users crop their PDF files for maximum readability on Amazon's Kindle. Users can upload a file, crop a single page or crop an entire document. It uses RESTful calls and responses are formatted in JSON.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/cs50-harvardevents"&gt;&lt;img align="left" alt="CS50 HarvardEvents" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4300.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/cs50-harvardevents"&gt;CS50 HarvardEvents API&lt;/a&gt;: HarvardEvents is a calendar app that details events happening around the Harvard campus. The data is also available programaticaly through the RESTful HarvardEvents API in CSV, iCalendar, JSON, JSONP, PHP, RSS, or XML formats. This data can be used to integrate HarvardEvents into a developer's own applications. HarvardEvents is available for Non-Comercial use via a Creative Commons Attribution-Noncommerical 3.0 Unported license. For commercial use, contact the author.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/cs50-harvardmaps"&gt;&lt;img align="left" alt="CS50 HarvardMaps" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4301.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/cs50-harvardmaps"&gt;CS50 HarvardMaps API&lt;/a&gt;: HarvardMaps is an application that users can use to search and view maps of Harvard and building/hall data for Harvard buildings. The HarvardMaps API allows developers to get data from HarvardMaps programatically in CSV, JSON, PHP, or XML format. This data can be used to integrate HarvardMaps into a developer's own applications. HarvardMaps is available for Non-Comercial use via a Creative Commons Attribution-Noncommerical 3.0 Unported license. For commercial use, contact the author.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/dailytvtorrents"&gt;&lt;img align="left" alt="DailyTvTorrents" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4414.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/dailytvtorrents"&gt;DailyTvTorrents API&lt;/a&gt;: DailyTvTorrents indexes TV show torrents from the top sites on the web. With the DailyTvTorrents API users can integrate site information into their search engine, site, blog or app. The API also has commands for command-line users to use with curl. Functionality includes getting info about a show, getting episodes of a show including the latest episode, getting info about a torrent and more. It uses RESTful calls and responses are formatted in JSON.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/earth-observing-system"&gt;&lt;img align="left" alt="Earth Observing System" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4393.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/earth-observing-system"&gt;Earth Observing System API&lt;/a&gt;: ECHO is the data clearinghouse for the Earth Observing System (EOS), a service provided by NASA's Earth Science Data Information Systems (ESDIS) program. ECHO provides common mechanisms for provider communities to publish their data and service offerings and other mechanisms for consumers to discover, understand, and access those resources.&lt;/p&gt;
&lt;p&gt;The API uses the SOAP and REST protocols and returns responses in XML.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/emailloop"&gt;&lt;img align="left" alt="Emailloop" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4390.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/emailloop"&gt;Emailloop API&lt;/a&gt;: The Emailloop API lets users connect and sync their own databases and applications with their EmailLoop account. Push content and subscribers to EmailLoop or pull campaign reports and updated subscriber lists from EmailLoop. Full documentation is not publicly available.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/erply-inventory"&gt;&lt;img align="left" alt="Erply Inventory" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4351.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/erply-inventory"&gt;Erply Inventory API&lt;/a&gt;: Erply is a service that offers software as service for retail inventory and e-commerce sites. Erply offers services such as inventory management, point of sale (POS), and sales.&lt;/p&gt;
&lt;p&gt;The Erply Inventory API allows developers to access Erply's Inventory functionality and data. Some example API methods include accessing product information, customer information, editing customer information, and sales information. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/exchangery-trading"&gt;&lt;img align="left" alt="Exchangery Trading" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4375.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/exchangery-trading"&gt;Exchangery Trading API&lt;/a&gt;: The Exchangery is a commodities trading resource. The Exchangery offers users resources for commodity trading, such as technology, infrastructure, regulatory and clearing relationships, and online platforms so exchanges and commodities have a personalized online presence.&lt;/p&gt;
&lt;p&gt;The Exchangery API allows developers to access the functionality and data within the Exchangery. Some example API methods include adding and editing information on trades, products, accounts, and screens.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/fanbridge"&gt;&lt;img align="left" alt="FanBridge" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4382.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/fanbridge"&gt;FanBridge API&lt;/a&gt;: FanBridge is a customer engagement and reward service. Clients of FanBridge can use their tools to interact with their customers and fans, reward them for being customers and fans, and make new customers and fans.&lt;/p&gt;
&lt;p&gt;The FanBridge API allows developers to access the functionality of FanBridge. Some example API methods include creating and sending email campaigns to customers and enabling new customers and fans to join the marketing list.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/fluidinfo"&gt;&lt;img align="left" alt="Fluidinfo" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4383.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/fluidinfo"&gt;Fluidinfo API&lt;/a&gt;: Fluidinfo is an online information storage and search platform for content publishers. Fluidinfo provides openly writable metadata on all types of items, and also allows data and metadata about web content to be social and searchable. Content owners can publish their content with Fluidinfo, adding metadata and sharing content with others.&lt;/p&gt;
&lt;p&gt;The Fluidinfo API allows developers to access the functionality and data of Fluidinfo to build other applications and integrate Fluidinfo into other applications. Some example API methods include searching and retrieving objects, users, and tags and other data included in Fluidinfo. The API uses RESTful calls and responses are formatted in JSON.
&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/foodspotting"&gt;&lt;img align="left" alt="Foodspotting" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4190.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/foodspotting"&gt;Foodspotting API&lt;/a&gt;: Foodspotting is a visual food review and sharing site and application. Unlike other food review sites, Foodspotting lets users review dishes, instead of the restaurant. Along with the review, users can upload a photo of the dish, so other users can see what the dish looks like. Within the site and application, users can search by dish, restaurant, or location.&lt;/p&gt;
&lt;p&gt;The Foodspotting API allows developers to access and integrate information and images from Foodspotting. Some example API methods include retrieving and uploading images, searching for and retrieving user information, dishes, places, and reviews, and adding reviews and other information. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/framey"&gt;&lt;img align="left" alt="Framey" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4410.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/framey"&gt;Framey API&lt;/a&gt;: Framey is a JavaScript application that lets users record video on any website. With Framey, users can embed a webcam recorder into their sites. Users can integrate Framey by embedding the recorder, then use a rubygem or provided code snippets to accept updates from the Framey server when new videos are ready. Responses are formatted in JSON.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/google-plus"&gt;&lt;img align="left" alt="Google Plus" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4413.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/google-plus"&gt;Google Plus API&lt;/a&gt;: Google Plus is a service to share links, photos and other content. The Google Plus API allows developers to access publicly-available Google Plus content, including user information and publicly shared items.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/how-do-you-pronounce-and-use"&gt;&lt;img align="left" alt="How do you pronounce and use...?" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4377.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/how-do-you-pronounce-and-use"&gt;How do you pronounce and use…? API&lt;/a&gt;: A multimedia pronunciation dictionary and English word usage API. Search for a word and not only get an audio pronunciation but also tagged and time-stamped videos of real people in real situations speaking and using the word in context.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/ketchup"&gt;&lt;img align="left" alt="Ketchup" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4391.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/ketchup"&gt;Ketchup API&lt;/a&gt;: Ketchup is a web application for scheduling, planning and taking notes at meetings. The Ketchup API allows users to integrate the service with their own applications. The API exposes functionality that lets users list, show, update and delete meetings, projects, agenda items and notes. It uses RESTful calls and responses are formatted in JSON.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/letsgiftit"&gt;&lt;img align="left" alt="LetsGiftIt" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4372.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/letsgiftit"&gt;LetsGiftIt API&lt;/a&gt;: LetsGiftIt is a service for group gifting. It allows eCommerce and other product and service providers to offer group gifting as an option to buy the goods or services. Users can use LetsGiftIt to buy a gift for someone socially, with other people.&lt;/p&gt;
&lt;p&gt;The LetsGiftIt API allows developers to integrate LetsGiftIt functionality into other websites and eCommerce platforms. The main method of the API is creating and adding gifts, listing a title and description of the gift, and other details about the gift.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/memonic"&gt;&lt;img align="left" alt="Memonic" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4358.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/memonic"&gt;Memonic API&lt;/a&gt;: Memonic is an application that allows users to capture, organize, and share web content. Memonic offers services for personal use, business use, publisher use, and can be used with Evernote. &lt;/p&gt;
&lt;p&gt;The Memonic API allows developers to access the functionality and data from Memonic. The API is free for non-commercial use and can be used for commercial use with their approval. Some example API methods include accessing users, sets of users, and groups of users.  &lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/memory-reel"&gt;&lt;img align="left" alt="Memory Reel" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4376.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/memory-reel"&gt;Memory Reel API&lt;/a&gt;: Memory Reel is an event marketing service. Memory Reel offers clients tools such as event mobile applications, online tools to connect with event attendees, and analytics to measure marketing effectiveness.&lt;/p&gt;
&lt;p&gt;The Memory Reel API allows developers to access and integrate Memory Reel functionality and data. Some example API methods include adding and editing events and event information, adding and editing users and their avatars, and listing devices that are available for push notifications.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/mobile-roadie"&gt;&lt;img align="left" alt="Mobile Roadie" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4381.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/mobile-roadie"&gt;Mobile Roadie API&lt;/a&gt;: Mobile Roadie is a service for musicians to create and manage mobile applications to engage with their fans. Features included with Mobile Roadie include selling tickets to shows, selling music, adding music, and interacting with fans.&lt;/p&gt;
&lt;p&gt;The Mobile Roadie API allows developers to access and integrate the functionality and data from Mobile Roadie into other applications such as MySpace. Some example API methods include creating content, adding content, editing content, retrieving comments, and managing users information.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/mobli"&gt;&lt;img align="left" alt="Mobli" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4371.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/mobli"&gt;Mobli API&lt;/a&gt;: Mobli is a real-time visual media platform social networking service. Through channels, such as people channels, subject channels, event channels, and place channels, users can upload and share media such as photos and videos in real-time. &lt;/p&gt;
&lt;p&gt;The Mobli API allows developers to access the data and functionality of Mobli. Public documentation is not available, but interested developers can sign up to request access.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/mogreet"&gt;&lt;img align="left" alt="Mogreet" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4380.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/mogreet"&gt;Mogreet API&lt;/a&gt;: Mogreet is a mobile marketing service. Mogreet clients can create, manage, and track their mobile marketing campaigns through Mogreet's platform and customer relationship manager (CRM).&lt;/p&gt;
&lt;p&gt;The Mogreet API allows developers to access the functionality and service of Mogreet. Some example API methods include sending blasts to lists, managing content, and add and delete users from their mobile marketing lists.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/nasdaq-data-on-demand"&gt;&lt;img align="left" alt="NASDAQ Data-On-Demand" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4411.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/nasdaq-data-on-demand"&gt;NASDAQ Data-On-Demand API&lt;/a&gt;: NASDAQ Data-On-Demand provides historical stock quote data. NASDAQ Data-On-Demand enables users to choose specific symbols and trading time periods for quick and efficient analysis. The data can be used to integrate stock quote data into a developer's application, analyze trends in stock quote data, back test trading strategies and algorithms and build a stock quote book.&lt;/p&gt;
&lt;p&gt;An API is provided to pull the data using RESTful or SOAP calls. The API includes calls that let users select historical stock data from the exact trading dates and times, download stock data after the markets close for pre-market analysis and request bulk data downloads. Responses are formatted in XML.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/numote-live"&gt;&lt;img align="left" alt="Numote Live" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4373.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/numote-live"&gt;Numote Live API&lt;/a&gt;: Numote Live is a platform that allows users to watch TV shows and videos with interactive features. Companies can use the platform to build communities, reward viewers, manage content, and track usage and viewing analytics.&lt;/p&gt;
&lt;p&gt;The Numote API allows developers to access and integrate Numote's functionality and data. Public documentation is not available without signing up first. Interested developers or companies should contact support@numnote.com for more information.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/ourshelf"&gt;&lt;img align="left" alt="OurShelf" border="0" class="imgLeft" hspace="4" src="http://www.programmableweb.com/images/apis/at4374.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/ourshelf"&gt;OurShelf API&lt;/a&gt;: OurShelf is a cataloging site that allows users to list and keep track of their belongings, connect with friends and other users, and sell items that they are no longer using. Users can share information on their belongings, find other people's belongings, and interact with other people.&lt;/p&gt;
&lt;p&gt;The OurShelf API allows developers to extend OurShelf into other applications or create new applications based on OurShelf's functionality. The service is in beta and public documentation is not available, but</content:encoded>
<postrank:feed_hash>b367cd57a0a8b2fd5fe28a467bc8dcdd</postrank:feed_hash>
<postrank:postrank>9.1</postrank:postrank>
<postrank:postrank_color>#ff7220</postrank:postrank_color>
<postrank:id>e231ec86c14de2576aa9fbe7b78b13dc</postrank:id>
</item>
<item>
<title>PayPal and eBay Merge for X.Commerce Innovate Conference</title>
<link>http://blog.programmableweb.com/2011/09/14/paypal-and-ebay-merge-for-xcommerce-innovate-conference</link>
<description>X.Commerce is the new brand for the developer commerce tools that include the eBay API and PayPal API. The first conference under this new brand is coming in October to San Francisco. As a media partner, we have a promo code, as well as a little more information about how the company is looking to create a sum greater than its parts with the X.Commerce platform. The conference takes place on October 12-13 in San Franscisco. Speakers include eBay CEO ...</description>
<guid>http://blog.programmableweb.com/2011/09/14/paypal-and-ebay-merge-for-xcommerce-innovate-conference</guid>
<pubDate>Wed, 14 Sep 2011 10:33:00 GMT</pubDate>
<content:encoded>&lt;p&gt;&lt;a href="http://www.programmableweb.com/api/paypal"&gt;&lt;img alt="PayPal" class="imgRight" src="http://www.programmableweb.com/images/apis/at8.png" /&gt;&lt;/a&gt;&lt;a href="http://www.programmableweb.com/api/ebay"&gt;&lt;img alt="eBay" class="imgRight" src="http://www.programmableweb.com/images/apis/at18.png" /&gt;&lt;/a&gt;&lt;a href="http://www.x.com/"&gt;X.Commerce&lt;/a&gt; is the new brand for the developer commerce tools that include the &lt;a href="http://www.programmableweb.com/api/ebay"&gt;eBay API&lt;/a&gt; and &lt;a href="http://www.programmableweb.com/api/paypal"&gt;PayPal API&lt;/a&gt;. The first conference under this new brand is coming in October to San Francisco. As a media partner, we have a promo code, as well as a little more information about how the company is looking to create a sum greater than its parts with the X.Commerce platform.&lt;/p&gt;
&lt;p&gt;&lt;img alt="" class="aligncenter size-full wp-image-22853" height="139" src="http://blog.programmableweb.com/wp-content/xcomm.jpg" title="xcomm" width="422" /&gt;&lt;/p&gt;
&lt;p&gt;The conference takes place on October 12-13 in San  Franscisco. Speakers include eBay CEO John Donahoe; Blake Mycoskie, founder of TOMS Shoes, the company that donates a pair of  shoes for each one that you buy; Katie Burke Mitic, Technology Executive  at Facebook, and many more.  After the days of presentations and  strategy discussion you can take part in X DevCamp on Friday the 14th.   It will give you a chance to work with seasoned veterans who will guide  you through PayPal, eBay, Magento, and X.Commerce implementations. ProgrammableWeb readers will save &lt;a href="https://www.innovateregistration.com/main.aspx"&gt;$100 off the registration fee&lt;/a&gt; using promo code “INN2011PW.”&lt;/p&gt;
&lt;p&gt;X.Commerce  is a platform that combines eBay and PayPal APIs with breadth and depth. PayPal API has options to allow your customers an express checkout option or to schedule recurring payments.  EBay opens up just  about all its site features to developers, whether its listing,  buying or searching for items. Filling out the trio of the X.Commerce platform is &lt;a href="http://www.magentocommerce.com/"&gt;Magento&lt;/a&gt;, a company which provides a range of solutions from small DIY website design and hosting tools to full-fledged enterprise  level e-commerce consultancy services.&lt;/p&gt;
&lt;p&gt;The web is still a wide open field for small businesses and X.Commerce is helping them connect to customers online. Even if you aren't selling products yourself, developers can benefit by using the APIs to help those small businesses integrate with eBay, PayPal and Magento.&lt;/p&gt;
&lt;br /&gt;&lt;p align="center" style="border-top:1px solid black;"&gt;Sponsored by&lt;/p&gt;&lt;p align="center"&gt;&lt;a href="http://www.programmableweb.com/adserver/www/delivery/ck.php?oaparams=2__bannerid=329__zoneid=33__cb=cdc55efd5c__oadest=http%3A%2F%2Fwww.domaintools.com%2Fapi%2F%3Futm_source%3DProgrammableWeb%26utm_medium%3Dbanner%26utm_content%3DOrange_WebsitestoLife%26utm_campaign%3DProgWeb_468x60_RSS" target="_top"&gt;&lt;img alt="" border="0" height="60" src="http://www.programmableweb.com/adserver/www/images/7c41bf7798fd406cb5115401786de535.gif" title="" width="468" /&gt;&lt;/a&gt;&lt;div id="beacon_cdc55efd5c"&gt;&lt;img alt="" height="0" src="http://www.programmableweb.com/adserver/www/delivery/lg.php?bannerid=329&amp;amp;campaignid=171&amp;amp;zoneid=33&amp;amp;cb=cdc55efd5c" style="width: 0px; height: 0px;" width="0" /&gt;&lt;/div&gt;&lt;/p&gt;&lt;div&gt;&lt;h5&gt;Related ProgrammableWeb Resources&lt;/h5&gt;&lt;p&gt;&lt;img alt="PayPal" src="http://www.google.com/s2/favicons?domain=paypal.com" /&gt; &lt;a href="http://www.programmableweb.com/api/paypal"&gt;PayPal API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/paypal/mashups"&gt;30 mashups&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="eBay" src="http://www.google.com/s2/favicons?domain=ebay.com" /&gt; &lt;a href="http://www.programmableweb.com/api/ebay"&gt;eBay API Profile&lt;/a&gt;, &lt;a href="http://www.programmableweb.com/api/ebay/mashups"&gt;213 mashups&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ProgrammableWeb?a=kq1MNprz-7E:W_ApN6of1Ms:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/ProgrammableWeb?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ProgrammableWeb?a=kq1MNprz-7E:W_ApN6of1Ms:7Q72WNTAKBA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/ProgrammableWeb?d=7Q72WNTAKBA" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/ProgrammableWeb/~4/kq1MNprz-7E" width="1" /&gt;</content:encoded>
<postrank:feed_hash>b367cd57a0a8b2fd5fe28a467bc8dcdd</postrank:feed_hash>
<postrank:postrank>8.0</postrank:postrank>
<postrank:postrank_color>#ff832e</postrank:postrank_color>
<postrank:id>a8863100656262af832ad24a7a13940b</postrank:id>
</item>
<item>
<title>Thinking Like a Web Designer</title>
<link>http://android-developers.blogspot.com/2011/09/thinking-like-web-designer.html</link>
<description>[This post is by Roman Nurik, who is passionate about icons, with input from me and a bunch of the Framework engineers. —Tim Bray]The number of people working on mobile apps, and specifically Android, is growing fast. Since modern mobile software-development is a relatively new profession, the community is growing by sucking in experts from related domains, one being web design and development.It turns out that familiarity with web UI development, particularly using modern HTML5 techniques, can be a great ...</description>
<guid>http://android-developers.blogspot.com/2011/09/thinking-like-web-designer.html</guid>
<pubDate>Tue, 13 Sep 2011 10:30:00 GMT</pubDate>
<content:encoded>&lt;a href="http://1.bp.blogspot.com/_GTM_W5mVPTU/TMB-JMl-xsI/AAAAAAAAANM/kWr3jmU5aO0/s1600/Roman.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5530559038875420354" src="http://1.bp.blogspot.com/_GTM_W5mVPTU/TMB-JMl-xsI/AAAAAAAAANM/kWr3jmU5aO0/s320/Roman.jpg" style="border: 5px solid #ddd;  float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 320px; height: 305px;" /&gt;&lt;/a&gt;&lt;p&gt;&lt;i&gt;[This post is by &lt;a href="http://twitter.com/romannurik"&gt;Roman Nurik&lt;/a&gt;, who is passionate about icons, with input from me and a bunch of the Framework engineers. —Tim Bray]&lt;/i&gt;&lt;/p&gt;&lt;p&gt;The number of people working on mobile apps, and specifically Android, is growing fast. Since modern mobile software-development is a relatively new profession, the community is growing by sucking in experts from related domains, one being web design and development.&lt;/p&gt;&lt;p&gt;It turns out that familiarity with web UI development, particularly using modern HTML5 techniques, can be a great primer for Android UI development. The Android framework and SDK have many analogues to tools and techniques in the Web repertoire of HTML, CSS, and JavaScript.&lt;/p&gt;&lt;p&gt;In this blog post, we’ll walk through a few web development features and look for matches in the world of Android UI development.&lt;/p&gt;&lt;h3&gt;Device resolutions and physical sizes&lt;/h3&gt;&lt;p&gt;One of the most important aspects of both Android UI design and web design is support for multiple screen resolutions and physical sizes. Just as your web app needs to work on any physical display and inside any size browser window, your native app needs to run on a variety of form factors, ranging from 2.5” phones to 10” tablets to (possibly) 50” TVs.&lt;/p&gt;&lt;p&gt;Let’s look at some ways in which CSS and Android allow for flexible and adaptive layouts.&lt;/p&gt;&lt;h4&gt;Providing custom layouts for different resolutions&lt;/h4&gt;&lt;p&gt;&lt;a href="http://www.w3.org/TR/css3-mediaqueries/"&gt;CSS3 media queries&lt;/a&gt; allow developers to include additional stylesheets to target different viewport and screen configurations. For example, developers can provide additional style rules or override existing styles for mobile devices. Although the markup (layout hierarchy) remains the same, CSS3 has several sophisticated techniques for completely transforming the placement of elements with different stylesheets.&lt;/p&gt;&lt;p&gt;Android has long offered a similar mechanism in resource directory qualifiers. This extends to many different types of resources (layouts, images or ‘drawables’, styles, dimensions, etc). Thus you can customize the view hierarchy as well as styling depending on device form factor, A base set of layouts for handsets can be extended for tablets by placing additional layouts in &lt;code&gt;res/layout-xlarge&lt;/code&gt; or &lt;code&gt;res/layout-sw600dp&lt;/code&gt; (smallest width 600 density-independent pixels) directories. Note that the &lt;a href="http://android-developers.blogspot.com/2011/07/new-tools-for-managing-screen-sizes.html"&gt;latter syntax&lt;/a&gt; requires Android 3.2 or later.&lt;/p&gt;&lt;p&gt;Below is a CSS3 example of how one could hide a ‘left pane’ on smaller devices and show it on screens at least 600 pixels wide:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;#leftPane {
  display: none;
}

@media screen and (min-device-width:600px) {
  #leftPane {
    display: block;
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The same could be accomplished on Android using multiple layout directories:&lt;/p&gt;&lt;p&gt;&lt;i&gt;res/layout/foo.xml&lt;/i&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;framelayout&gt;
  &lt;!-- a single pane --&gt;
  &lt;view android:id="main_pane"&gt;
&lt;/framelayout&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;i&gt;res/layout-sw600dp/foo.xml&lt;/i&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;linearlayout android:orientation="horizontal"&gt;
  &lt;!-- two panes --&gt;
  &lt;view android:id="left_pane"&gt;
  &lt;view android:id="main_pane"&gt;
&lt;/linearlayout&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As a side note, if you plan on creating multi-pane layouts, consider using &lt;a href="http://developer.android.com/guide/topics/fundamentals/fragments.html"&gt;fragments&lt;/a&gt;, which help break up your screens into modular chunks of both layout and code.&lt;/p&gt;&lt;p&gt;There are also other neat ways of using resource directory qualifiers. For example, you could create &lt;code&gt;values/dimens.xml&lt;/code&gt; and &lt;code&gt;values-sw600dp/dimens.xml&lt;/code&gt; files specifying different font sizes for body text, and reference those values in your layouts by setting &lt;code&gt;android:textSize="@dimen/my_body_text_size"&lt;/code&gt;. The same could be done for margins, line spacing, or other dimensions to help manage whitespace on larger devices.&lt;/p&gt;&lt;h4&gt;‘Holy grail’ layouts&lt;/h4&gt;&lt;p&gt;Web developers have long dreamt of an easy way to build a &lt;a href="http://www.alistapart.com/articles/holygrail/"&gt;‘holy grail’&lt;/a&gt; 5-pane layout (header/footer + 3 vertical columns). There are a variety of pre-CSS3 tricks including &lt;code&gt;position:fixed&lt;/code&gt;, &lt;code&gt;float:left&lt;/code&gt;, negative margins, and so on, to build such layouts but CSS3 introduced the &lt;a href="http://www.w3.org/TR/css3-flexbox/"&gt;flexible box&lt;/a&gt; module, which simplifies this tremendously.&lt;/p&gt;&lt;a href="http://2.bp.blogspot.com/-dPXRqF4HobE/Tm9-a269N4I/AAAAAAAAAqM/lm8autOD2FU/s1600/webhead-HolyGrail.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5651875057257756546" src="http://2.bp.blogspot.com/-dPXRqF4HobE/Tm9-a269N4I/AAAAAAAAAqM/lm8autOD2FU/s400/webhead-HolyGrail.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 327px;" /&gt;&lt;/a&gt;&lt;p style="text-align:center"&gt;Figure: An archetypal “holy grail” layout&lt;/p&gt;&lt;p&gt;It turns out that grail is pretty holy for Android tablet apps, too, and in particular for tablets held sideways in landscape mode.  A good approach involves the use of LinearLayout, one of the simplest and most popular of the Android layouts.&lt;/p&gt;&lt;p&gt;LinearLayout has this neat way to stretch its children to fit the remaining space, or to distribute available space to certain children, using the &lt;code&gt;android:layout_weight&lt;/code&gt; attribute. If a LinearLayout has two children with a fixed size, and another child with a nonzero &lt;code&gt;layout_weight&lt;/code&gt;, that other child view will stretch to fill the remaining available space. For more on layout_weight and other ways to make layouts more efficient (like switching from nested LinearLayouts to RelativeLayout), check out &lt;a href="http://developer.android.com/resources/articles/layout-tricks-efficiency.html"&gt;Layout Tricks: Creating Efficient Layouts&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Let’s take a look at some example code for implementing such a ‘holy grail’ layout on Android and on the web:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;linearlayout android:id="@+id/container" android:layout_height="match_parent" android:layout_width="match_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android"&gt;

    &lt;!-- top pane --&gt;
    &lt;view android:id="@+id/top_pane" android:layout_height="50dp" android:layout_width="match_parent"&gt;

    &lt;linearlayout android:id="@+id/middle_container" android:layout_height="0dp" android:layout_weight="1" android:layout_width="match_parent" android:orientation="horizontal"&gt;

        &lt;!-- left pane --&gt;
        &lt;view android:layout_height="match_parent" android:layout_width="300dp" id="@+id/left_pane"&gt;

        &lt;!-- center pane --&gt;
        &lt;view android:layout_height="match_parent" android:layout_weight="1" android:layout_width="0dp" id="@+id/center_pane"&gt;

        &lt;!-- right pane --&gt;
        &lt;view android:layout_height="match_parent" android:layout_width="300dp" id="@+id/right_pane"&gt;

    &lt;/linearlayout&gt;

    &lt;!-- bottom pane --&gt;
    &lt;view android:id="@+id/bottom_pane" android:layout_height="50dp" android:layout_width="match_parent"&gt;

&lt;/linearlayout&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;b&gt;Note:&lt;/b&gt; Android tablet apps in landscape will generally show an &lt;a href="http://developer.android.com/guide/topics/ui/actionbar.html"&gt;action bar&lt;/a&gt; as the top pane and will usually have neither a right nor bottom pane. Also note that the action bar layout is automatically provided by the framework as of Android 3.0, and thus you don’t need to worry about positioning it.&lt;/p&gt;&lt;p&gt;And here’s an example implementation using the CSS3 flexible box model; notice the similarities:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;style&gt;
  html, body { margin: 0; height: 100%; }

  #container {
    height: 100%;
    display: -webkit-box; /* like LinearLayout */
    display:    -moz-box;
    -webkit-box-orient: vertical; /* like android:orientation */
       -moz-box-orient: vertical;
  }

  #top, #bottom { height: 50px; }

  #middle {
    -webkit-box-flex: 1; /* like android:layout_weight */
       -moz-box-flex: 1;
    display: -webkit-box;
    -webkit-box-orient: horizontal;
       -moz-box-orient: horizontal;
  }

  #left, #right { width: 300px; }

  #center {
    -webkit-box-flex: 1;
       -moz-box-flex: 1;
  }
&lt;/style&gt;

&lt;div id="container"&gt;
  &lt;div id="top"&gt;&lt;/div&gt;
  &lt;div id="middle"&gt;
    &lt;div id="left"&gt;&lt;/div&gt;
    &lt;div id="center"&gt;&lt;/div&gt;
    &lt;div id="right"&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div id="bottom"&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Layered content&lt;/h4&gt;&lt;p&gt;In CSS, with &lt;code&gt;position:absolute&lt;/code&gt;, you can overlay your UI elements. On Android, you can use FrameLayout to achieve this. The child views in a frame layout are laid out on top of each other, with optional &lt;code&gt;layout_gravity&lt;/code&gt; attributes indicating alignment with the parent frame layout.&lt;/p&gt;&lt;p&gt;Below is a contrived example of a FrameLayout with three children.&lt;/p&gt;&lt;a href="http://4.bp.blogspot.com/-swOQH-PxIuo/Tm9-rnioTfI/AAAAAAAAAqU/1aqDlSyjkQw/s1600/webhead-Frame1.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5651875345186967026" src="http://4.bp.blogspot.com/-swOQH-PxIuo/Tm9-rnioTfI/AAAAAAAAAqU/1aqDlSyjkQw/s400/webhead-Frame1.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 322px;" /&gt;&lt;/a&gt;&lt;p style="text-align:center"&gt;Figure: Example FrameLayout with three children (2 with top-left and 1 bottom-right alignment)&lt;/p&gt;&lt;a href="http://1.bp.blogspot.com/-rhw8-whtMKY/Tm9-9OM3ayI/AAAAAAAAAqc/8Efa6J7zs7Q/s1600/webhead-Frame2.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5651875647622441762" src="http://1.bp.blogspot.com/-rhw8-whtMKY/Tm9-9OM3ayI/AAAAAAAAAqc/8Efa6J7zs7Q/s400/webhead-Frame2.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 210px;" /&gt;&lt;/a&gt;&lt;p style="text-align:center"&gt;Figure: Isometric view of the example FrameLayout and its children.&lt;/p&gt;&lt;p&gt;The code for this example is as follows:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;framelayout android:layout_height="200dp" android:layout_width="300dp" xmlns:android="http://schemas.android.com/apk/res/android"&gt;

    &lt;!-- bottom-most child, with bottom-right alignment --&gt;
    &lt;view android:layout_gravity="bottom|right" android:layout_height="150dp" android:layout_width="100dp"&gt;

    &lt;!-- middle child, with top-left alignment --&gt;
    &lt;view android:layout_gravity="top|left" android:layout_height="175dp" android:layout_width="200dp"&gt;

    &lt;!-- top-most child, with top-left alignment →
    &lt;!-- also stretched to fill vertically --&gt;
    &lt;view android:layout_gravity="top|left" android:layout_height="match_parent" android:layout_width="100dp"&gt;

&lt;/framelayout&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Scrollable content&lt;/h4&gt;&lt;p&gt;HTML, by default, flows in reading order and scrolls vertically.   When content extends beyond the bottom of the browser, scrollbars automatically appear. Content panes can also be made individually scrollable using overflow:scroll or overflow:auto. &lt;/p&gt;&lt;p&gt;Android screen content isn’t scrollable by default.  However, many content Views such as ListView and EditText offer scrolling, and any layout can be made scrollable by wrapping it in a ScrollView or HorizontalScrollView.&lt;/p&gt;&lt;p&gt;It’s also possible to add custom scrolling to views by using methods like &lt;a href="http://developer.android.com/reference/android/view/View.html#scrollTo(int,%20int)"&gt;View.scrollTo&lt;/a&gt; and helpers like &lt;a href="http://developer.android.com/reference/android/widget/Scroller.html"&gt;Scroller&lt;/a&gt; in response to touch events. And for horizontal, snap-to-page-bounds scrolling, one can use the excellent &lt;a href="http://android-developers.blogspot.com/2011/08/horizontal-view-swiping-with-viewpager.html"&gt;new ViewPager class&lt;/a&gt; in the support library.&lt;/p&gt;&lt;p&gt;Below is an example of a ScrollView containing a single TextView child and the code needed to implement something like this.&lt;/p&gt;&lt;a href="http://2.bp.blogspot.com/-OHAF5PuAScQ/Tm9_HyGl97I/AAAAAAAAAqk/IDWo6QXjg6A/s1600/webhead-Scroll.png" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5651875829058500530" src="http://2.bp.blogspot.com/-OHAF5PuAScQ/Tm9_HyGl97I/AAAAAAAAAqk/IDWo6QXjg6A/s400/webhead-Scroll.png" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 395px;" /&gt;&lt;/a&gt;&lt;p style="text-align:center"&gt;Figure: A TextView inside a ScrollView, scrolled about half way.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;
&lt;scrollview android:layout_height="match_parent" android:layout_width="match_parent" xmlns:android="http://schemas.android.com/apk/res/android"&gt;

    &lt;!-- the scrollable content --&gt;
    &lt;textview android:layout_gravity="bottom|right" android:layout_height="wrap_content" android:layout_width="match_parent" android:padding="32dp" android:text="The\nquick\nbrown\nfox\njumps\nover..." android:textsize="48sp"&gt;

&lt;/scrollview&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4&gt;Custom layouts&lt;/h4&gt;&lt;p&gt;Sometimes the positioning and layout behaviors you can achieve with CSS aren’t enough to achieve your desired layout. In those cases, developers fall back on JavaScript coupled with absolute positioning to place and size elements as needed.&lt;/p&gt;&lt;p&gt;Programmatically defined layouts are also possible on Android. In fact, they’re sometimes the most elegant and/or performant way of implementing a unique or otherwise tricky layout. Not happy with nesting LinearLayouts for implementing a 2x3 grid of navigation icons? Just extend ViewGroup and implement your own layout logic! (see an example DashboardLayout &lt;a href="http://code.google.com/p/iosched/source/browse/android/src/com/google/android/apps/iosched/ui/widget/DashboardLayout.java"&gt;here&lt;/a&gt;). All the built-in layouts such as LinearLayout, FrameLayout, and RelativeLayout are implemented this way, so there generally aren’t the same performance implications with custom layouts as there are with scripted layout on the web.&lt;/p&gt;&lt;h3&gt;Device densities&lt;/h3&gt;&lt;p&gt;Web designers have long dealt with the reality that display densities vary, and that there wasn’t much they could do about it. This meant that for a long time web page graphics and UI elements had different physical sizes across different displays. Your 100px wide logo could be 1” wide on a desktop monitor or ¾” on a netbook. This was mostly OK, given that (a) pointing devices such as mice offered generally good precision in interacting with such elements and (b) browsers allowed visually-impaired users to zoom pages arbitrarily.&lt;/p&gt;&lt;p&gt;However, on touch-enabled mobile devices, designers really need to begin thinking about physical screen size, rather than resolution in pixels. A 100px wide button on a 120dpi (low density) device is ~0.9” wide while on a 320dpi (extra-high density) screen it’s only ~0.3” wide. You need to avoid the fat-finger problem, where a crowded space of small touch targets coupled with an imprecise pointing tool (your finger) leads to accidental touches. The Android framework tries really hard to take your layout and scale elements up or down as necessary to work around device-density differences and get a usable result on a wide range of them.  This includes the browser, which scales a 160px &lt;code&gt;&lt;img /&gt;&lt;/code&gt; at 100% browser zoom up to 240px on a 240dpi screen, such that its physical width is always 1”.&lt;/p&gt;&lt;p&gt;Developers can achieve finer-grained control over this browser scaling by providing custom stylesheets and images for different densities, using CSS3 media query filters such as &lt;code&gt;-webkit-max-device-pixel-ratio&lt;/code&gt; and &lt;code&gt;&lt;meta /&gt;&lt;/code&gt; viewport arguments such as &lt;code&gt;target-densitydpi=device-dpi&lt;/code&gt;. For an in-depth discussion on how to tame this mobile browser behavior see this blog post: &lt;a href="http://designbycode.tumblr.com/post/1127120282/pixel-perfect-android-web-ui"&gt;Pixel-perfect Android web UIs&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;For native Android apps, developers can use resource directory qualifiers to provide different images per density (such as drawable-hdpi and drawable-mdpi). In addition, Android offers a special dimension unit called ‘density independent pixels’ (dp) which can (and should!) be used in layout definitions to offset the density factors and create UI elements that have consistent physical sizes across screens with different densities. &lt;/p&gt;&lt;h3&gt;Features you don’t have out of the box&lt;/h3&gt;&lt;p&gt;There are a few features that web designers and developers rely on that aren’t currently available in the Android UI toolkit.&lt;/p&gt;&lt;p&gt;Developers can defer to user-driven browser zooming and two-dimensional panning for content that is too small or too large for its viewport, respectively. Android doesn’t currently provide an out-of-the-box mechanism for two-dimensional layout zooming and panning, but with some extra legwork using existing APIs, these interactions are possible. However, zooming and panning an entire UI is not a good experience on mobile, and is generally more appropriate for individual content views such as lists, photos, and maps.&lt;/p&gt;&lt;p&gt;Additionally, vector graphics (generally implemented with SVG) are gaining in popularity on the Web for a number of reasons: the need for resolution independence, accessibility and ‘indexability’ for text-heavy graphics, tooling for programmatic graphic generation, etc. Although you can’t currently drop an SVG into an Android app and have the framework render it for you, Android’s version of WebKit supports SVG as of Android 3.0. As an alternative, you can use the very robust &lt;a href="http://developer.android.com/reference/android/graphics/Canvas.html"&gt;Canvas&lt;/a&gt; drawing methods, similar to HTML5’s canvas APIs, to render vector graphics. There are also community projects such as &lt;a href="http://code.google.com/p/svg-android"&gt;svg-android&lt;/a&gt; that support rendering a subset of the SVG spec.&lt;/p&gt;&lt;h3&gt;Conclusion&lt;/h3&gt;&lt;p&gt;Web developers have a number of different tools for frontend layout and styling at their disposal, and there are analogues for almost all of these in the world of Android UI engineering. If you’re wondering about analogues to other web- or CSS-isms, start a conversation out there in the Android community; you&amp;rsquo;ll find you&amp;rsquo;re not alone.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img alt="" height="1" src="https://blogger.googleusercontent.com/tracker/6755709643044947179-6785431911844538016?l=android-developers.blogspot.com" width="1" /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=nshbTj41O7M:hXmE0Y3bqYI:yIl2AUoC8zA"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/blogspot/hsDu?d=yIl2AUoC8zA" /&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/blogspot/hsDu?a=nshbTj41O7M:hXmE0Y3bqYI:-BTjWOF_DHI"&gt;&lt;img border="0" src="http://feeds.feedburner.com/~ff/blogspot/hsDu?i=nshbTj41O7M:hXmE0Y3bqYI:-BTjWOF_DHI" /&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img height="1" src="http://feeds.feedburner.com/~r/blogspot/hsDu/~4/nshbTj41O7M" width="1" /&gt;</content:encoded>
<postrank:feed_hash>b367cd57a0a8b2fd5fe28a467bc8dcdd</postrank:feed_hash>
<postrank:postrank>10.0</postrank:postrank>
<postrank:postrank_color>#ff6514</postrank:postrank_color>
<postrank:id>e123fe35a4391748fed1a84824981734</postrank:id>
</item>
</channel></rss>

