skip to main | skip to sidebar

Android Development Tutorial

Pages

  • Home
 
  • RSS
  • Twitter
Related Posts Plugin for WordPress, Blogger...
Sunday, October 21, 2012

Android app for SimpleWiktionary

Posted by Raju Gupta at 3:11 AM – 0 comments
 
This App takes the word and gives its meaning in detail. Also displays the word of the day
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.util.Log;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * Helper methods to simplify talking with and parsing responses from a
 * lightweight Wiktionary API. Before making any requests, you should call
 * {@link #prepareUserAgent(Context)} to generate a User-Agent string based on
 * your application package name and version.
 */
public class SimpleWikiHelper {
 private static final String TAG = "SimpleWikiHelper";

 /**
  * Regular expression that splits "Word of the day" entry into word
  * name, word type, and the first description bullet point.
  */
 public static final String WORD_OF_DAY_REGEX =
   "(?s)\\{\\{wotd\\|(.+?)\\|(.+?)\\|([^#\\|]+).*?\\}\\}";

 /**
  * Partial URL to use when requesting the detailed entry for a specific
  * Wiktionary page. Use {@link String#format(String, Object...)} to insert
  * the desired page title after escaping it as needed.
  */
 private static final String WIKTIONARY_PAGE =
   "http://en.wiktionary.org/w/api.php?action=query&prop=revisions&titles=%s&" +
     "rvprop=content&format=json%s";

 /**
  * Partial URL to append to {@link #WIKTIONARY_PAGE} when you want to expand
  * any templates found on the requested page. This is useful when browsing
  * full entries, but may use more network bandwidth.
  */
 private static final String WIKTIONARY_EXPAND_TEMPLATES =
   "&rvexpandtemplates=true";

 /**
  * {@link StatusLine} HTTP status code when no server error has occurred.
  */
 private static final int HTTP_STATUS_OK = 200;

 /**
  * Shared buffer used by {@link #getUrlContent(String)} when reading results
  * from an API request.
  */
 private static byte[] sBuffer = new byte[512];

 /**
  * User-agent string to use when making requests. Should be filled using
  * {@link #prepareUserAgent(Context)} before making any other calls.
  */
 private static String sUserAgent = null;

 /**
  * Thrown when there were problems contacting the remote API server, either
  * because of a network error, or the server returned a bad status code.
  */
 public static class ApiException extends Exception {
  public ApiException(String detailMessage, Throwable throwable) {
   super(detailMessage, throwable);
  }

  public ApiException(String detailMessage) {
   super(detailMessage);
  }
 }

 /**
  * Thrown when there were problems parsing the response to an API call,
  * either because the response was empty, or it was malformed.
  */
 public static class ParseException extends Exception {
  public ParseException(String detailMessage, Throwable throwable) {
   super(detailMessage, throwable);
  }
 }

 /**
  * Prepare the internal User-Agent string for use. This requires a
  * {@link Context} to pull the package name and version number for this
  * application.
  */
 public static void prepareUserAgent(Context context) {
  try {
   // Read package name and version number from manifest
   PackageManager manager = context.getPackageManager();
   PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);
   sUserAgent = String.format(context.getString(R.string.template_user_agent),
     info.packageName, info.versionName);

  } catch(NameNotFoundException e) {
   Log.e(TAG, "Couldn't find package information in PackageManager", e);
  }
 }

 /**
  * Read and return the content for a specific Wiktionary page. This makes a
  * lightweight API call, and trims out just the page content returned.
  * Because this call blocks until results are available, it should not be
  * run from a UI thread.
  *
  * @param title The exact title of the Wiktionary page requested.
  * @param expandTemplates If true, expand any wiki templates found.
  * @return Exact content of page.
  * @throws ApiException If any connection or server error occurs.
  * @throws ParseException If there are problems parsing the response.
  */
 public static String getPageContent(String title, boolean expandTemplates)
   throws ApiException, ParseException {
  // Encode page title and expand templates if requested
  String encodedTitle = Uri.encode(title);
  String expandClause = expandTemplates ? WIKTIONARY_EXPAND_TEMPLATES : "";

  // Query the API for content
  String content = getUrlContent(String.format(WIKTIONARY_PAGE,
    encodedTitle, expandClause));
  try {
   // Drill into the JSON response to find the content body
   JSONObject response = new JSONObject(content);
   JSONObject query = response.getJSONObject("query");
   JSONObject pages = query.getJSONObject("pages");
   JSONObject page = pages.getJSONObject((String) pages.keys().next());
   JSONArray revisions = page.getJSONArray("revisions");
   JSONObject revision = revisions.getJSONObject(0);
   return revision.getString("*");
  } catch (JSONException e) {
   throw new ParseException("Problem parsing API response", e);
  }
 }

 /**
  * Pull the raw text content of the given URL. This call blocks until the
  * operation has completed, and is synchronized because it uses a shared
  * buffer {@link #sBuffer}.
  *
  * @param url The exact URL to request.
  * @return The raw content returned by the server.
  * @throws ApiException If any connection or server error occurs.
  */
 protected static synchronized String getUrlContent(String url) throws ApiException {
  if (sUserAgent == null) {
   throw new ApiException("User-Agent string must be prepared");
  }

  // Create client and set our specific user-agent string
  HttpClient client = new DefaultHttpClient();
  HttpGet request = new HttpGet(url);
  request.setHeader("User-Agent", sUserAgent);

  try {
   HttpResponse response = client.execute(request);

   // Check if server response is valid
   StatusLine status = response.getStatusLine();
   if (status.getStatusCode() != HTTP_STATUS_OK) {
    throw new ApiException("Invalid response from server: " +
      status.toString());
   }

   // Pull content stream from response
   HttpEntity entity = response.getEntity();
   InputStream inputStream = entity.getContent();

   ByteArrayOutputStream content = new ByteArrayOutputStream();

   // Read response into a buffered stream
   int readBytes = 0;
   while ((readBytes = inputStream.read(sBuffer)) != -1) {
    content.write(sBuffer, 0, readBytes);
   }

   // Return result from buffered stream
   return new String(content.toByteArray());
  } catch (IOException e) {
   throw new ApiException("Problem communicating with API", e);
  }
 }
}


