SoWe SOcial Weather

114

SoWe. SOcial WEather is a geolocation app for displaying weather related tweets consisting of state severe weather reports hashtag, national weather service office, and geo tagged weather tweets. Also, the experimental NOAA streaming weather radio locations are playable. The ability to take a pic and share for completing your own social weather reporting is also available. Other relevant searchable tweets include: weather channel and anchors, atlantic and pacific hurricane hash tags, NOAA major tweet lists. Also, NOAA weather alerts for your gps or map searched locations are presented. Get real time information from tweets including storm chasers, national weather service, local news, weather channel and normal twitter users for weather events.

Hurricane Karen. Get the lastest and fastest news, pics, and video on Hurrincane Karen via SoWe.

SoWe on Google Play

SoWe on Amazon App Store

eight

eleven

five

four

nine

one

seven

six

three

two

Posted in Android, Google, Kindle Fire, MapQuest, Mobile App | Leave a comment

Test Native Android App in Browser Any Platform

Image

Besides allowing you to test drive apps before purchasing, One would think their are bigger plans for Amazon Test Drive. Basically, test drive allows you to launch and use an app listed in the amazon app store in your browser. In the screen shot above, I am using my Mac Pro and running my Android app. You can try it here, link to Amazon App Store RadarBuddy Pro. I could see Amazon re-branding the test drive platform similar to NetFlix app, which allows you watch your shows on TV, and computer, and your Android or Apple devices. The rebranded Test Drive would allow you to use any app your purchases at the amazon app store on any computer(windows, mac) or any device android or apple.

Posted in amazon, Android, Google, MapQuest, Mobile App, Uncategorized | Tagged , , , | Leave a comment

Android UI Update to Holo for Android 2.x to 4.x devices

Image

I needed to update my android application RadarBuddyPro for 2.x to 4.x android devices in the google play and amazon app stores. RadarBuddyPro on Google Play , RadarBuddyPro for Kindle Fire. To complete this task, I employed the Sherlock library for actionbar and fragments on kindle fire.. I also used this library with Mapquest for the Kindle Fire edition since kindle fire does not support Google Maps. The redesign for Google Play followed the steps outlined . Since I could not find a library which used MapQuest instead of Google Maps for the Sherlock library, I posted this question on their forum and got a response from Jake Wharton very quickly. Basically, he indicated I can just create a new Base Activity in the Sherlock library and reference that in my App. So that is what I did and it worked. I had been struggling for close to 2 months trying to implement and asking one question got me on the path in less than a day. Thanks Jake, get up the good work. So you do the same by following these steps.

  1. Download the Sherlock Library from here.
  2. Download the Mapquest jar from
    here.
  3. Open the Sherlock library project in your IDE and add the MapQuest jar to the build path.
  4. Add the class at the bottom of this blog to the Sherlock library and reference this in your android project and now you have halo, actionbar, fragments, and maps on clients who do not support google maps.

Some Screenshots of the legacy design are below. Besides of the bad layout, I had dialogs for selecting a state and radar options. With the Action Bar implementation, I was able to add state selection as a custom navigation and include a city search as an action item view. Also, I was able to replace the radar option dialog with a sub menu navigation off the action bar.

Old Design

rainTotal

Select

options

New Design

LandSearch
LandSatWind

LandSearch

three

four

Code for New Base Class in sherlock library using Mapquest


package com.actionbarsherlock.app;

import android.content.res.Configuration;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.Window;
import android.view.ViewGroup.LayoutParams;

import com.actionbarsherlock.ActionBarSherlock;
import com.actionbarsherlock.ActionBarSherlock.OnActionModeFinishedListener;
import com.actionbarsherlock.ActionBarSherlock.OnActionModeStartedListener;
import com.actionbarsherlock.ActionBarSherlock.OnCreatePanelMenuListener;
import com.actionbarsherlock.ActionBarSherlock.OnMenuItemSelectedListener;
import com.actionbarsherlock.ActionBarSherlock.OnPreparePanelListener;
import com.actionbarsherlock.view.ActionMode;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.mapquest.android.maps.MapActivity;

public class SherlockMapActivity extends MapActivity implements OnCreatePanelMenuListener, OnPreparePanelListener, OnMenuItemSelectedListener, OnActionModeStartedListener, OnActionModeFinishedListener {
private ActionBarSherlock mSherlock;

protected final ActionBarSherlock getSherlock() {
if (mSherlock == null) {
mSherlock = ActionBarSherlock.wrap(this, ActionBarSherlock.FLAG_DELEGATE);
}
return mSherlock;
}

///////////////////////////////////////////////////////////////////////////
// Action bar and mode
///////////////////////////////////////////////////////////////////////////

public ActionBar getSupportActionBar() {
return getSherlock().getActionBar();
}

public ActionMode startActionMode(ActionMode.Callback callback) {
return getSherlock().startActionMode(callback);
}

@Override
public void onActionModeStarted(ActionMode mode) {}

@Override
public void onActionModeFinished(ActionMode mode) {}

///////////////////////////////////////////////////////////////////////////
// General lifecycle/callback dispatching
///////////////////////////////////////////////////////////////////////////

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
getSherlock().dispatchConfigurationChanged(newConfig);
}

@Override
protected void onPostResume() {
super.onPostResume();
getSherlock().dispatchPostResume();
}

@Override
protected void onPause() {
getSherlock().dispatchPause();
super.onPause();
}

@Override
protected void onStop() {
getSherlock().dispatchStop();
super.onStop();
}

@Override
protected void onDestroy() {
getSherlock().dispatchDestroy();
super.onDestroy();
}

@Override
protected void onPostCreate(Bundle savedInstanceState) {
getSherlock().dispatchPostCreate(savedInstanceState);
super.onPostCreate(savedInstanceState);
}

@Override
protected void onTitleChanged(CharSequence title, int color) {
getSherlock().dispatchTitleChanged(title, color);
super.onTitleChanged(title, color);
}

@Override
public final boolean onMenuOpened(int featureId, android.view.Menu menu) {
if (getSherlock().dispatchMenuOpened(featureId, menu)) {
return true;
}
return super.onMenuOpened(featureId, menu);
}

@Override
public void onPanelClosed(int featureId, android.view.Menu menu) {
getSherlock().dispatchPanelClosed(featureId, menu);
super.onPanelClosed(featureId, menu);
}

@Override
public boolean dispatchKeyEvent(KeyEvent event) {
if (getSherlock().dispatchKeyEvent(event)) {
return true;
}
return super.dispatchKeyEvent(event);
}

@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
getSherlock().dispatchSaveInstanceState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
getSherlock().dispatchRestoreInstanceState(savedInstanceState);
}

///////////////////////////////////////////////////////////////////////////
// Native menu handling
///////////////////////////////////////////////////////////////////////////

public MenuInflater getSupportMenuInflater() {
return getSherlock().getMenuInflater();
}

public void invalidateOptionsMenu() {
getSherlock().dispatchInvalidateOptionsMenu();
}

public void supportInvalidateOptionsMenu() {
invalidateOptionsMenu();
}

@Override
public final boolean onCreateOptionsMenu(android.view.Menu menu) {
return getSherlock().dispatchCreateOptionsMenu(menu);
}

@Override
public final boolean onPrepareOptionsMenu(android.view.Menu menu) {
return getSherlock().dispatchPrepareOptionsMenu(menu);
}

@Override
public final boolean onOptionsItemSelected(android.view.MenuItem item) {
return getSherlock().dispatchOptionsItemSelected(item);
}

@Override
public void openOptionsMenu() {
if (!getSherlock().dispatchOpenOptionsMenu()) {
super.openOptionsMenu();
}
}

@Override
public void closeOptionsMenu() {
if (!getSherlock().dispatchCloseOptionsMenu()) {
super.closeOptionsMenu();
}
}

///////////////////////////////////////////////////////////////////////////
// Sherlock menu handling
///////////////////////////////////////////////////////////////////////////

@Override
public boolean onCreatePanelMenu(int featureId, Menu menu) {
if (featureId == Window.FEATURE_OPTIONS_PANEL) {
return onCreateOptionsMenu(menu);
}
return false;
}

public boolean onCreateOptionsMenu(Menu menu) {
return true;
}

