appWidget не отображается в списке виджетов запуска только на устройствах с леденцами

У меня есть приложение для Android, для которого я уже сделал appwidget до леденца на палочке, по некоторым причинам виджет не отображается в леденце на палочке. Тем не менее, он появляется в устройствах до леденцов.

Вот мой код:

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" >

NewsWidgetProvider.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);
}

}

Код работает в (kitkat, jelly...), но не работает в леденце.

Я что-то упускаю?


person zaPlayer    schedule 11.03.2015    source источник
comment
У меня такая же ошибка в Genymotion 4.3 с использованием Google Now Launcher, который является средством запуска по умолчанию в Lollipop, поэтому проблема заключается в средстве запуска, а не в Lollipop как таковом.   -  person Leo supports Monica Cellio    schedule 08.04.2015
comment
Я вижу ту же проблему с WhatsApp и приложением Facebook, но, как ни странно, не с Evernote.   -  person Leo supports Monica Cellio    schedule 08.04.2015
comment
На каком устройстве вы используете леденец и пытаетесь показать свой виджет?   -  person Libelle    schedule 21.08.2016
comment
я использовал Nexus 5 и Galaxy S5 @Libelle   -  person zaPlayer    schedule 21.08.2016
comment
Это не должно быть проблемой. Кстати, я заметил, что ваш тег appwidget-provider в файле news_info.xml не имеет закрывающего тега. Последняя строка должна заканчиваться на «6000000 /›». (Обратите внимание на / перед закрывающей скобкой)   -  person Libelle    schedule 23.08.2016
comment
@Samer Zuhair Привет, пожалуйста, опубликуйте свой код для загрузки изображения с URL-адреса с помощью auery. Мне это срочно нужно.   -  person Sangeetha    schedule 21.12.2016
comment
@Sangeetha, извините, у меня больше нет доступа к этому коду, и я перестал использовать aquery после этого проекта, однако проверьте эту ссылку, она может вам помочь androiddhina.blogspot.com/2015/03/   -  person zaPlayer    schedule 26.12.2016
comment
@Samer Zuhair Хорошо. Спасибо за ваш ответ.   -  person Sangeetha    schedule 27.12.2016


Ответы (3)


У меня была та же проблема - я исправил ее, добавив дополнительный параметр android:widgetCategory="home_screen" в 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>
person user3774089    schedule 17.03.2015
comment
Вы изменили что-нибудь еще? Мой код очень похож на ваш, но я не вижу виджета приложения на устройствах Lollipop. - person astryk; 30.03.2015
comment
все еще есть та же проблема - person zaPlayer; 31.03.2015

Это ошибка в Google Now Launcher. Я обнаружил, что обходным путем для этого является добавление фиктивного ContentProvider в ваше приложение. Вы можете увидеть, как это сделать, в мой ответ на этот другой вопрос.

person Leo supports Monica Cellio    schedule 10.04.2015

Эта проблема возникает у меня при установке виджетов из Play Store и даже при установке прямо из Android Studio во время разработки.

Решения сработали для меня:

  • У меня сработала перезагрузка устройства после первоначальной установки приложения/виджета приложения.
  • Установка кастомного лаунчера
person SuperShalabi    schedule 26.04.2015