您的位置:首页 > 其它

系统开启桌面小部件支持

2016-05-18 13:47 369 查看
发现用的这块开发板挺坑的,刚确认原来是系统不支持桌面小部件,之前一直认为是同事开发的桌面APP有问题。。。

那么问题来了就解决吧,搜索没搜索到答案,就记录下跟踪记录吧。

获取小部件集合代码:

List<AppWidgetProviderInfo> widgetProviderInfos = AppWidgetManager.getInstance(this).getInstalledProviders();
查找AppWidgetManager类实现文件:

/frameworks/base/core/java/android/appwidget/AppWidgetManager.java

getInstalledProviders方法调用了

getInstalledProviders(AppWidgetProviderInfo.WIDGET_CATEGORY_HOME_SCREEN);方法

在该方法中是通过

List<AppWidgetProviderInfo> providers = sService.getInstalledProviders(categoryFilter, mContext.getUserId());

获取支持的小部件集合。跟踪getInstalledProviders方法,实现文件:

/frameworks/base/services/java/com/android/server/AppWidgetService.java

该方法中调用

getImplForUser(userId).getInstalledProviders(categoryFilter);获取集合

getInstalledProviders(categoryFilter)在

/frameworks/base/services/java/com/android/server/AppWidgetServiceImpl.java

中实现,在该方法中有一段代码比较重要

if (!mHasFeature) {

return new ArrayList<AppWidgetProviderInfo>(0);

}

现实情况是进入到了该条件中,那么mHasFeature从哪里获取到的呢?

在AppWidgetServiceImpl实例化方法中对该值进行了初始化

mHasFeature = context.getPackageManager().hasSystemFeature(

PackageManager.FEATURE_APP_WIDGETS);

继续跟踪,发现hasSystemFeature方法在/frameworks/base/services/java/com/android/server/pm/PackageManagerService.java

中进行了实现,return mAvailableFeatures.containsKey(name);

mAvailableFeatures为一个哈希表集合,查找添加特性的方法

readPermissionsFromXml(File permFile)该方法里调用了添加特性方法,找到这里就差不多了感觉,应该是读取系统配置文件了,

继续查找发现该方法被readPermissions方法调用,读取/system/etc/permissions目录下的xml文件,到该目录下看了看的确定义了

一些特性,但未发现有android.software.app_widgets特性,到这里基本就到头了,下面就是如何将该特性添加到配置文件中了,

本来我是不知道如何添加的,但我有Android手机,而且ROOT了,那么我就有参考了,将手机里的permissions目录复制出来,查找,

在handheld_core_hardware.xml问价中找到了该特性的设置,然后我就在我的工程中搜索相似文件,因为我做的是类平板系统,发现了

tablet_core_hardware.xml文件,在该文件中添加android.software.app_widgets特性,编译,烧写,OK~!

说明下tablet_core_hardware.xml文件一般是存放于/frameworks/native/data/etc/t目录下,但有定制的有可能放在device等其他目录下,

所以还是要确认好了具体是哪个文件生效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: