Here are all your buddies running around, each with an Android phone running the same social networking client, each returning their current position based on GPS via a true peer-to-peer XMPP (or GoogleTalk) request.

GPS is the wrong solution for many kinds of consumer applications where the user wants to get at information quickly and with minimum hassle. That’s not to say LBS are unworkable, as in many situations a position based on the current Cell ID provides good enough accuracy (e.g. you are in New York, here in the weather for New York).

Google has a “secret” (and probably the best) API for converting Cell ID information to position coordinates. They are reportedly having “no plans to release it”, and even if they do I wouldn’t want to invest in a company whose product is totally reliant on the good will of Google.

The desire to do better than Cell ID drove me to invent the Snowball platform, but that’s a topic for another post.

Update

Based on Google group discussions here and here, it seems that Mobeegal and Commandro (both ADC winners) were considering these issues when developing their applications.

Basically, you’re right, those problems exist and, for example, Commandro has some tricks inside it in order to correctly respond to missing signals, as well as it can be run as a background service (without UI at all) with minimal and rare GPS interaction in order to
keep saving battery.
” - Alex Pisarev

Again this turns into a critique of the challenge, i.e. entries that implement intelligent workarounds are totally transparent to the judges.

Summary of points:

Conclusion…


If you worked hard and didn’t win the ADC take heart: there are many other platforms out there just begging for your support, and maybe in a few years there will be enough Android handsets on the street to make it worthy of your attention once again.

Also, if you fancy working in the green fields of northern Germany, we’re always looking for talented developers here at OpenKnowledge.
Mark

* Measurement based on N95 tracking performance

From http://blog.zedray.com

","bodyAsHTML":"

[img_assist|nid=3462|title=|desc=|link=none|align=right|width=128|height=96]\"android.png\"At the risk of sounding like a sore loser (who wouldn’t be, after missing out on $25,000) and ignoring for a moment the shortcomings of my own application (of which I am intimately aware), I am going to discuss the limitations of the ADC itself.

As I understand it, by holding the ADC Google was trying to achieve the following:

(a) Stimulate the development of innovative applications that build upon novel Android specific capabilities (openness, interconnectivity, Google services, mapping, etc).

(b) Generate cool looking applications that can be shown to the media now, and eventually be used to help sell Android phones.

(c) Create a community of developers to test and provide feedback on the Android operating system (which is still very much a work in progress).

(d) Quantify the size of the Android development community, so the platform can’t be written off as insignificant fragmentation by the more established development platforms (i.e. Symbian, JavaME and iPhone).
I think we can all agree that the ADC succeeded in meeting and exceeding all of these goals.

However, I think many developers (some of whom are seasoned mobile industry experts themselves) had an extra goal in mind when the signed up for the challenge:

(e) Develop applications that go above and beyond what is currently possible, and make them work in the real world.

By going through the winners, I think many observers (some less impartial that others) have noticed that in many cases Google really tripped up on this last one. In my opinion, despite putting a lot of work into building an objective, fast and fair judging process - the competition contained some fundamental flaws:

Hence the ADC wasn’t about building a product that would work in the marketplace, but about appeasing the varying tastes of the evaluating judges. Some of which become quite clear when you go through the winners:

  

A word on location…

Many of the winners built applications based on *positioning* or so called Location Based Services, which is an area I know a thing or two about.

Despite years of high expectations, industry promises and optimistic articles in the media, LBS haven’t managed to take off outside of Navigation. Contrary to popular belief, this isn’t because of a lack of hardware or well written applications (everyone and their grandma owns a Nokia N95 with built in GPS these days), but because of fundamental limitations of the technology itself.

Currently the simplest and most accurate way of positioning a mobile phone is via an inbuilt GPS receiver. Assuming for the moment, that all forthcoming Android phones will support GPS (they will have to if these winners are anything to go by) then a typical first experience might look like this:

Guy - “Hey, I’ve just installed an application that will show us the weather for our exact location”

Girl - “Cool, show me

-Runs application-Application says “Searching for GPS Signal”

-Both wait for 2-3 minutes-

Application says “No GPS Signal found, are you indoors?”

Guy - “Maybe we should stand outside?

