我一直在努力创建Android的ContactsProvider副本。我想对提供商进行最小的更改,因为我的大部分工作都将在另一个将使用数据的应用程序中。但是,我想确保我正在制作的应用程序无法访问真正的联系人,因此我计划创建提供者的副本。在成功导航创建具有不同权限的副本提供程序的过程后,我尝试调用我复制的提供程序。此时我遇到了两个错误。
第一个是在我自己的应用程序中,我收到错误"无法找到' ContentProvider'"我读了this的答案,但我已经处理了这里提到的所有事情。
第二个错误发生在我的提供程序中: java.lang.NoClassDefFoundError:com.google.common.collect.ImmutableSet $ Builder 这可能是我收到第一个错误的原因。因为我的提供商永远无法访问Android内部的类,所以它没有被注册为有效的提供者,因此我的应用程序无法找到"提供者。
这是ContactManager的我的清单文件: -
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.prajitdas.contactmanager"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="18"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.prajitdas.contactmanager.ContactManager"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="ContactAdder" android:label="@string/addContactTitle">
</activity>
</application>
</manifest>
和ContactsProvider的清单文件: -
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.prajitdas.android.providers.contacts"
android:versionCode="2"
android:versionName="2.0">
<permission
android:name="com.android.voicemail.permission.READ_WRITE_ALL_VOICEMAIL"
android:label="@string/read_write_all_voicemail_label"
android:description="@string/read_write_all_voicemail_description"
android:permissionGroup="android.permission-group.PERSONAL_INFO"
android:protectionLevel="system|signature"
/>
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.BIND_DIRECTORY_SEARCH" />
<uses-permission android:name="android.permission.UPDATE_APP_OPS_STATS" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="com.android.voicemail.permission.ADD_VOICEMAIL" />
<uses-permission android:name="com.android.voicemail.permission.READ_WRITE_ALL_VOICEMAIL" />
<application android:process="android.process.acore"
android:label="@string/app_label"
android:icon="@drawable/app_icon"
android:allowBackup="true">
<!-- Modified provider authority -->
<provider android:name="ContactsProvider2"
android:authorities="fakecontacts;com.prajitdas.android.providers.contacts"
android:label="@string/provider_label"
android:multiprocess="false"
android:exported="true"
android:readPermission="android.permission.READ_CONTACTS"
android:writePermission="android.permission.WRITE_CONTACTS">
<path-permission
android:pathPrefix="/search_suggest_query"
android:readPermission="android.permission.GLOBAL_SEARCH" />
<path-permission
android:pathPrefix="/search_suggest_shortcut"
android:readPermission="android.permission.GLOBAL_SEARCH" />
<path-permission
android:pathPattern="/contacts/.*/photo"
android:readPermission="android.permission.GLOBAL_SEARCH" />
<grant-uri-permission android:pathPattern=".*" />
</provider>
<provider android:name="CallLogProvider"
android:authorities="fakecall_log"
android:syncable="false" android:multiprocess="false"
android:exported="true"
android:readPermission="android.permission.READ_CALL_LOG"
android:writePermission="android.permission.WRITE_CALL_LOG">
</provider>
<provider android:name="VoicemailContentProvider"
android:authorities="com.prajitdas.android.voicemail"
android:syncable="false" android:multiprocess="false"
android:exported="true"
android:permission="com.android.voicemail.permission.ADD_VOICEMAIL">
</provider>
<!-- Handles database upgrades after OTAs, then disables itself -->
<receiver android:name="ContactsUpgradeReceiver">
<!-- This broadcast is sent after the core system has finished
booting, before the home app is launched or BOOT_COMPLETED
is sent. -->
<intent-filter>
<action android:name="android.intent.action.PRE_BOOT_COMPLETED"/>
</intent-filter>
</receiver>
<receiver android:name="PackageIntentReceiver">
<intent-filter>
<action android:name="android.intent.action.PACKAGE_ADDED" />
<data android:scheme="package" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REPLACED" />
<data android:scheme="package" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_REMOVED" />
<data android:scheme="package" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.PACKAGE_CHANGED" />
<data android:scheme="package" />
</intent-filter>
</receiver>
<receiver android:name="LocaleChangeReceiver">
<intent-filter>
<action android:name="android.intent.action.LOCALE_CHANGED"/>
</intent-filter>
</receiver>
<service android:name="VoicemailCleanupService"/>
<activity android:name=".debug.ContactsDumpActivity"
android:label="@string/debug_dump_title"
android:theme="@android:style/Theme.Holo.Dialog"
>
<intent-filter>
<action android:name="com.prajitdas.android.providers.contacts.DUMP_DATABASE"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
<provider android:name=".debug.DumpFileProvider"
android:authorities="com.prajitdas.android.providers.contacts.dumpfile"
android:exported="true">
</provider>
</application>
</manifest>
如您所见,我基本上已复制原始清单文件并将其修改为我的提供商的新权限。我已经为java代码做了同样的事情,但它太大了,不能在这里发布。如果有人可以帮助我确定步骤,以使Android内部调用工作或可能解决第一个问题&#34;注册&#34;非常感谢电话提供商,非常感谢。
答案 0 :(得分:1)
com.google.common.collect.ImmutableSet $ Builder 实际上并非内部Android类。它是Google Guava库的一部分。您需要添加Guava的JAR作为项目的依赖项来编译它(可能还有其他一些依赖项,请检查其Android.mk中的ContactsProvider列表)。
添加JAR依赖项的实际方式取决于您用于构建应用程序的内容(例如Ant,Maven,Gradle或Eclipse)。