Nun, ich habe es geschafft, den Code zu machen, der funktioniert (außer es sollte und kann nicht so einfach arbeiten - Details sind unten).
Der Code, der arbeiten sollte, ist:
//create ComponentName for accesing the widget provider
ComponentName cn = new ComponentName("com.android.quicksearchbox", "com.android.quicksearchbox.SearchWidgetProvider");
//ComponentName cn = new ComponentName("com.android.music", "com.android.music.MediaAppWidgetProvider");
//get appWidgetManager instance
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(getBaseContext());
//get list of the providers - .getAppWidgetIds (cn) does seem to be unrelated to widget hosting and more related to widget development
final List<AppWidgetProviderInfo> infos = appWidgetManager.getInstalledProviders();
//get AppWidgetProviderInfo
AppWidgetProviderInfo appWidgetInfo = null;
//just in case you want to see all package and class names of installed widget providers, this code is useful
for (final AppWidgetProviderInfo info : infos) {
Log.v("AD3", info.provider.getPackageName() + "/"
+ info.provider.getClassName());
}
//iterate through all infos, trying to find the desired one
for (final AppWidgetProviderInfo info : infos) {
if (info.provider.getClassName().equals(cn.getClassName()) && info.provider.getPackageName().equals(cn.getPackageName())) {
//we found it
appWidgetInfo = info;
break;
}
}
if (appWidgetInfo == null)
return; //stop here
//allocate the hosted widget id
int appWidgetId = myWidgetHost.allocateAppWidgetId();
//bind the id and the componentname - here's the problem!!!
appWidgetManager.bindAppWidgetId(appWidgetId, cn);
//creat the host view
AppWidgetHostView hostView = myWidgetHost.createView(getBaseContext(), appWidgetId, appWidgetInfo);
//set the desired widget
hostView.setAppWidget(appWidgetId, appWidgetInfo);
//add the new host view to your activity's GUI
LinearLayout ll = (LinearLayout) findViewById(R.id.ll);
ll.addView(hostView);
Nun, das Problem ist "appWidgetManager.bindAppWidgetId (appWidgetId, cn);" - dies erfordert die BIND_APPWIDGET Genehmigung - im Manifest. - auch wenn wir sagen, es wird immer noch nicht funktionieren. Ich lese es kann für System-Anwendungen reserviert sein
Allerdings, auch nach dem Hinzufügen der Erlaubnis und das Veröffentlichen der apk im System/App-Ordner, es funktioniert immer noch nicht (es macht es nicht zu einer System-App).
Im Hinblick auf dieses Problem, das ich diese Antwort here gefunden:
Diese Anwendungen absichtlich nicht zur Verfügung steht. Wenn Sie ein Widget hinzufügen möchten, müssen Sie die Auswahl-UI für den Benutzer starten, um das Widget auszuwählen, das dann für die Bindung sorgt. Widgets können viele private Daten aller Typen aussetzen, so dass es nicht sicher ist, eine Anwendung zu erlauben, willkürlich an sie zu binden, ohne dass der Benutzer implizit zustimmt (über die Auswahl-UI).
Dianne ... Android Framework Ingenieur
Ich bin aber unsicher, aber, vielleicht bedeutet dies, was wir konnten die gewünschte Funktionalität erreichen, wenn wir die apk mit dem Bild Entwickler Schlüssel unterschreiben könnten? Das ist jedoch das Thema der Frage. Wenn Sie mir jedoch erklären können, wie Sie AppWidgets effizient hosten können, lassen Sie bitte Ihre Antwort von mir akzeptieren (Launcher-Anwendungen auf dem Markt können das tun, also muss es möglich sein).
Dank! Das war sehr nützlich! :) –
Above Code zeigen nur das Widget, aber es kann auf Benutzer-Klick ohne appWidgetManager.bindAppWidgetId nicht responed(); – herbertD
Aber 'appWidgetManager.bindAppWidgetId();' kann nur von einer System-App ausgeführt werden, oder? Sogar ich suche nach einer Arbeit dafür, kannst du helfen? –