import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.IBinder;
import android.text.format.Time;
import android.util.Log;
import android.widget.RemoteViews;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Define a simple widget that shows the Wiktionary "Word of the day." To build
 * an update we spawn a background {@link Service} to perform the API queries.
 */
public class WordWidget extends AppWidgetProvider {
 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,
   int[] appWidgetIds) {
  // To prevent any ANR timeouts, we perform the update in a service
  context.startService(new Intent(context, UpdateService.class));
 }

 public static class UpdateService extends Service {
  @Override
  public void onStart(Intent intent, int startId) {
   // Build the widget update for today
   RemoteViews updateViews = buildUpdate(this);

   // Push update for this widget to the home screen
   ComponentName thisWidget = new ComponentName(this, WordWidget.class);
   AppWidgetManager manager = AppWidgetManager.getInstance(this);
   manager.updateAppWidget(thisWidget, updateViews);
  }

  /**
   * Build a widget update to show the current Wiktionary
   * "Word of the day." Will block until the online API returns.
   */
  public RemoteViews buildUpdate(Context context) {
   // Pick out month names from resources
   Resources res = context.getResources();
   String[] monthNames = res.getStringArray(R.array.month_names);

   // Find current month and day
   Time today = new Time();
   today.setToNow();

   // Build today's page title, like "Wiktionary:Word of the day/March 21"
   String pageName = res.getString(R.string.template_wotd_title,
     monthNames[today.month], today.monthDay);
   RemoteViews updateViews = null;
   String pageContent = "";

   try {
    // Try querying the Wiktionary API for today's word
    SimpleWikiHelper.prepareUserAgent(context);
    pageContent = SimpleWikiHelper.getPageContent(pageName, false);
   } catch (ApiException e) {
    Log.e("WordWidget", "Couldn't contact API", e);
   } catch (ParseException e) {
    Log.e("WordWidget", "Couldn't parse API response", e);
   }

   // Use a regular expression to parse out the word and its definition
   Pattern pattern = Pattern.compile(SimpleWikiHelper.WORD_OF_DAY_REGEX);
   Matcher matcher = pattern.matcher(pageContent);
   if (matcher.find()) {
    // Build an update that holds the updated widget contents
    updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_word);

    String wordTitle = matcher.group(1);
    updateViews.setTextViewText(R.id.word_title, wordTitle);
    updateViews.setTextViewText(R.id.word_type, matcher.group(2));
    updateViews.setTextViewText(R.id.definition, matcher.group(3).trim());

    // When user clicks on widget, launch to Wiktionary definition page
    String definePage = res.getString(R.string.template_define_url,
      Uri.encode(wordTitle));
    Intent defineIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(definePage));
    PendingIntent pendingIntent = PendingIntent.getActivity(context,
      0 /* no requestCode */, defineIntent, 0 /* no flags */);
    updateViews.setOnClickPendingIntent(R.id.widget, pendingIntent);

   } else {
    // Didn't find word of day, so show error message
    updateViews = new RemoteViews(context.getPackageName(), R.layout.widget_message);
    CharSequence errorMessage = context.getText(R.string.widget_error);
    updateViews.setTextViewText(R.id.message, errorMessage);
   }
   return updateViews;
  }

  @Override
  public IBinder onBind(Intent intent) {
   // We don't need to bind to this service
   return null;
  }
 }
}

