«Не удалось добавить виджет» при нажатии imageview

#android #widget

#Android #виджет

Вопрос:

Я тестировал свое приложение на телефоне с Android n. С виджетом в этом телефоне проблем не было. Но когда я пробовал на других телефонах, при нажатии на ImageView происходят странные вещи: ImageView обновляется и преобразуется в виджет просмотра, а затем показывает сообщение об ошибке. И в logcat ничего нет.

общедоступный класс RadioWidget расширяет AppWidgetProvider {

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

    // Construct the RemoteViews object
    RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.radio_widget);
    //Go to radio/track info fragment
    Intent radiointent = new Intent(context, MainActivity.class);
    radiointent.setAction("**********.play");
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, radiointent, 0);
    views.setOnClickPendingIntent(R.id.wlastp, pendingIntent);
    radiointent.setAction("*********.track.info.last");
    pendingIntent = PendingIntent.getActivity(context , 0, radiointent, 0);
    views.setOnClickPendingIntent(R.id.artwork, pendingIntent);
    //Play/Stop radio
    Intent controls = new Intent(context, NotificationControls.class);
    controls.setAction("********.widget.play");
    PendingIntent play = PendingIntent.getBroadcast(context.getApplicationContext(),1,controls,0);
    views.setOnClickPendingIntent(R.id.wplay, play);
    controls.setAction("********.widget.stop");
    PendingIntent stop = PendingIntent.getBroadcast(context.getApplicationContext(),2,controls,0);
    views.setOnClickPendingIntent(R.id.wstop, stop);
    views.setTextViewText(R.id.trackname, "now playing"));
    //Load image
    Glide.with(context.getApplicationContext())
            .load(/* artwork url*/)
            .asBitmap()
            .error(R.mipmap.album_placeholder)
            .into(new AppWidgetTarget(context.getApplicationContext(),views,R.id.artwork,appWidgetId));
    else views.setImageViewResource(R.id.artwork, R.mipmap.album_placeholder);
    int button_state = R.drawable.ic_play_arrow_black_24dp;
    if(/* checking if radio is playing */) button_state = R.drawable.ic_pause_black_24dp;
    views.setImageViewResource(R.id.wplay, button_state);
    // Instruct the widget manager to update the widget
    appWidgetManager.updateAppWidget(appWidgetId, views);
}

@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
    // There may be multiple widgets active, so update all of them
    for (int appWidgetId : appWidgetIds) {
        updateAppWidget(context, appWidgetManager, appWidgetId);
    }
}
  

}

xml

     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/BG"
    android:padding="@dimen/widget_margin">
    <ImageView
        android:layout_width="80dp"
        android:layout_height="match_parent"
        android:src="@mipmap/album_placeholder"
        android:contentDescription="@string/cd_artwork"
        android:id="@ id/artwork"
        android:layout_alignParentLeft="true"
        android:scaleType="centerCrop"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="@string/media_play_now"
        android:id="@ id/trackname"
        android:layout_alignParentTop="true"
        android:layout_toRightOf="@ id/artwork"
        android:layout_toEndOf="@ id/artwork"
        android:textSize="16sp"
        android:minLines="2"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="16dp"
        android:layout_marginRight="16dp"/>
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@ id/trackname"
    android:layout_alignLeft="@ id/trackname"
    android:layout_alignStart="@ id/trackname"
    >
    <ImageView
        android:id="@ id/wplay"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_play_arrow_black_24dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="8dp"
        />

    <ImageView
        android:id="@ id/wstop"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_stop_black_24dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="8dp"
        />

    <ImageView
        android:id="@ id/wlastp"
        android:layout_weight="1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_last_played_black_24dp"
        android:layout_marginLeft="8dp"
        android:layout_marginRight="8dp"
        android:layout_marginBottom="8dp"
        />
</LinearLayout>

</RelativeLayout>
  

манифест

 <receiver android:name=".RadioWidget">
            <intent-filter>
                <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
            </intent-filter>

            <meta-data
                android:name="android.appwidget.provider"
                android:resource="@xml/radio_widget_info" />
        </receiver>
  

и вот мой метод обновляет виджет из Сервиса

 public void updateRadioWidget(Context context) {
        AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
        ComponentName widgetComponent = new ComponentName(context, RadioWidget.class);
        int[] widgetIds = widgetManager.getAppWidgetIds(widgetComponent);
        Intent update = new Intent();
        update.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIds);
        update.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
        context.sendBroadcast(update);
    }
  

Я попробовал другой пост, но безуспешно. Он работает в Android N, но не в других.

Комментарии:

1. Что это за сообщение об ошибке? Как это выглядит?

2. Он показывает несколько виджетов часов, и это происходит imgur.com/a/e3K8g

Ответ №1:

Я отредактировал свой метод обновления, похоже, он работает прямо сейчас

 public void updateRadioWidget() {
    int[] ids = AppWidgetManager.getInstance(context.getApplicationContext()).getAppWidgetIds(new ComponentName(context.getApplicationContext(), RadioWidget.class));
    RadioWidget radioWidget = new RadioWidget();
    radioWidget.onUpdate(context.getApplicationContext(), AppWidgetManager.getInstance(context.getApplicationContext()),ids);

}