diff options
author | Makoto Onuki <omakoto@google.com> | 2015-02-18 16:02:36 -0800 |
---|---|---|
committer | Makoto Onuki <omakoto@google.com> | 2015-02-18 18:06:00 -0800 |
commit | 6522ca932caf4a4921115a2a3d13068c2357084c (patch) | |
tree | e73f362b2bc899d491f63aad12f9ed72221b2312 /src/com/android/providers/contacts/ContactDirectoryManager.java | |
parent | 0f6927a6946350dcb3031baa9ce1c7575f48307e (diff) | |
download | packages_providers_ContactsProvider-6522ca932caf4a4921115a2a3d13068c2357084c.zip packages_providers_ContactsProvider-6522ca932caf4a4921115a2a3d13068c2357084c.tar.gz packages_providers_ContactsProvider-6522ca932caf4a4921115a2a3d13068c2357084c.tar.bz2 |
Don't use queryContentProviders to avoid "transaction too large" exception
Instead, use getInstalledPackages, which knows how to circumvent the binder
transaction size limit.
Bug 18261831
Change-Id: I2725af045c60a47bfce6eab966a5c745b6c17870
Diffstat (limited to 'src/com/android/providers/contacts/ContactDirectoryManager.java')
-rw-r--r-- | src/com/android/providers/contacts/ContactDirectoryManager.java | 28 |
1 files changed, 19 insertions, 9 deletions
diff --git a/src/com/android/providers/contacts/ContactDirectoryManager.java b/src/com/android/providers/contacts/ContactDirectoryManager.java index f243e79..530a31b 100644 --- a/src/com/android/providers/contacts/ContactDirectoryManager.java +++ b/src/com/android/providers/contacts/ContactDirectoryManager.java @@ -199,6 +199,7 @@ public class ContactDirectoryManager { @VisibleForTesting static boolean isDirectoryProvider(ProviderInfo provider) { + if (provider == null) return false; Bundle metaData = provider.metaData; if (metaData == null) return false; @@ -213,17 +214,26 @@ public class ContactDirectoryManager { static Set<String> getDirectoryProviderPackages(PackageManager pm) { final Set<String> ret = Sets.newHashSet(); - // Note to 3rd party developers: - // queryContentProviders() is a public API but this method doesn't officially support - // the GET_META_DATA flag. Don't use it in your app. - final List<ProviderInfo> providers = pm.queryContentProviders(null, 0, - PackageManager.GET_META_DATA); - if (providers == null) { + final List<PackageInfo> packages = pm.getInstalledPackages(PackageManager.GET_PROVIDERS + | PackageManager.GET_META_DATA); + if (packages == null) { return ret; } - for (ProviderInfo provider : providers) { - if (isDirectoryProvider(provider)) { - ret.add(provider.packageName); + for (PackageInfo packageInfo : packages) { + if (DEBUG) { + Log.d(TAG, "package=" + packageInfo.packageName); + } + if (packageInfo.providers == null) { + continue; + } + for (ProviderInfo provider : packageInfo.providers) { + if (DEBUG) { + Log.d(TAG, "provider=" + provider.authority); + } + if (isDirectoryProvider(provider)) { + Log.d(TAG, "Found " + provider.authority); + ret.add(provider.packageName); + } } } if (DEBUG) { |