как добавить виджет приложения на рабочий стол, нажав кнопку в действии

Я создаю кнопку в Activty и, нажав на кнопку, я хочу программно добавить Appwidget на главный экран в Android.

на самом деле я использую класс appwidgethost, чтобы добавить виджет приложения на домашний экран, но виджет приложения добавляется к действию, а не к домашнему экрану. мой код ниже

package com.lgfischer.widgethost;


import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.appwidget.AppWidgetHost;
import android.appwidget.AppWidgetHostView;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProviderInfo;
import android.content.ComponentName;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.ViewGroup;

public class MYWidgetHostActivity extends Activity {

static final String TAG = "MYWidgetHostActivity";

AppWidgetManager mAppWidgetManager;
AppWidgetHost mAppWidgetHost;

ViewGroup mainlayout;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    mainlayout = (ViewGroup) findViewById(R.id.main_layout);

    mAppWidgetManager = AppWidgetManager.getInstance(this);
    mAppWidgetHost = new AppWidgetHost(this, R.id.APPWIDGET_HOST_ID);
}

@Override
protected void onStart() {
    super.onStart();
    mAppWidgetHost.startListening();
}

/**
 * Stop listen for updates for our widgets (saving battery).
 */
@Override
protected void onStop() {
    super.onStop();
    mAppWidgetHost.stopListening();
}

public void my() {
    mAppWidgetManager = AppWidgetManager.getInstance(this);
    AppWidgetProviderInfo newAppWidgetProviderInfo = new AppWidgetProviderInfo();
    ComponentName cn = new ComponentName("com.dgflip.scada",
            "com.dgflip.service.AppWidget");
    // Get an id
    int appWidgetId = mAppWidgetHost.allocateAppWidgetId();

    // Get the list of installed widgets
    List<AppWidgetProviderInfo> appWidgetInfos = new ArrayList<AppWidgetProviderInfo>();
    appWidgetInfos = mAppWidgetManager.getInstalledProviders();

    for (int j = 0; j < appWidgetInfos.size(); j++) {
        if (appWidgetInfos.get(j).provider.getPackageName().equals(
                "com.digiflip.scada")
                && appWidgetInfos.get(j).provider.getClassName().equals(
                        "com.digiflip.service.AppWidget")) {
            // Get the full info of the required widget
            newAppWidgetProviderInfo = appWidgetInfos.get(j);
            break;
        }
    }
    mAppWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, cn);
    AppWidgetHostView hostView = mAppWidgetHost.createView(this,
            appWidgetId, newAppWidgetProviderInfo);
    hostView.setAppWidget(appWidgetId, newAppWidgetProviderInfo);
    mainlayout.addView(hostView);
}

/**
 * Handles the menu.
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    Log.i(TAG,
            "Menu selected: " + item.getTitle() + " / " + item.getItemId()
                    + " / " + R.id.addWidget);
    switch (item.getItemId()) {
    case R.id.addWidget:
        my();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

/**
 * Creates the menu with options to add and remove widgets.
 */
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.widget_menu, menu);
    return true;
}
 }

приведенный выше код работает, если я добавляю appwidget в активность. но я хочу добавить виджет приложения на рабочий стол.

на самом деле я не понимаю, как получить представление или ссылку на домашний экран, чтобы добавить представление с помощью appwidgethostview.

пожалуйста, помогите мне в этом .. спасибо заранее.


person Shashank Gupta    schedule 03.11.2015    source источник
comment
Перейдите по этой ссылке, чтобы создать виджет приложения на главном экране. github.com/ChiragSavsani/FlashLightWidget   -  person Chirag Savsani    schedule 03.11.2015
comment
Этот код сработал?   -  person Chirag Savsani    schedule 03.11.2015
comment
привет, Чираг, спасибо за помощь, но моя задача не решена, потому что в этом примере appWidget добавляется на рабочий стол вручную, но я хочу добавить appwidget на рабочий стол программно, а не вручную выбирать appwidget и перетаскивать его на рабочий стол......   -  person Shashank Gupta    schedule 03.11.2015
comment
Затем обратитесь к Это или Это может быть так, что ссылки могут помочь вам .   -  person Chirag Savsani    schedule 03.11.2015
comment
привет, чираг, я также пробовал эту ссылку. 2-я ссылка не имеет отношения ко мне, эта ссылка связана только с добавлением ярлыка приложения на рабочий стол, а не с виджетом приложения. и ваша 1-я ссылка опробована, но эта ссылка не описывает добавление виджета приложения на рабочий стол, она описывает только добавление виджета приложения в активность с помощью appwidgethostview, что уже сделано мной.   -  person Shashank Gupta    schedule 03.11.2015


Ответы (1)


В Android O можно программно установить виджет приложения.

AppWidgetManager mAppWidgetManager =
    context.getSystemService(AppWidgetManager.class);

AppWidgetProviderInfo myWidgetProviderInfo = new AppWidgetProviderInfo();
ComponentName myProvider = myWidgetProviderInfo.provider;

if (mAppWidgetManager.isRequestPinAppWidgetSupported()) {
  // Create the PendingIntent object only if your app needs to be notified
  // that the user allowed the widget to be pinned. Note that, if the pinning
  // operation fails, your app isn't notified.
  Intent pinnedWidgetCallbackIntent = new Intent( ... );

  // Configure the intent so that your app's broadcast receiver gets
  // the callback successfully. This callback receives the ID of the
  // newly-pinned widget (EXTRA_APPWIDGET_ID).
  PendingIntent successCallback = PendingIntent.createBroadcast(context, 0,
          pinnedWidgetCallbackIntent);

  mAppWidgetManager.requestPinAppWidget(myProvider, null,
           successCallback.getIntentSender());
}

Также ознакомьтесь с официальной документацией Google.

person HeyAlex    schedule 12.08.2017