今天在测试Android中的一个方法遇到这样一个问题:
/**
* Find a single content provider by its base path name.
*
* @param name The name of the provider to find.
* @param flags Additional option flags. Currently should always be 0.
*
* @return ContentProviderInfo Information about the provider, if found,
* else null.
*/
public abstract ProviderInfo resolveContentProvider(String name,
int flags);
这是android源码中对resolveContentProvider的解释,其中对name的说明是The name of the provider to find。
很明确,说是provider的名字,结果我传了一个已经存在的provider的名字,根本就获取不到ProviderInfo。
看了一下resolveContentProvider的实现,
ApplicationPackageManager.java
public ProviderInfo resolveContentProvider(String name,
int flags) {
try {
return mPM.resolveContentProvider(name, flags, mContext.getUserId());
} catch (RemoteException e) {
throw new RuntimeException("Package manager has died", e);
}
}
调用了PackageManagerService的resolveContentProvider
PackageManagerService.java
public ProviderInfo resolveContentProvider(String name, int flags, int userId) {
if (!sUserManager.exists(userId)) return null;
// reader
synchronized (mPackages) {
final PackageParser.Provider provider = mProviders.get(name);
PackageSetting ps = provider != null
? mSettings.mPackages.get(provider.owner.packageName)
: null;
return ps != null
&& mSettings.isEnabledLPr(provider.info, flags, userId)
&& (!mSafeMode || (provider.info.applicationInfo.flags
&ApplicationInfo.FLAG_SYSTEM) != 0)
? PackageParser.generateProviderInfo(provider, flags,
ps.readUserState(userId), userId)
: null;
}
}
调试发现通过mProviders.get(name)返回的null,拿不到对应名字的provider。
把mProviders中的所有key值打印出来,发现里面的key值存储的根本不是provider的名字,而是provider的authorities。
用authorities做了一下测试,果然没问题了。