Labels: Android app Email This BlogThis! Share to X Share to Facebook

Leave a Reply

Newer Post Older Post
Subscribe to: Post Comments (Atom)

More Technical Blogs

  • Tech Savvy - Technology Tips
  • PHP Video Tutorial
  • Java Programs with Output
  • C Programming Tutorial
  • Linux Tutorial
  • Language Tutorial
  • Web Development tutorial
  • Popular
  • Recent
  • Archives

Popular Posts

  • Reordering of listview
    Listview rows order can be changed using drag and drop functionality.Dragging should be enabled beyond the visible listview position. ...
Powered by Blogger.

Archives

  • ▼  2012 (44)
    • ▼  October (31)
      • Reordering of listview
      • Text-to-Speech capability for Android Devices
      • Android Stub uninstalling the existing client and ...
      • Tab creation in android screen
      • ListView Recordering by drag drop in Android
      • Android app for SimpleWiktionary
      • App in android for random quote generation
      • Implementing ListView-Adapter in Android
      • Extract all java classes from APK
      • Get XML from APK
      • Sending SMS from the Android Application
      • How to create Drop Down in Android
      • Android Page Navigation
      • To retrieve the cell info for Android device
      • Creating the enrty in the agenda for Android devices.
      • Test Application for Samsung Android devices
      • Color Picker from Image in Android
      • Image Switcher & Gallery in Android
      • Andorid application that listens to incoming sms
      • Accelerometer management for the Android devices
      • Alert box for Confirm
      • 3D Rotation in Android
      • Custom Bar Control for Android using Java
      • Creating Layouts TableRows and TextViews dynamical...
      • Android SeekBar
      • Dialing phone number from Google Android Application
      • Login Screen Creation using Android
      • Add a Progress Bar to Android based Mobile Screens
      • Adding a button to Android based mobile screens
      • Android Dynamically generating views
      • Timezone converter
    • ►  September (3)
    • ►  March (1)
    • ►  February (9)
  • ►  2011 (69)
    • ►  December (69)
 

Followers

Labels

  • Activities (9)
  • Andoird Menu (2)
  • Android timelineActivity. (1)
  • Android Adapter (1)
  • Android app (9)
  • Android App Inventor (1)
  • Android App Publishing (2)
  • Android Application Components (3)
  • Android Application Fundamental (2)
  • Android Architecture (1)
  • Android AsyncTask (1)
  • Android Basic (7)
  • Android Bootcamp Training (18)
  • Android Button Widget (3)
  • Android Custom Style (1)
  • Android Dialog (1)
  • Android Drawable (2)
  • Android Environment (1)
  • Android example (9)
  • Android File System (2)
  • Android Geolocation (2)
  • Android ImageView (1)
  • Android Installation (8)
  • Android intents (5)
  • Android lifecycle (1)
  • Android LIst (4)
  • Android Listener (4)
  • Android Manifest (3)
  • Android Market (1)
  • Android Notification (1)
  • Android Object (1)
  • Android Package File (1)
  • Android Platform (1)
  • Android service (4)
  • Android StatusActivity (1)
  • Android Theme Style (3)
  • Android Traceview (1)
  • Android UI (6)
  • Android Unit Testing (1)
  • Android Widget (4)
  • AndroidManifest.xml (4)
  • Application Icon (1)
  • Broadcast Receiver (2)
  • Content Providers (1)
  • Creating Activities (1)
  • Creating Custom Styles in Android (1)
  • Creating Multiple Activities (1)
  • Database (3)
  • draw9patch (1)
  • Eclipse (12)
  • Explicit Intents (2)
  • Explicit Intents Example (1)
  • Hello world with Android (1)
  • Helloworld with Android (5)
  • Implicit Intents (2)
  • Implicit Intents Example (1)
  • Layout View (3)
  • lifemichael (8)
  • Location Sensor (1)
  • Multiple Activities (2)
  • Netbeans (1)
  • OpenGL ES Graphics (1)
  • Passing Values with Intents (2)
  • Project Structure (1)
  • Retrieving Image URI from Intents (1)
  • Setting Android Environment (1)
  • SQLite (3)
  • TGENT (8)
  • UserGroupAtGoogle (8)
  • XML (1)
  • xtensive arts Training (11)
 
 
© 2011 Android Development Tutorial | Designs by Web2feel & Fab Themes

Bloggerized by DheTemplate.com - Main Blogger