-Both standing outside, guy restarts the GPS search-

-2 minutes of “Searching for Satellites” later-

Guy - “I can’t get a good signal on this thing, maybe it’s all these buildings?

Girl - “Never mind, I think it’s just about to start raining anyway

Let’s look at another commonly used Android feature:

Here are all your buddies running around, each with an Android phone running the same social networking client, each returning their current position based on GPS via a true peer-to-peer XMPP (or GoogleTalk) request.

GPS is the wrong solution for many kinds of consumer applications where the user wants to get at information quickly and with minimum hassle. That’s not to say LBS are unworkable, as in many situations a position based on the current Cell ID provides good enough accuracy (e.g. you are in New York, here in the weather for New York).

Google has a “secret” (and probably the best) API for converting Cell ID information to position coordinates. They are reportedly having “no plans to release it”, and even if they do I wouldn’t want to invest in a company whose product is totally reliant on the good will of Google.

The desire to do better than Cell ID drove me to invent the Snowball platform, but that’s a topic for another post.

Update

Based on Google group discussions here and here, it seems that Mobeegal and Commandro (both ADC winners) were considering these issues when developing their applications.

Basically, you’re right, those problems exist and, for example, Commandro has some tricks inside it in order to correctly respond to missing signals, as well as it can be run as a background service (without UI at all) with minimal and rare GPS interaction in order to
keep saving battery.
” - Alex Pisarev

Again this turns into a critique of the challenge, i.e. entries that implement intelligent workarounds are totally transparent to the judges.

Summary of points:

Conclusion…


If you worked hard and didn’t win the ADC take heart: there are many other platforms out there just begging for your support, and maybe in a few years there will be enough Android handsets on the street to make it worthy of your attention once again.

Also, if you fancy working in the green fields of northern Germany, we’re always looking for talented developers here at OpenKnowledge.
Mark

* Measurement based on N95 tracking performance

From http://blog.zedray.com

