注册内容提供商

时间:2014-06-18 01:40:13

标签: android

我一直在努力创建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;非常感谢电话提供商,非常感谢。

1 个答案:

答案 0 :(得分:1)

com.google.common.collect.ImmutableSet $ Builder 实际上并非内部Android类。它是Google Guava库的一部分。您需要添加Guava的JAR作为项目的依赖项来编译它(可能还有其他一些依赖项,请检查其Android.mk中的ContactsProvider列表)。

添加JAR依赖项的实际方式取决于您用于构建应用程序的内容(例如Ant,Maven,Gradle或Eclipse)。