5

カスタム ContentProvider を [データと同期] の下に表示しようとしていますが、いくつかの問題が発生しています。つまり、表示されません。

詳細:

私の AndroidManifest.xml にはプロバイダーとサービスがあります。

<provider android:name="BooksProvider"
    android:label="ClientName Books"
    android:authorities="com.clientname.reader.books"
    android:enabled="true"
    android:exported="true"
    android:syncable="true">
    <grant-uri-permission android:pathPattern=".*" />
</provider>
<service android:name=".sync.SyncService"
     android:exported="true" android:process=":sync">
    <intent-filter>
        <action android:name="android.content.SyncAdapter" />
    </intent-filter>
    <meta-data android:name="android.content.SyncAdapater"
         android:resource="@xml/syncadapter" />
</service>

res/xml/syncadapter.xml には次の内容があります。

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
     android:contentAuthority="com.clientname.reader.books"
     android:accountType="com.google"
     android:supportsUploading="true"
     android:userVisible="true"
/>

安全のために、onCreate で次のように呼び出しました。

AccountManager accountManager = AccountManager.get(getApplicationContext());
Account[] accounts = accountManager.getAccountsByType("com.google");
for(Account account : accounts){
    Log.d(TAG, "Account: " + account.name);
    ContentResolver.setIsSyncable(account, Reader.AUTHORITY, 1);
}

アクティビティをロードすると、ContentResolver.setIsSyncable から adb ログが取得され、アカウントは既に同期可能に設定されているため、メソッドは何も実行していません。

それでも、プロバイダ[設定] > [アカウントと同期] > [データと同期] に表示されません。理由についてのアイデアはありますか?そのセクションに何が表示されるかをどのように決定するか知っている人はいますか?

[編集] いくつかの詳細情報:

デバッグに何時間も費やした後、次のエラーに遭遇しました。

04-11 10:46:02.370: DEBUG/SyncManager(105): can't find a sync adapter for SyncAdapterType Key {name=com.clientname.reader.books, type=com.google}, removing settings for it

また、私の SyncService クラスが実際に呼び出されることはないようです。私はそれを自分で呼び出すことになっていますか?私が見たサンプルや野生のアプリケーションはそれ自体を呼び出しませんが、それらにはすべて認証コンポーネントもあります。考え?

4

3 に答える 3

4
<meta-data android:name="android.content.SyncAdapater"
     android:resource="@xml/syncadapter" />

他の誰かが答えに気づいていますか?

神よ、私は馬鹿になるのが嫌いです。

于 2011-04-12T05:18:14.703 に答える
3

そのため、セマンティクスの観点から、プロバイダーは Accounts & Sync に直接表示されません。代わりに、アカウントが表示され、詳細ページにプロバイダーが表示されます。SyncAdapter を com.google スタイルのアカウントにバインドしているため、同期アダプターは Google アカウント内に表示されます。「連絡先」、「カレンダー」、「Gmail」と並んで、「ClientName Books」が表示されます。

ただし、実際の問題は XML です。AndroidManifest.xml docsごとに、

android:name

サービスを実装する Service サブクラスの名前。これは、完全修飾クラス名 (「com.example.project.RoomService」など) である必要があります。ただし、省略形として、名前の最初の文字がピリオド (「.RoomService」など) の場合、.RoomService で指定されたパッケージ名に追加されます。

BooksProviderしたがって、パッケージを介した FQCN または相対パスが必要なため、クラスが見つからないようです。

于 2011-04-13T11:47:30.493 に答える
2

最終的にわかったように、ContentProvider が [同期設定] 画面に表示されない別の理由は、マニフェストにandroid.permission.WRITE_SYNC_SETTINGS権限がないためです。残念ながら、私が読んだすべてのチュートリアル、記事、およびドキュメントは、この点を見逃しているか、明示的に概説されていません。さらに、プラットフォーム (API レベル 13 でテスト済み) は、いかなる形式の許可例外もスローしていないようです。これを修正してほしいと願っています。うまくいけば、これは誰かを助けます。

于 2011-12-07T02:47:28.727 に答える