","author":{"id":298828,"username":"whitemice","realname":null,"emailHash":"32c86be18cb54180e4223b47d4e8707d","avatar":"https://secure.gravatar.com/avatar/32c86be18cb54180e4223b47d4e8707d?d=identicon&r=PG","reputation":0},"activeRevisionId":474911,"revisionIds":[474911,474910,474909,474908],"lastActiveUserId":298828,"lastActiveDate":1213154489000,"parentId":null,"parentAuthor":null,"originalParentId":null,"childrenIds":[525197],"commentIds":[525197],"marked":true,"topics":["java","mobile","android","google"],"primaryContainerId":8,"containerIds":[7,8],"plug":"android-developer-challenge-cr","wiki":false,"score":0,"depth":0},"enableThreadedComments":true,"portal":{"topic":{"id":"1","type":"topic","creationDate":1434655010000,"creationDateFormatted":"06/18/2015 07:16 PM","name":"java","createdBy":{"id":2,"username":"matt"},"parentTopics":[],"childTopics":[],"usedCount":114485},"blurb":"Java programming news and training resources from DZone, the trusted source for learning advanced software design, web development and devops best practices.","code":"java","id":1,"creationDate":1434673716000,"creationDateFormatted":"06/19/2015 12:28 AM","displayTitle":"Java Zone: Java, JDK & JVM developer news, tutorials and tools","title":"Java","new":false,"order":8,"shortTitle":"java-jdk-development-tutorials-tools-news","color":"purple","pageTitle":"Java Developer Tutorials, Tools, News & Jobs - DZone","active":true,"modificationDate":1437510172000,"modificationDateFormatted":"07/21/2015 08:22 PM"},"contentType":"article"}],"loadedStyles":[["/lib/bootstrap/bootstrap.less","/lib/font-awesome/font-awesome.less","/lib/fontello/css/fontello.css","/lib/fontello/css/animation.css","/lib/angular-ui/select.css","/lib/ngDialog/css/ngDialog.css","/less/ngDialog-theme.less","/lib/bootstrap-switch/bootstrap-switch.css","/less/dzone20.less","/less/fonts.less","/less/directives.less","/lib/slick/slick.css","/lib/bootstrap-slider/bootstrap-slider.css","/less/layout.less","/widgets/article/content/article-content.less","/widgets/article/infoBar/widget.less","/widgets/components/slider/widget.less","/widgets/content/commentsSlider/widget.less","/widgets/header/blackBar/widget.less","/widgets/header/main/header-common.less","/widgets/header/main/widget.less","/widgets/sidebar/content/list/list.less","/widgets/sidebar/tapBar/sidebar-list.less","/widgets/sidebar/tapBar/widget.less","/widgets/users/UserHomeMiniProfile/widget.less"]],"loadedScripts":[["/lib/jquery/jquery.js","/lib/lodash/lodash.js","/lib/moment/moment.js","/scripts/utils.js","/lib/angular/angular.js","/lib/angular/angular-sanitize.js","/lib/local-storage/angular-local-storage.js","/lib/bootstrap/bootstrap.js","/lib/angular-ui/bootstrap.js","/lib/angular-ui/select.js","/lib/bootstrap-switch/bootstrap-switch.js","/lib/ngDialog/js/ngDialog.js","/lib/angular-moment/angular-moment.js","/scripts/app.js","/scripts/socket.js","/scripts/services.js","/scripts/ui-services.js","/scripts/directives.js","/scripts/filters.js","/lib/angular-touch/angular-touch.min.js","/lib/elastic/elastic.js","/lib/ng-file-upload/angular-file-upload-all.js","/lib/angular-deckgrid/angular-deckgrid.js","/scripts/dzone.js","/scripts/ads.js","/scripts/head.js","/scripts/links.js","/scripts/utilities/directives.js","/scripts/utilities/services.js","/scripts/utilities/image-editor.js","/lib/bootstrap-slider/bootstrap-slider.js","/lib/bootstrap-slider/directive.js","/lib/angular-draganddrop/draganddrop.js","/widgets/article/content/utils.js","/widgets/article/infoBar/services.js","/widgets/components/slider/service.js","/widgets/header/main/angulartics-ga.js","/widgets/header/main/angulartics.js","/widgets/header/main/resize.js","/widgets/sidebar/content/list/service.js","/widgets/sidebar/tapBar/directive.js","/widgets/sidebar/tapBar/service.js"]],"TH_CSRF":"-430709002571832925","botInfo":[{"isRenderBot":false}],"request":[{"site":{"id":7,"title":"DZone: Programming & DevOps news, tutorials & tools","keywords":"programming, software development, devops, java, agile, web, iot, database, mobile, big data, cloud","description":"Programming, Web Development, and DevOps news, tutorials and tools for beginners to experts. Hundreds of free publications, over 1M members, totally free.","name":"DZone.com"},"dev":false,"cdn":["dz2cdn1.dzone.com","dz2cdn2.dzone.com","dz2cdn3.dzone.com","dz2cdn4.dzone.com"],"theme":"dz20","context":"","user":{"id":2500002,"authenticated":false,"name":"Anonymous","realName":null,"avatar":"https://secure.gravatar.com/avatar/?d=identicon&r=PG","profile":"/users/2500002/anon-user.html"}}],"portals":[[{"topic":8,"id":2,"shortTitle":"agile-methodology-training-tools-news","color":"red","name":"Agile","code":"agile","url":"/agile-methodology-training-tools-news"},{"topic":6129,"id":3,"shortTitle":"big-data-analytics-tutorials-tools-news","color":"green","name":"Big Data","code":"big-data","url":"/big-data-analytics-tutorials-tools-news"},{"topic":30,"id":4,"shortTitle":"cloud-computing-tutorials-tools-news","color":"orange","name":"Cloud","code":"cloud","url":"/cloud-computing-tutorials-tools-news"},{"topic":59,"id":5,"shortTitle":"database-sql-nosql-tutorials-tools-news","color":"purple","name":"Database","code":"database","url":"/database-sql-nosql-tutorials-tools-news"},{"topic":31,"id":6,"shortTitle":"devops-tutorials-tools-news","color":"yellow","name":"DevOps","code":"devops","url":"/devops-tutorials-tools-news"},{"topic":1138,"id":7,"shortTitle":"enterprise-integration-training-tools-news","color":"green","name":"Integration","code":"integration","url":"/enterprise-integration-training-tools-news"},{"topic":48,"id":8,"shortTitle":"iot-developer-tutorials-tools-news-reviews","color":"orange","name":"IoT","code":"iot","url":"/iot-developer-tutorials-tools-news-reviews"},{"topic":1,"id":1,"shortTitle":"java-jdk-development-tutorials-tools-news","color":"purple","name":"Java","code":"java","url":"/java-jdk-development-tutorials-tools-news"},{"topic":29,"id":9,"shortTitle":"mobile-app-developer-tutorials-tools-news","color":"yellow","name":"Mobile","code":"mobile","url":"/mobile-app-developer-tutorials-tools-news"},{"topic":653,"id":10,"shortTitle":"apm-tools-performance-monitoring-optimization","color":"red","name":"Performance","code":"performance","url":"/apm-tools-performance-monitoring-optimization"},{"topic":35,"id":11,"shortTitle":"web-development-programming-tutorials-tools-news","color":"orange","name":"Web Dev","code":"webdev","url":"/web-development-programming-tutorials-tools-news"}]],"matchedUrl":{"name":"dzone:articles:view","mapping":"/articles/**","mappingPatterns":{}},"requiresModule":["angulartics","angulartics.google.analytics","dndLists","generalDirectives","monospaced.elastic","angularFileUpload","akoenig.deckgrid","ui.bootstrap-slider","ngSanitize","ui.select","ui.bootstrap","angularMoment","ngTouch","ngDialog","LocalStorageModule"]}; } catch(e) { console.error(e); }
4
Notification
  • Adam Van Grack started following you

  • Jessica Conaghan, Gumption Scott and 6 commented on a link you posted

    T-Mobile Unvells Cheaper, More Basic 'Simple Prepaid' Phone Plans

  • Jessica Conaghan replied on a comment you posted

    CSS counters are one of those "oh neat, didn't know CSS could do that" features with a lot of Xubuntu 14.10 Utopic Unicorn is the latest release of xubuntu based on Ubuntu 14.10

  • Jessica Conaghan started following you

