2014-06-18 200 views
0

我一直在嘗試創建一個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內部通話起作用的步驟,或者可能解決第一個以某種方式在手機上「註冊」提供商的問題,那麼將非常感激。

回答

1

com.google.common.collect.ImmutableSet $ Builder實際上並不是一個內部Android類。它是Google的Guava圖書館的一部分。您需要將Guava的JAR作爲依賴項添加到項目中以編譯它(並且可能還有其他一些依賴項,請檢查Android.mk中ContactsProvider的列表)。

添加JAR依賴項的實際方法因構建應用程序(例如Ant,Maven,Gradle或Eclipse)而有所不同。