Aug 30, 2012

Home Screen Widget step-by-step - modify our App Widget Provider (AppWidgetProvider) to update widget RemoteViews

It's part of the Home Screen Widgets step-by-step series.

Up to last post, we have a dummy home screen widget without any function. In this step, we are going to modify WidgetProvider.java, override onUpdate() method to updateAppWidget() with RemoteViews.

override onUpdate() method to updateAppWidget() with RemoteViews.

WidgetProvider.java
package com.example.androidhomewidget;

import java.text.SimpleDateFormat;
import java.util.Date;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;
import android.widget.Toast;

public class WidgetProvider extends AppWidgetProvider {

 @Override
 public void onDeleted(Context context, int[] appWidgetIds) {
  // TODO Auto-generated method stub
  super.onDeleted(context, appWidgetIds);
 }

 @Override
 public void onDisabled(Context context) {
  // TODO Auto-generated method stub
  super.onDisabled(context);
 }

 @Override
 public void onEnabled(Context context) {
  // TODO Auto-generated method stub
  super.onEnabled(context);
 }

 @Override
 public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
  super.onReceive(context, intent);
 }

 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,
   int[] appWidgetIds) {
  
  for(int i = 0; i < appWidgetIds.length; i++){
   
   int id = appWidgetIds[i];
   
   Toast.makeText(context, 
     "onUpdate: " + String.valueOf(id), 
     Toast.LENGTH_LONG).show();
   
   RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout);
   
   remoteViews.setTextViewText(R.id.widget_id, String.valueOf(id));
   
   SimpleDateFormat simpleDateFormat = new SimpleDateFormat("hh:mm:ss");
   String now = simpleDateFormat.format(new Date());
   remoteViews.setTextViewText(R.id.widget_status, now);
   
   appWidgetManager.updateAppWidget(id, remoteViews);
   
   super.onUpdate(context, appWidgetManager, appWidgetIds);
  }
 }

}


Refer to our app widget provider, onUpdate() will be call every 30 minutes (1800000 millisecond). It's a approximated reference, no guarantee how accurate is it.

Aug 29, 2012

Home Screen Widget step-by-step - define Widget Provider Receiver in AndroidManifest.xml

It's part of the Home Screen Widgets step-by-step series.

In this step, modify AndroidManifest.xml to add <receiver> to define Widget Provider Receiver.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidhomewidget"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
<!-- define Widget Provider Receiver -->        
        <receiver android:name=".WidgetProvider" >
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>
        <meta-data android:name="android.appwidget.provider"
            android:resource="@xml/widgetproviderinfo" />
        </receiver>
        
    </application>

</manifest>


Pay attention how android:name=".WidgetProvider" and android:resource="@xml/widgetproviderinfo" correspond to WidgetProvider.java and /res/xml/widgetproviderinfo.xml respectively.

After modified AndroidManifest.xml to define Widget Provider Receiver, we can add our dummy Widget on Home Screen. Up to here, the widget do nothing actually!

The dummy Home Screen Widget

Aug 28, 2012

Home Screen Widget step-by-step - create our AppWidget Provider by extending AppWidgetProvider.

It's part of the Home Screen Widgets step-by-step series.

android.appwidget.AppWidgetProvider is a convenience class to aid in implementing an AppWidget provider. Everything you can do with AppWidgetProvider, you can do with a regular BroadcastReceiver. AppWidgetProvider merely parses the relevant fields out of the Intent that is received in onReceive(Context,Intent), and calls hook methods with the received extras.

Extend this class and override one or more of the onUpdate(Context, AppWidgetManager, int[]), onDeleted(Context, int[]), onEnabled(Context) or onDisabled(Context) methods to implement your own AppWidget functionality.


At this moment, just implement our dummy AppWidgetProvider class, WidgetProvider.java. We will include it in our AndroidManifest.xml later.

package com.example.androidhomewidget;

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;

public class WidgetProvider extends AppWidgetProvider {

 @Override
 public void onDeleted(Context context, int[] appWidgetIds) {
  // TODO Auto-generated method stub
  super.onDeleted(context, appWidgetIds);
 }

 @Override
 public void onDisabled(Context context) {
  // TODO Auto-generated method stub
  super.onDisabled(context);
 }

 @Override
 public void onEnabled(Context context) {
  // TODO Auto-generated method stub
  super.onEnabled(context);
 }

 @Override
 public void onReceive(Context context, Intent intent) {
  // TODO Auto-generated method stub
  super.onReceive(context, intent);
 }

 @Override
 public void onUpdate(Context context, AppWidgetManager appWidgetManager,
   int[] appWidgetIds) {
  // TODO Auto-generated method stub
  super.onUpdate(context, appWidgetManager, appWidgetIds);
 }

}

Aug 24, 2012

Get 3gp link of Youtube video

The post "A simple example using VideoView to play 3gp from YouTube" describe how to play Youtube video in 3gp format on Android. But how can you get the 3gp link of Youtube video?

For example, you want to embed the 3gp video of "Google I/O 2012 - What's New in Android?" in your app.

Right click the video to copy Video URL.



Paste and open the link, replace the leading "www.youtube.com" with "m.youtube.com" to get the mobile version.



Corresponding mobile version of the video will be loaded. Right click on the video to Copy Link Address. It's the 3gp link of the video:

rtsp://v4.cache7.c.youtube.com/CjYLENy73wIaLQky7ThXrRjPYRMYDSANFEIJbXYtZ29vZ2xlSARSBXdhdGNoYKjR78WV1ZH5Tgw=/0/0/0/video.3gp

You can copy this link to replace SrcPath in the example "A simple example using VideoView to play 3gp from YouTube".



Aug 23, 2012

Home Screen Widget step-by-step - define widget layout

It's the second step to create Home Screen Widgets.

Refer to the last article to "Define app widget provider in XML". It's specified android:initialLayout="@layout/widget_layout", means we have a xml file named widget_layout.xml in /res/layout/ folder, to define our widget layout.

/res/layout/widget_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <TextView
        android:id="@+id/widget_id"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:background="#F06030"
        android:textColor="#101010"
        android:textSize="30sp"
        android:text="id"/>
    <TextView
        android:id="@+id/widget_status"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/background_dark"
        android:textColor="@android:color/white"
        android:textSize="30sp"
        android:text="status"/>
</LinearLayout>

Infolinks In Text Ads