Я создаю пользовательский Launcher на основе Launcher 3. Я хочу добавить виджет на домашний экран Launcher при установке Launcher, но избегайте диалогового окна разрешения привязки. Launcher 3 предоставляет файл default_launcher.xml, куда вы можете поместить Тег appwidget, но он удаляет appwidgetid в методе AppWidgetParser defaultLayoutparser из-за «ложного» возврата из bindAppWidgetIdIfAllowed. Как добавить предварительно сконфигурированный виджет на домашний экран Launcher
Класс AppWidgetParser расширяет PendingWidgetParser {
protected long verifyAndInsert(ComponentName cn, Bundle extras) {
try {
mPackageManager.getReceiverInfo(cn, 0);
} catch (Exception e) {
String[] packages = mPackageManager.currentToCanonicalPackageNames(
new String[] { cn.getPackageName() });
cn = new ComponentName(packages[0], cn.getClassName());
try {
mPackageManager.getReceiverInfo(cn, 0);
} catch (Exception e1) {
Log.d(TAG, "Can't find widget provider: " + cn.getClassName());
return -1;
}
}
final AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(mContext);
long insertedId = -1;
try {
int appWidgetId = mAppWidgetHost.allocateAppWidgetId();
if (!appWidgetManager.bindAppWidgetIdIfAllowed(appWidgetId, cn)) {
Log.e(TAG, "Unable to bind app widget id " + cn);
mAppWidgetHost.deleteAppWidgetId(appWidgetId);// here it removes the appWidgetId
return -1;
}
mValues.put(Favorites.APPWIDGET_ID, appWidgetId);
mValues.put(Favorites.APPWIDGET_PROVIDER, cn.flattenToString());
mValues.put(Favorites._ID, mCallback.generateNewItemId());
insertedId = mCallback.insertAndCheck(mDb, mValues);
if (insertedId < 0) {
mAppWidgetHost.deleteAppWidgetId(appWidgetId);
return insertedId;
}
// Send a broadcast to configure the widget
if (!extras.isEmpty()) {
Intent intent = new Intent(ACTION_APPWIDGET_DEFAULT_WORKSPACE_CONFIGURE);
intent.setComponent(cn);
intent.putExtras(extras);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
mContext.sendBroadcast(intent);
}
} catch (RuntimeException ex) {
Log.e(TAG, "Problem allocating appWidgetId", ex);
}
return insertedId;
}
}