AppWidget no se muestra en la lista de widgets de lanzador en dispositivos de lollipop solamente

Tengo una aplicación para Android que ya he hecho un appwidget para él antes de lollipop, por algunas razones el widget no aparece en lollipop. Sin embargo, está apareciendo en los dispositivos pre-piruleta.

Aquí está mi código:

AndroidManifest.xml

<receiver android:name=".widgets.NewsWidgetProvider" android:icon="@drawable/ic_launcher" android:label="@string/app_name" >> <intent-filter > <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/news_info" /> </receiver> 

News_info.xml

 <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:initialLayout="@layout/widget_news" android:minHeight="72dp" android:minWidth="300dp" android:updatePeriodMillis="6000000" > 

NoticiasWidgetProvider.java

 public class NewsWidgetProvider extends AppWidgetProvider { private static final String NEXT_NEWS = "NEXT_NEWS"; private static final String PREVIOUS_NEWS = "PREVIOUS_NEWS"; private static final String GO_TO_NEWS_ACTIVITY = "GO_TO_NEWS_ACTIVITY"; private final String NEWS_LIST_KEY = "newsList"; NewsItem[] news; int currentNews=0; Bitmap imageBitmap; private final String CURRENT_NEWS_KEY = "currentNews"; @Override public void onUpdate(final Context context, AppWidgetManager appWidgetManager, final int[] appWidgetIds) { startService(context); loadItemFromSharedPreference(context); for (int widgetId : appWidgetIds) { setUpView(context, appWidgetManager, appWidgetIds, widgetId); } } @Override public void onReceive(Context context, Intent intent) { super.onReceive(context, intent); loadItemFromSharedPreference(context); if (news != null) { if (GO_TO_NEWS_ACTIVITY.equals(intent.getAction())){ openNewsActivity(context); } else if (NEXT_NEWS.equals(intent.getAction())) { if (currentNews == news.length - 1) { Toast.makeText(context, "reached last news", Toast.LENGTH_SHORT).show(); } else if (news.length - 1 > currentNews) { currentNews++; SharedPreferencesManager.putInteger(context, CURRENT_NEWS_KEY, currentNews); loadItemFromSharedPreference(context); setTheCurrentView(context); } } else if (PREVIOUS_NEWS.equals(intent.getAction())) { if (currentNews == 0) { Toast.makeText(context, context.getString(R.string.last_item), Toast.LENGTH_SHORT).show(); } else if (currentNews > 0 && news != null) { currentNews--; SharedPreferencesManager.putInteger(context, CURRENT_NEWS_KEY, currentNews); loadItemFromSharedPreference(context); setTheCurrentView(context); } } } } private void setUpView(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds, int widgetId) { final RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_news); remoteViews.setTextViewText(R.id.title, news==null?context.getString(R.string.wait_msg):news[currentNews].title); remoteViews.setTextViewText(R.id.brief,news==null?"":news[currentNews].brief); setPendingIntents(context, appWidgetIds, remoteViews); if (news!=null) { if (imageBitmap!=null) { AQuery aq = new AQuery(context); remoteViews.setImageViewBitmap(R.id.image, aq.getCachedImage(news[currentNews].imageUrl, 100)); } else { remoteViews.setImageViewResource(R.id.image,R.drawable.ic_launcher); } } else { remoteViews.setImageViewResource(R.id.image,R.drawable.ic_launcher); } appWidgetManager.updateAppWidget(widgetId, remoteViews); } private void setTheCurrentView(Context context) { RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_news); remoteViews.setTextViewText(R.id.title, news==null?context.getString(R.string.widget_problem_title):news[currentNews].title); remoteViews.setTextViewText(R.id.brief,news==null?context.getString(R.string.widget_problem_breif):news[currentNews].brief); remoteViews.setImageViewBitmap(R.id.image, imageBitmap); ComponentName thisWidget = new ComponentName( context, NewsWidgetProvider.class ); AppWidgetManager.getInstance(context).updateAppWidget( thisWidget, remoteViews ); } private void openNewsActivity(Context context) { Intent o=new Intent(context, NewsActivity.class); o.putExtra(NewsItem.EXTRA_NEWS_ITEM,news[currentNews]); o.putExtra(NewsItem.EXTRA_NEWS_SOURCE_IS_PUSH_OR_WIDGET,true); o.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(o); } private void setPendingIntents(Context context, int[] appWidgetIds, RemoteViews remoteViews) { remoteViews.setOnClickPendingIntent(R.id.next_news, getPendingSelfIntent(context, NEXT_NEWS, appWidgetIds)); remoteViews.setOnClickPendingIntent(R.id.previous_news,getPendingSelfIntent(context,PREVIOUS_NEWS,appWidgetIds)); remoteViews.setOnClickPendingIntent(R.id.title,getPendingSelfIntent(context,GO_TO_NEWS_ACTIVITY,appWidgetIds)); remoteViews.setOnClickPendingIntent(R.id.brief,getPendingSelfIntent(context,GO_TO_NEWS_ACTIVITY,appWidgetIds)); remoteViews.setOnClickPendingIntent(R.id.image,getPendingSelfIntent(context,GO_TO_NEWS_ACTIVITY,appWidgetIds)); } protected PendingIntent getPendingSelfIntent(Context context, String action,int[] appWidgetIds) { Intent intent = new Intent(context, getClass()); intent.setAction(action); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); return pendingIntent; } private void loadItemFromSharedPreference(Context context) { currentNews=SharedPreferencesManager.getInteger(context, CURRENT_NEWS_KEY, 0); news=SharedPreferencesManager.getObject(context, NEWS_LIST_KEY,NewsItem[].class); AQuery aq = new AQuery(context); imageBitmap= news == null ? BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher) : aq.getCachedImage(news[currentNews].imageUrl,200); } private void startService(Context context) { Intent broadcastIntent = new Intent(context, NewsWidgetService.class ); //only start service if news is null if (SharedPreferencesManager.getObject(context, NEWS_LIST_KEY, NewsItem[].class)==null) context.startService(broadcastIntent); } 

}

El código está trabajando en (kitkat, gelatina …), pero no funciona en piruletas

¿Me estoy perdiendo de algo?

Tuve el mismo problema – lo arreglé añadiendo parámetro adicional android: widgetCategory = "home_screen" to appwidget-provider:

 <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="294dp" android:minHeight="40dp" android:updatePeriodMillis="86400000" android:configure="com.example.activities.ConfigurationActivity" android:previewImage="@drawable/ic_launcher" android:initialLayout="@layout/widget_layout" android:widgetCategory="home_screen" android:resizeMode="none"> </appwidget-provider> 

Este es un error en Google Now Launcher. He encontrado que una solución para esto es agregar un dummy ContentProvider a su aplicación. Usted puede ver cómo hacer eso en mi respuesta a esta otra pregunta .

Este problema ocurre conmigo cuando instalo widgets de Play Store e incluso cuando instalo directamente desde Android Studio durante el desarrollo.

Las soluciones funcionaron para mí:

  • Reiniciar el dispositivo después de la aplicación inicial / appwidget instalar funcionó para mí.
  • Instalación de un lanzador personalizado
  • El widget no aparece en la lista de widgets
  • Actualizar el widget de la aplicación de Android manualmente mediante un botón en el widget
  • El widget de Android funciona bien en el emulador pero en el teléfono se convierte en el widget de Google App
  • Evitar el desencadenamiento de onUpdate de WidgetProvider
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.