Android Widget在Lollipop中运行,但不在KitKat中

时间:2015-10-25 18:05:43

标签: android android-widget android-5.0-lollipop android-4.4-kitkat

我有一个时钟小部件,每分钟更新一次。它呈现位图并替换imageview。这是在窗口小部件中使用自定义字体。下面我展示了我的代码的重要部分。我的问题是小部件在那里,但没有任何显示。我仍然可以点击小部件来调出设置,所以我知道它在那里。就像服务更新在Kitkat中没有正常工作一样,但它在Lollipop中也是如此。有什么建议吗?

public class DigitalClockWidget_2x1 extends AppWidgetProvider {   
public RemoteViews mRemoteViews;
static String APP_SETTINGS = "8BitSettings";

@Override
public void onEnabled(Context context) {
    super.onEnabled(context);
    context.startService(new Intent(UpdateTimeService.UPDATE_TIME));
}



@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    super.onUpdate(context, appWidgetManager, appWidgetIds);       
    mRemoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);        
    Intent LaunchIntent = getLaunchIntent(context);
    PendingIntent clickPendIntent = PendingIntent.getActivity(context, 0, LaunchIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    mRemoteViews.setOnClickPendingIntent(R.id.widget_root, clickPendIntent);
    ComponentName componentName = new ComponentName(context.getPackageName(),DigitalClockWidget_2x1.class.getName());
    appWidgetManager.updateAppWidget(componentName, mRemoteViews);
    context.startService(new Intent(UpdateTimeService.UPDATE_TIME));



}

public static Intent getLaunchIntent(Context context){
    SharedPreferences clockSettings = context.getSharedPreferences("ClockSettings", 0);
    String launchString = clockSettings.getString("tappedAction", APP_SETTINGS);
    if(launchString.compareTo(APP_SETTINGS) == 0){
        return new Intent(context, SettingsPage.class);
    }
    return context.getPackageManager().getLaunchIntentForPackage(launchString);

}

public static final class UpdateTimeService extends Service {
    static final String UPDATE_TIME = "org.penguinproductions.eight_bit_clock.action.UPDATE_TIME_2x1";
    RemoteViews mRemoteViews;
    private Calendar mCalendar;
    private final static IntentFilter mIntentFilter = new IntentFilter();
    int textColor = 0;
    boolean tweentyfourHour = false;
    SharedPreferences clockSettings;
    String APP_SETTINGS = "8BitSettings";

    static {
        mIntentFilter.addAction(Intent.ACTION_TIME_TICK);
        mIntentFilter.addAction(Intent.ACTION_TIME_CHANGED);
        mIntentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED);
    }

    @Override
    public void onCreate() {
        super.onCreate();           
        mCalendar = Calendar.getInstance();
        registerReceiver(mTimeChangedReceiver, mIntentFilter);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(mTimeChangedReceiver);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStartCommand(intent, flags, startId);

        if (intent != null) {
            if (UPDATE_TIME.equals(intent.getAction())) {
                updateTime();
            }
        }

        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    private final BroadcastReceiver mTimeChangedReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {                
            updateTime();
        }
    };

    private void updateTime() {

        mCalendar.setTimeInMillis(System.currentTimeMillis());

        mRemoteViews = new RemoteViews(getPackageName(), R.layout.widget);

        String date = DateFormat.format(getString(R.string.date_format), mCalendar).toString();

        mRemoteViews.setImageViewBitmap(R.id.imageView_txt, buildUpdate(getTodaysTime(), mCalendar.get(Calendar.AM_PM), date));

        ComponentName mComponentName = new ComponentName(this, DigitalClockWidget_2x1.class);
        AppWidgetManager mAppWidgetManager = AppWidgetManager.getInstance(this);
        mAppWidgetManager.updateAppWidget(mComponentName, mRemoteViews);



        Intent LaunchIntent = getLaunchIntent(getBaseContext());
        PendingIntent clickPendIntent = PendingIntent.getActivity(getBaseContext(), 0, LaunchIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        mRemoteViews.setOnClickPendingIntent(R.id.widget_root, clickPendIntent);
       mAppWidgetManager = AppWidgetManager.getInstance(getBaseContext());
        mAppWidgetManager.updateAppWidget(mComponentName, mRemoteViews);
    }
}

编辑:

这个问题似乎与Bitmap渲染有关。我用textview替换了imageview并且它有效。因此Bitmap不会在KitKat中显示,但它在Lollipop中显示

public Bitmap buildUpdate(String time, int AMPM, String date) {
         Log.v("Penguin", "Building time string:" + time);

        clockSettings = this.getSharedPreferences("ClockSettings", 0);
        boolean showDate = clockSettings.getBoolean("showDate", true);
        boolean showampm = clockSettings.getBoolean("ampm", true);
        boolean leading0 = clockSettings.getBoolean("leading0", true);
        textColor = clockSettings.getInt("clockColor", Color.WHITE);
        int dateColor = clockSettings.getInt("dateColor", Color.WHITE);



        Bitmap myBitmap = Bitmap.createBitmap(2500, 1100, Bitmap.Config.ARGB_8888);

        int fontSize = 425;
        Canvas myCanvas = new Canvas(myBitmap);
        Paint paint = new Paint();
        Typeface clock = Typeface.createFromAsset(this.getAssets(), "fonts/PressStart2P.ttf");
        paint.setAntiAlias(true);
        paint.setSubpixelText(true);
        paint.setTypeface(clock);
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(textColor);

        paint.setTextSize(fontSize);
        paint.setTextAlign(Paint.Align.CENTER);

        myCanvas.drawText(time, myBitmap.getWidth() / 2, fontSize+200, paint);

        paint.setTextSize(100);
        if(showampm) {
            // alert("AMPM");
            String ampm = "AM";
            if (AMPM == 1) ampm = "PM";
            myCanvas.drawText(ampm, (myBitmap.getWidth() / 2) + ((time.length() * fontSize) / 2) + 100, 300, paint);
        }

        paint.setTextSize(125);

        if(showDate) {
            paint.setColor(dateColor);
            myCanvas.drawText(date, myBitmap.getWidth() / 2, (myBitmap.getHeight() / 2 + 400), paint);
        }
        return myBitmap;
    }

1 个答案:

答案 0 :(得分:0)

所以问题是运行KitKat的旧手机的尺寸限制只允许纹理尺寸不大于2048x2048像素。我的位图是2500x1100,因此缩小它已修复了问题