0

i am making a clock widget with seconds hand.i got a code from another website and have implemented to my project.i found that the seconds needle works well but quiet after some time it gets force close.log cat has been posted below for your kind reference

11-25 11:11:39.040: E/AndroidRuntime(23673): FATAL EXCEPTION: main
11-25 11:11:39.040: E/AndroidRuntime(23673): java.lang.RuntimeException: Unable to start service com.themebowl.christmaswinterclockfree.WidgetService@41ded6e8 with null: java.lang.NullPointerException
11-25 11:11:39.040: E/AndroidRuntime(23673):    at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2571)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at android.app.ActivityThread.access$2000(ActivityThread.java:140)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1334)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at android.os.Looper.loop(Looper.java:137)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at android.app.ActivityThread.main(ActivityThread.java:4921)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at java.lang.reflect.Method.invokeNative(Native Method)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at java.lang.reflect.Method.invoke(Method.java:511)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at dalvik.system.NativeStart.main(Native Method)
11-25 11:11:39.040: E/AndroidRuntime(23673): Caused by: java.lang.NullPointerException
11-25 11:11:39.040: E/AndroidRuntime(23673):    at com.themebowl.christmaswinterclockfree.ClockWidgetProvider.onDrawClock(ClockWidgetProvider.java:192)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at com.themebowl.christmaswinterclockfree.WidgetService.onStartCommand(WidgetService.java:64)
11-25 11:11:39.040: E/AndroidRuntime(23673):    at  android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2554)
11-25 11:11:39.040: E/AndroidRuntime(23673):    ... 10 more

I need a helping hand.hope you will help me.

ClockWidgetProvider.class

package com.themebowl.christmaswinterclockfree;


import com.themebowl.christmaswinterclockfree.R.drawable;

import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.PowerManager;
import android.text.format.Time;
import android.util.Log;
import android.widget.RemoteViews;

public class ClockWidgetProvider extends AppWidgetProvider {

public static String THEMEVALUE = "DEFAULT";
public static String SKINVALUE = "CYAN";

public static int DISPLAYWIDTH;
public static int DISPLAYHEIGHT;
private static Canvas dial_Canvas;
private static Drawable dial_drawable, hour_drawable, minute_drawable,
        second_drawable
        ;
private static boolean mChanged = false;
protected static Time mCalendar = new Time();
private static float mMinutes;
private static float mHour;
private static float mSecond;
private static RemoteViews views;
private static Bitmap b;
private static AppWidgetManager widgetManager;
private static int widgetId;

public static boolean hasBackground = false;
public static boolean hasNumbers = false;
public static boolean hasMarkers = false;
public static boolean isWidgetCredated = false;

private PowerManager.WakeLock wl;
private PowerManager pm;

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

    Log.e("onUpdate", "Inside onUpdate");

    final int N = appWidgetIds.length;
    for (int i = 0; i < N; i++) {
        int appWidgetId = appWidgetIds[i];
        updateAppWidget(context, appWidgetManager, appWidgetId);

    }

}



public static void updateAppWidget(Context context,
        AppWidgetManager appWidgetManager, int appWidgetId) {

    widgetManager = appWidgetManager;
    widgetId = appWidgetId;

    Intent intent = new Intent(context, ClockWidgetConfig.class);
    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); // Identifies
                                                                        // the
                                                                        // particular
                                                                        // widget...
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setData(Uri.parse(intent.toUri(Intent.URI_INTENT_SCHEME)));
    PendingIntent pendIntent = PendingIntent.getActivity(context, 0,
            intent, PendingIntent.FLAG_UPDATE_CURRENT);

    views = new RemoteViews(context.getPackageName(),
            R.layout.clockwidget_layout);


     if (THEMEVALUE.equalsIgnoreCase("NEON")) {


             //             second_drawable = context.getResources().getDrawable(
           //                       drawable.neon_blue_markers);

        dial_drawable = context.getResources().getDrawable(
                drawable.xclockb);
        hour_drawable = context.getResources().getDrawable(
                drawable.clock_hand_hour);
        minute_drawable = context.getResources().getDrawable(
                drawable.clock_hand_minute);

        second_drawable = context.getResources().getDrawable(
                drawable.xclocks);


    DISPLAYWIDTH = dial_drawable.getIntrinsicWidth();
    DISPLAYHEIGHT = dial_drawable.getIntrinsicHeight();

    b = Bitmap.createBitmap(DISPLAYWIDTH, DISPLAYHEIGHT,
            Bitmap.Config.ARGB_8888);
    dial_Canvas = new Canvas(b);
    onTimeChanged();

    views.setOnClickPendingIntent(R.id.Widget, pendIntent);
    appWidgetManager.updateAppWidget(appWidgetId, views);
     }
}

public void onReceive(Context context, Intent intent) {

    Log.e("onReceive", "Inside onReceive");

    if (AppWidgetManager.ACTION_APPWIDGET_DELETED.equals(intent)) {
        AppWidgetManager amgr = AppWidgetManager.getInstance(context);
        int length = amgr.getAppWidgetIds(intent.getComponent()).length;
        if (length == 0)// WidgetService.StopService(context);
            context.stopService(new Intent(context, WidgetService.class));
        isWidgetCredated = false;
        WidgetService.timer.cancel();
        WidgetService.timer.purge();
    }

    pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AnalogClock");
    //am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

//  setAlarm(context);

    RemoteViews views = new RemoteViews(context.getPackageName(),
            R.layout.clockwidget_layout);

    Intent AlarmClockIntent = new Intent(Intent.ACTION_MAIN).addCategory(
            Intent.CATEGORY_LAUNCHER).setComponent(
            new ComponentName("com.android.alarmclock",
                    "com.android.alarmclock.AlarmClock"));
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
            AlarmClockIntent, 0);
    views.setOnClickPendingIntent(R.id.Widget, pendingIntent);

    AppWidgetManager.getInstance(context).updateAppWidget(
            intent.getIntArrayExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS),
            views);

}

