Android 4.0:小部件没有出现?

我有一个针对Android 2.1创build的小部件,在市场上销售很好。

我有一个用户抱怨说,他买了它,它从来没有出现在他的Android 4.0设备上。

我加载了4.0模拟器,从Eclipse运行它,它报告了一个成功的安装,事实上,我可以看到它列在“Widget预览”应用程序,我可以在那里运行,似乎很好,但它不显示在“小工具”下的任何地方 – 我实际上找不到它把它拖到主屏幕! 我认为这是用户看到的相同的东西。

任何想法发生了什么? 为什么在2.1版本中可以正常工作,即使在安装成功之后也不会在4.0的列表中显示出来。

这是我的layout \ widget.xml文件,如果有任何帮助:

<RelativeLayout android:id="@+id/relativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <TextView android:layout_width="wrap_content" android:id="@+id/blankspot" android:layout_height="5dp" android:gravity="center" android:shadowDy="1" android:shadowDx="1" android:layout_centerHorizontal="true"></TextView> <ImageButton android:layout_below="@+id/blankspot" android:layout_width="60dp" android:layout_height="60dp" android:id="@+id/widgetIconButton" android:layout_centerHorizontal="true" android:scaleType="centerCrop" android:src="@drawable/volumeprofilesplus" android:background="@null"></ImageButton> <ImageView android:layout_width="60dp" android:layout_height="20dp" android:id="@+id/override" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:scaleType="fitXY" android:background="@null" android:src="@drawable/overredcaps" android:visibility="invisible"></ImageView> <ImageButton android:layout_below="@+id/widgetIconButton" android:layout_width="70dp" android:layout_height="30dp" android:id="@+id/widgetSettingsButton" android:layout_centerHorizontal="true" android:scaleType="fitXY" android:src="@drawable/settings" android:background="@null"></ImageButton> </RelativeLayout> 

和xml \ widget_provider.xml:

 <?xml version="1.0" encoding="utf-8"?> <appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="72dip" android:minHeight="72dip" android:updatePeriodMillis="0" android:initialLayout="@layout/main" > </appwidget-provider> 

所以这里是我提出的解决scheme:

你需要一个将会出现在启动器上的活动。 所以首先我们有一个小部件接收器,像这样:

 <receiver android:name=".VolumeProfilesWidget" android:label="@string/app_name"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <!-- Broadcast Receiver that will also process our self created action --> <action android:name="net.thepurge.volumeprofiles.plus.VolumeProfilesWidget.ACTION_WIDGET_RECEIVER"/> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/volumeprofiles_widget_provider" /> </receiver> 

然后我们需要一些活动,MAIN和LAUNCHER设置:

 <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <action android:name="net.thepurge.volumeprofiles.plus.VolumeProfilesWidget.ACTION_WIDGET_CONFIGURE"/> </intent-filter> </activity> 

据我可以告诉你,即使你的小部件只是一个没有关联活动的纯粹的小部件,也必须这样做。 至less,做一个虚拟的活动,启动一个屏幕,说:“你的小工具现在已经可以使用了!在小工具下查找并拖动到主屏幕!

在我的例子中,我的小部件在推送时启动了一个活动,所以我把这个活动变成了LAUNCHER / MAIN,并且只是添加了一个一次性的popup对话框,基本上说“你可以运行它作为一个应用程序,但你可能想使用小部件而不是“。

请注意,在4.0模拟器上,我从来没有让我的小部件在第一次安装之前显示出来。 简单地将一个活动设置为MAIN和LAUNCHER似乎足以使小部件显示出来。

几天后,我想出了解决scheme

所以让我们去你的任何活动,这将是你打开应用程序时启动,在主要活动只添加这一行

sendBroadcast(new Intent(Intent.ACTION_MAIN).addCategory(Intent.CATEGORY_HOME));

作为例子

 public class Default class extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); sendBroadcast(new Intent(Intent.ACTION_MAIN) .addCategory(Intent.CATEGORY_HOME)); setContentView(R.layout.main); } 

就是这样,这将使系统,现在主应用程序正在运行,它会得到的部件到发射器:)简单的线条,它不会修改清单中的任何东西只是保持开发你的应用程序,显示窗口小部件通常在以前的版本<4.x

有同样的问题。 我通过删除我的appwidgetprovider.xml(located in res/xml) <PreferenceScreen>标记来修复它。

您需要手动启动关联的应用程序至less一次才能显示小部件。 在此之前,它处于不可运行状态,不会收到广播等。

我的解决scheme(4.1.2上的Widget)确保小部件安装在内部设备存储上。

根据: Android文档:安装位置 ,您不应该在外部存储上安装小部件。

我不得不卸载我的小工具,再次安装,之后我看到了变化!

有用的链接:

http://www.technipages.com/fix-android-app-widgets-not-appearing-on-widget-list