我们正在尝试在我们自己的应用程序中托管第三方窗口小部件,我们正在尝试弄清楚如何在我们的应用程序安装时添加它,而无需用户需要从“选择窗口小部件”列表中选择它。原因是,我们的客户需要他们的用户选择这个特定的小部件(我们试图将代码分开,以便他们可以自己在我们的应用程序内更新这个特定的小部件),而且它不是一个很好的用户体验。用户可以偶然选择不同的一个。有没有办法过滤Select Widget列表呢?或者只是让它显示我们需要它展示的那个?既然我们可以访问这个第三方小部件的源代码,那会有帮助吗?
到目前为止,我们可以告诉我们将小部件添加到小部件主机的唯一方法是分配一个id,运行ACTION.APPWIDGET_PICK,用户可以从那里选择..但我们确实需要来找到一种方法,以某种方式过滤该列表,或者在安装我们的应用程序(主机)时安装此第三方小部件。
有什么想法吗?
谢谢!
答案 0 :(得分:0)
您无法过滤列表,也无法在没有用户点击的情况下安装该应用。但是你可以检查用户选择的结果,如果他们选择了错误的Widget,就拒绝它......
答案 1 :(得分:0)
这是您在没有选择窗口小部件列表的情况下在应用程序中嵌入窗口小部件的方法。用户只会看到确认对话框。
public boolean createWidget(View view, String packageName, String className) {
// Get the list of installed widgets
AppWidgetProviderInfo newAppWidgetProviderInfo = null;
List<AppWidgetProviderInfo> appWidgetInfos;
appWidgetInfos = mAppWidgetManager.getInstalledProviders();
boolean widgetIsFound = false;
for(int j = 0; j < appWidgetInfos.size(); j++)
{
if (appWidgetInfos.get(j).provider.getPackageName().equals(packageName) && appWidgetInfos.get(j).provider.getClassName().equals(className))
{
// Get the full info of the required widget
newAppWidgetProviderInfo = appWidgetInfos.get(j);
widgetIsFound = true;
break;
}
}
if (!widgetIsFound) {
return false;
} else {
// Create Widget
int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
AppWidgetHostView hostView = mAppWidgetHost.createView(getApplicationContext(), appWidgetId, newAppWidgetProviderInfo);
hostView.setAppWidget(appWidgetId, newAppWidgetProviderInfo);
// Add it to your layout
LinearLayout widgetLayout = view.findViewById(R.id.widget_view);
widgetLayout.addView(hostView);
// And bind widget IDs to make them actually work
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
boolean allowed = mAppWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, newAppWidgetProviderInfo.provider);
if (!allowed) {
// Request permission - https://stackoverflow.com/a/44351320/1816603
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, newAppWidgetProviderInfo.provider);
final int REQUEST_BIND_WIDGET = 1987;
startActivityForResult(intent, REQUEST_BIND_WIDGET);
}
}
return true;
}
}