@Override
public boolean onPreparePanel(int featureId, View view, Menu menu) {
if (featureId == Window.FEATURE_OPTIONS_PANEL) {
return onPrepareOptionsMenu(menu);
}
return false;
}

public boolean onPrepareOptionsMenu(Menu menu) {
return true;
}

@Override
public boolean onMenuItemSelected(int featureId, MenuItem item) {
if (featureId == Window.FEATURE_OPTIONS_PANEL) {
return onOptionsItemSelected(item);
}
return false;
}

public boolean onOptionsItemSelected(MenuItem item) {
return false;
}

///////////////////////////////////////////////////////////////////////////
// Content
///////////////////////////////////////////////////////////////////////////

@Override
public void addContentView(View view, LayoutParams params) {
getSherlock().addContentView(view, params);
}

@Override
public void setContentView(int layoutResId) {
getSherlock().setContentView(layoutResId);
}

@Override
public void setContentView(View view, LayoutParams params) {
getSherlock().setContentView(view, params);
}

@Override
public void setContentView(View view) {
getSherlock().setContentView(view);
}

public void requestWindowFeature(long featureId) {
getSherlock().requestFeature((int)featureId);
}

///////////////////////////////////////////////////////////////////////////
// Progress Indication
///////////////////////////////////////////////////////////////////////////

public void setSupportProgress(int progress) {
getSherlock().setProgress(progress);
}

public void setSupportProgressBarIndeterminate(boolean indeterminate) {
getSherlock().setProgressBarIndeterminate(indeterminate);
}

public void setSupportProgressBarIndeterminateVisibility(boolean visible) {
getSherlock().setProgressBarIndeterminateVisibility(visible);
}

public void setSupportProgressBarVisibility(boolean visible) {
getSherlock().setProgressBarVisibility(visible);
}

public void setSupportSecondaryProgress(int secondaryProgress) {
getSherlock().setSecondaryProgress(secondaryProgress);
}

@Override
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
return false;
}
}

Posted in Android, Google, Google Maps, Kindle Fire, MapQuest, Mobile App, Uncategorized | 3 Comments

Track Hurricane Sandy with RadarBuddyPro


Track hurricane Sandy with RadarBuddyPro. RadarBuddyPro includes the Florida, New Orleans and East Coast Radar Stations. Watch to see if it becomes a “Perfect Storm”. RadarBuddyPro gives you the 6 radar products viewable over google maps with zoom and pan. Weather alerts for the region near the radar station are also displayed. You can share radar images and text alerts to email, messaging or social networks. You can follow Issac’s Path by selecting one of the states radar sites when it approaches the United States.If you device supports GPS and your location is known, then RadarBuddyPro will locate the nearest Radar Station and display radar so you can use RadarBuddyPro to track rain or snow and weather alerts on the Go. Get RadarBuddyPro for Android at the following links:

Steps to Use RadarBuddyPro


To select a location click on the search icon and select a state. The selected state will be centered on the map and it’s radar stations displayed. Tab on a radar station to load the radar.

Change map options. Click on the hammer/wrench icon and it will launch the options dialog. You can change the following

  • Radar product(Reflectivity Composite, Reflectivity Base, Velocity Storm Relative, Velocity Base, Rainfall 1-hour total, Rainfall storm total, and Long Range Reflectivity)
  • Radar Loop Speed
  • Radar Opactiy
  • Map terrain: Streets or Satellite

Warnings. Tap the warning to display the warning text in a dialog. Tap on the warning text to share this text via messaging, email, or social networks on your device.

Share: click on the share icon on the menu bar to share an image of the radar and map via messaging, email, or social networks on your device.

Posted in Android, Google, Google Maps, Kindle Fire, Uncategorized | Tagged , , | Leave a comment

Android Replace GoogleMaps with MapQuest

My android app RadarBuddyPro uses Google Maps. The Kindle Fire and a lot of devices on SlideMe do not support Google Maps. So, it was time to find a new mapping api to support these clients. I reviewed MapsForge and MapQuest. MapQuest was the winner due to it’s superior documentation, no api key, and ease of replacing google maps. I am using the free developer version of MapQuest, please visit the MapQuest link for advanced features and payment options for different versions. Okay, time to show the replacement process for switching out google maps with Mapquest. My app basically has 2 overlays, markers for showing NOAA radar sites, in which the user can tap to present another overlay with show animated radar images as shown below.