See All
POWERED BY DZone TeamHub

Here are all your buddies running around, each with an Android phone running the same social networking client, each returning their current position based on GPS via a true peer-to-peer XMPP (or GoogleTalk) request.

GPS is the wrong solution for many kinds of consumer applications where the user wants to get at information quickly and with minimum hassle. That’s not to say LBS are unworkable, as in many situations a position based on the current Cell ID provides good enough accuracy (e.g. you are in New York, here in the weather for New York).

Google has a “secret” (and probably the best) API for converting Cell ID information to position coordinates. They are reportedly having “no plans to release it”, and even if they do I wouldn’t want to invest in a company whose product is totally reliant on the good will of Google.

The desire to do better than Cell ID drove me to invent the Snowball platform, but that’s a topic for another post.

Update

Based on Google group discussions here and here, it seems that Mobeegal and Commandro (both ADC winners) were considering these issues when developing their applications.

Basically, you’re right, those problems exist and, for example, Commandro has some tricks inside it in order to correctly respond to missing signals, as well as it can be run as a background service (without UI at all) with minimal and rare GPS interaction in order to
keep saving battery.
” - Alex Pisarev

Again this turns into a critique of the challenge, i.e. entries that implement intelligent workarounds are totally transparent to the judges.

Summary of points:

Conclusion…


If you worked hard and didn’t win the ADC take heart: there are many other platforms out there just begging for your support, and maybe in a few years there will be enough Android handsets on the street to make it worthy of your attention once again.

Also, if you fancy working in the green fields of northern Germany, we’re always looking for talented developers here at OpenKnowledge.
Mark

* Measurement based on N95 tracking performance

From http://blog.zedray.com