protected static void onDrawClock() {

    boolean changed = mChanged;
    if (changed) {
        mChanged = false;
    }

    Log.e("Inside onDraw", "Inside onDraw");

    int availableWidth = DISPLAYWIDTH;
    int availableHeight = DISPLAYHEIGHT;

    int x = availableWidth / 2;
    int y = availableHeight / 2;

    final Drawable dial = dial_drawable;
    int w = dial.getIntrinsicWidth();
    int h = dial.getIntrinsicHeight();

    boolean scaled = false;

    // //////////////////////



    // ////////////////////////////////
    if (availableWidth < w || availableHeight < h) {
        scaled = true;
        float scale = Math.min((float) availableWidth / (float) w,
                (float) availableHeight / (float) h);
        dial_Canvas.save();
        dial_Canvas.scale(scale, scale, x, y);
    }

    if (changed) {
        dial.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y + (h / 2));
    }
    dial.draw(dial_Canvas);

    dial_Canvas.save();
    dial_Canvas.rotate(mHour / 12.0f * 360.0f, x, y);

    final Drawable hourHand = hour_drawable;
    if (changed) {
        w = hourHand.getIntrinsicWidth();
        h = hourHand.getIntrinsicHeight();
        hourHand.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y
                + (h / 2));
    }
    hourHand.draw(dial_Canvas);
    dial_Canvas.restore();

    dial_Canvas.save();
    dial_Canvas.rotate(mMinutes / 60.0f * 360.0f, x, y);

    final Drawable minuteHand = minute_drawable;
    if (changed) {
        w = minuteHand.getIntrinsicWidth();
        h = minuteHand.getIntrinsicHeight();
        minuteHand.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y
                + (h / 2));
    }
    minuteHand.draw(dial_Canvas);
   //edited

    //dial_Canvas.restore();

    if (WidgetService.hasSecondsHand) {
        // /////////
        dial_Canvas.restore();

        dial_Canvas.save();
        // dial_Canvas.rotate(mSecond / 30.0f * 360.0f, x, y);

        dial_Canvas.rotate(mSecond / 60.0f * 60.0f * 360.0f, x, y);

        Log.e("second onTimeChanged", mSecond / 30.0f * 360.0f + "");

        final Drawable secondHand = second_drawable;
        if (changed) {
            w = secondHand.getIntrinsicWidth();
            h = secondHand.getIntrinsicHeight();
            secondHand.setBounds(x - (w / 2), y - (h / 2), x + (w / 2), y
                    + (h / 2));
        }
        secondHand.draw(dial_Canvas);
        // ////////////
    }

    dial_Canvas.restore();
    //edited
    //dial_Canvas.save();

    if (scaled) {
        dial_Canvas.restore();
        //dial_Canvas.save();

    }

    isWidgetCredated = true;
}

protected static void onTimeChanged() {

    mCalendar.setToNow();
    int hour = mCalendar.hour;
    int minute = mCalendar.minute;
    int second = mCalendar.second;

    mSecond = second / 60.0f;
    mMinutes = minute + second / 60.0f;
    mHour = hour + mMinutes / 60.0f;
    mChanged = true;

    b.eraseColor(Color.TRANSPARENT);

    onDrawClock();

    views.setImageViewBitmap(R.id.dialimg, b);
     widgetManager.updateAppWidget(widgetId, views);

}

protected static void broadcastTimeChanging() {
    mCalendar.setToNow();
    int hour = mCalendar.hour;
    int minute = mCalendar.minute;
    int second = mCalendar.second;

    mSecond = second / 60.0f;
    mMinutes = minute + second / 60.0f;
    mHour = hour + mMinutes / 60.0f;
    mChanged = true;
}




   }
  • Can you please show your code? Specially line ClockWidgetProvider.java:192? As it is giving Null Pointer Exception. It says Unable to start service com.themebowl.christmaswinterclockfree.WidgetService@41ded6e8 with null: java.lang.NullPointerException. So there is something null over there. – MysticMagicϡ Nov 25 '13 at 05:52
  • @MysticMagic i have gone through that line but still couldn't understand what the problem is.any how added updated code – user2862217 Nov 25 '13 at 05:59
  • That line is `if(changed)`. I can't get it, too. Please put a debug point before that line and check what data is null. – MysticMagicϡ Nov 25 '13 at 06:01
  • huff... why are maintaining RemoteViews, Drawables, AppWidgetManager with static references? have you read this http://stackoverflow.com/questions/6567647/avoid-memory-leaks-on-android? – Gopal Gopi Nov 25 '13 at 06:04
  • @MysticMagic i see.ok i will try. – user2862217 Nov 25 '13 at 06:09
  • @GopalRao can you provide a fix? – user2862217 Nov 25 '13 at 06:14
  • @MysticMagic i couldn't find out – user2862217 Nov 25 '13 at 06:19

0 Answers0