Steps to replace Google Maps with MapQuest

    1. Add the MapQuest library to your Project.
    2. Remove the Google Maps library from your project.
    3. Replace Google Maps errors reference to MapQuest in your activity and layout file.
    4. Great, it builds with no errors. Piece of cake, the apis are very similiar, so cleanup is almost non-existance. I have custom overlays, marker onTap methods, terrian or sattelite view toggle, runnable threads interacting with the map and everything worked…somewhat. Output below for KindleFire

Issues that I ran into:

1. ItemizedOverlay Issue

My marker itemized overlay can consist of multiple markers for a state, I embed the radar station id in the marker so when user taps the marker I can correctly fetch and display animated radar images for that radar stations. With Mapquest, it was displaying the wrong radar for the marker you tapped. Basically, this is one difference between google maps and MapQuest. When you extend ItemizedOverlay and then add multiple items, MapQuest does not explictly track the order of elements, so the onTap method will contain the marker the user tapped. You must override the getIndexToDraw method to have this work correctly. Method in bold below.
private class MyItemizedOverlay extends ItemizedOverlay{

private ArrayList overlayItemList = new ArrayList();
Drawable marker;
Context lcontext;
public MyItemizedOverlay(Drawable marker, Context context) {
super(boundCenterBottom(marker));
this.marker = marker;
this.lcontext = context;

populate();
}

public void addItem(GeoPoint p, String title, String snippet){
OverlayItem newItem = new OverlayItem(p, title, snippet);
overlayItemList.add(newItem);
populate();
}

@Override
protected boolean onTap(int index) {
if(canTap == true)
{
canTap = false;

pd = new ProgressDialog(PreHoneyComb.this);
pd.setMessage(“Loading…” + longRadarType);
pd.setCancelable(true);
pd.setButton(DialogInterface.BUTTON_NEGATIVE, “Cancel Download”, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
if(mHandler != null)
{
mHandler.removeCallbacks(doUpdateView);
}
bitMapCount = 0;
radars.clear();
ImageLinks.clear();
totalCount =0;
if(mapOverlay != null)
{
mapView.getOverlays().remove(mapOverlay);
}
dialog.dismiss();
canTap=true;
}
});
pd.show();
OverlayItem item = overlayItemList.get(index);
radarStation = item.getTitle().toUpperCase();

timeZone = item.getSnippet();
try{
RadarBuddy.tracker.trackEvent(“RadarTap”, “Location”,item.getTitle().toUpperCase(), -1);
RadarBuddy.tracker.trackEvent(“RadarTap”, “Timezone”,item.getSnippet(), -1);
}
catch(Exception e)
{
}
txtTime.setText(“”);
if(mHandler != null)
{
mHandler.removeCallbacks(doUpdateView);

}
if(handler != null)
{
handler.removeCallbacks(doUpdateScroll);
RadarBuddy.hazards.clear();
scrollIndex = 0;
}
bitMapCount = 0;
radars.clear();
ImageLinks.clear();
totalCount =0;
if(mapOverlay != null)
{
mapView.getOverlays().remove(mapOverlay);
}

GetRadarStationInfo(item.getTitle().toUpperCase());
}
return true;
}
@Override
protected int getIndexToDraw(int drawingOrder)
{
return drawingOrder;

}

@Override
protected OverlayItem createItem(int i) {
// TODO Auto-generated method stub
return overlayItemList.get(i);
}

@Override
public int size() {
// TODO Auto-generated method stub
return overlayItemList.size();
}

@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
// TODO Auto-generated method stub
super.draw(canvas, mapView, shadow);
boundCenterBottom(marker);
}

}

2. Zoom after marker onTap

The following workflow occurs in my app. When the user tapped on a radar station, I recenter and zoom the map to that location. This worked fine in google maps, but in MapQuest, the map tiles would not load with this action. I have not figured it out yet, but I removed the recenter and zoom feature and the map tiles loaded correctly.