","source":null,"views":5758,"articleDate":1213154489000,"tldr":null,"originalSource":"","published":true,"nComments":0,"articleType":""}]; WMODEL_DATA.perms = {"canDecidePick":false,"canPublish":false}; WMODEL_DATA.isPreview = false; WMODEL_DATA.OPTIONS = {}; TH.installWidgetController('article.content', 'articleContent7', WMODEL_DATA, typeof controller == 'function' ? controller : null, [{name: 'partners', data: true},{name: 'DEFAULT', data: true}], ' oUhbblYOaqbcblYOaqbcC', null); })(); (function() { function controller($scope, $service, $location, SideBarService, TH$Request) { SideBarService.ctx.pageSize = $scope.pageSize; SideBarService.ctx.isPreview = $scope.isPreview; SideBarService.ctx.mode = $scope.mode; SideBarService.fn.loader = $service; SideBarService.fn.scrollCheck = function() { $scope.$emit('thIfScrollCheck'); }; var currentFilter; $scope.$on('$locationChangeSuccess', function() { if (!$location.search().filter) { $scope.filter = 'latest'; } else { $scope.filter = $location.search().filter; if ($scope.filter == 'latest') { $location.search('filter', null); } } if (currentFilter == $scope.filter) { return; } currentFilter = $scope.filter; SideBarService.ctx.filter = $scope.filter; }); $scope.display = SideBarService.getList(); $scope.$watchCollection(function() { return SideBarService.getList(); }, function (n) { $scope.display = n; }); $scope.isActive = SideBarService.isActive; $scope.isExcluded = SideBarService.isExcluded; $scope.loadMore = SideBarService.load; $scope.loading = function() { return SideBarService.ctx.loading; } } var WMODEL_DATA = {}; WMODEL_DATA.pageSize = 20; WMODEL_DATA.isPreview = false; WMODEL_DATA.OPTIONS = {}; WMODEL_DATA.mode = null; TH.installWidgetController('sidebar.content.list', 'sidebarContentList10', WMODEL_DATA, typeof controller == 'function' ? controller : null, [{name: 'DEFAULT', data: true}], ' oUhbkSMaaqbcdvVkcC', null); })(); (function() { var WMODEL_DATA = {}; WMODEL_DATA.OPTIONS = {}; TH.installWidgetController('sidebar.tapBar', 'sidebar', WMODEL_DATA, typeof controller == 'function' ? controller : null, null, ' oUhbkSMadabfWVcC oUhbkSMadabbWQbVkcC', null); })(); (function() { function controller($scope, shareThis, TH$Dialog, TH$Service) { $scope.getEditUrl = function(id, type) { if (!type || type == 'article') { return '/content/' + id + '/edit.html'; } else { return '/dzone/staff/' + type + (type == 'refcard' ? 'z' : 's') + '/' + id + '/edit.html'; } } $scope.share = function(socialNet, url, title){ shareThis.shareThis(socialNet, url, title); }; $scope.canDelete = function(article) { return article.canDelete; } $scope.edit = function(link) { TH$Dialog.open({ loadWidget: 'links.postPreview', widgetArgs: { edit: link.id }, size: 'xbig' }).then(function (result) { $scope.link.title = result.title; $scope.link.linkDescription = result.content; $scope.link.thumb = result.thumb; $scope.link.tags = result.topics; }); }; $scope.deleteLink = function(article) { var title = article.title; var type = 'link'; if(article.header){ title = (article.header.type == 'article') ? article.header.title : article.title; type = (article.header.type == 'article') ? 'article' : 'link'; } TH$Dialog.confirm('Do you want to delete "' + title + '"?').then(function() { return TH$Service.action('delete', {type: type, id: article.id}); }).then(function() { article.deleted = true; }); }; } var WMODEL_DATA = {}; WMODEL_DATA.OPTIONS = {}; TH.installWidgetController('content.commentsSlider', 'contentCommentsSlider9', WMODEL_DATA, typeof controller == 'function' ? controller : null, null, ' oUhbaqbcaibvnWffWVcC', null); })(); (function() { var WMODEL_DATA = {}; WMODEL_DATA.name = "commentsSlider"; WMODEL_DATA.slot = null; WMODEL_DATA.OPTIONS = {"name":"commentsSlider"}; TH.installWidgetController('components.slider', 'componentsSlider8', WMODEL_DATA, typeof controller == 'function' ? controller : null, null, ' oUhballbvbdSaoUhM', null); })();