Conclusion

Replacing Google Maps with Mapquest is a relatively painless process. The quality of maps is an issue. The level of detail, appearance, and style of the free version of MapQuest is no match for google maps.

Posted in Android, Google, Google Maps, Kindle Fire, MapQuest, Uncategorized | 2 Comments

Google Analytics for Mobile Android and IOS Apps

Google Analytics are not just for web sites. Get the who, what, and where of your mobile apps users by adding Google Analytics. You can use for IOS app also. Following are some highlights of Analytics for my free App RadarBuddy.

DashBoard

The dashboard provides a quick look at the metrics for your app. If includes daily visits, average time on site, traffic types … The dashboard allows the addition/removal of other metric widgets

Real Time Metrics

A new feature is real time metrics which provides information of where, when, page visits(i.e. activity/fragment), new or returning users, … on who is using your app in real time. During the recent tornado outbreaks, I was able to see users near reported tornados in real time by monitoring noaa weather alerts and verifying the locations of the users accessing RadarBuddy. You can also customize email alerts when certain thresholds are met. For example, you set an alerts for 10 users who were referred by a certain url(i.e. marketing campaign) or no users for a certain time period(i.e, database or network issues you need to fix ASAP)

Intelligence Events

These reports provide quick daily, weekly, monthly metrics reports for analysis. Once again, you can customize the metrics reported.

Monthly Average User time on app

Posted in Android, Google, Google Analytics, Mobile App | Tagged , , , , , | 1 Comment

Mobile Gold Rush Reality Blog: Month 1

Part One. Mobile Gold Rush Reality Blog

RadarBuddy is an android app that I created in my spare time. The app was published to the Android App Market, now Google Play, as a free app on Feb 24, 2012. Let’s see if it will be a “glory hole”, “pay streak”, or a bust.I employed Google Analytics and Admob for the site. Let’s see what happened after one month. Marketing consisted of sending the link to friends, resume, and Linkedin Profile.Below is a description of the App.

App

RadarBuddy is your personal assistance to view NEXRAD Level 3 radar data from the NOAA radar station network. This network covers all United States, Puerto Rico, and Guam. Radar data includes Reflectivity Composite, Reflectivity Base, Velocity Storm Relative,Velocity Base, Rainfall 1-Hour Total, Rainfall Storm Total, and Long Range Reflectivity.
How to Use:
Once launched, RadarBuddy displays a map of the continential United States. You have 2 options to locate radar sites. You can select a state, Puerto Rico, or Guam from the search menu button or you can click the mylocation button. Once you have chosen an action, the map will display radars for the selected location or the closet radar site to your location. Click on the radar station icon to display radar loops. You can pinch to zoom in or out of the map or use the standard google map toogle controls. Drag your finger to pan the map. Display options can be set from the options menu and you can change terrian to sattelite, change radar product, change loop speed, or opacity. If you would like to share images with your buddies, then select the share button which will take a screenshot of the map and send it via Messaging, Facebook, Google+, Flickr, Twitter, and more. Please note the image will be saved directly to your SD Card.

User Installs

Installs

So, we had almost 1,300 installs with @ less than half not uninstalling the app. The numbers are not totally accurate since there is a lag in the google play reporting. It is not real-time. Not bad I think considering I did not do any marketing.

Daily Use

Daily Use

The overall average is @ 100 unique visitors a day with @ 20% being new(just installed the app). A big day was March 2, but that is due to the Tornado outbreak which occured that day.

Google Analytics Metric

The cool thing about Google Analytics is you can capture user actions to review what the user features the end user is using. In the case below, we are tracking the share button, in which the user can post a screen shot of the radar image to pic messaging, facebook, email,….
Share Metric

Google Admob

I used Google Admob for advertising on the site. Revenue is almost $10.00.The CTR rate was averaging @ 4 %, but I switched to an ad refresh rate of 1 minute and it is down to @ 1.5%

Admob
CTR

Next Month

  • Add Weather alerts/legend to Existing App
  • Publish to Amazon App Market
  • Add additional features for paid version and publish
Posted in Admob, Android, Google, Google Analytics, Mobile App | Tagged , | 10 Comments