6

カスタム Android SyncAdapter を作成していますが、SDK の例「SampleSyncAdapter」に従って問題が発生しました。- に相当するものを作成していxml/syncadapter.xmlます。ここに私が混乱している部分があります:

android:contentAuthority="com.android.contacts"
android:accountType="com.example.android.samplesync"

AbstractThreadedSyncAdapterのドキュメントには次のように記載されています。

android:contentAuthorityおよび属性は、android:accountTypeこの同期アダプターが提供するコンテンツの権限とアカウントの種類を示します。

ドキュメンテーションは循環的で、名前がすでに伝えていないことは何も述べていません。どちらも私の会社名で始まる印象がcom.acme.ありますが、そこからはわかりません。同じデバイス上にある可能性のある他のアプリと競合しないように、文字列がグローバルに一意である限り、文字列は何でもかまいません。これは、コードの他の場所でこれらの正確な文字列を使用する必要があることを意味すると思います。しかし、知りたいのですが、これらの文字列がどこで必要になるのでしょうか?! 私はgrepを試みましたcom.android.contactsが、前述のファイルが使用されている唯一の場所であり、見つけることができます。contentAuthorityしたがって、例を見ても がどのように使用されているかを判断することは不可能です。
もしそうなら、両方を文字列リソースに入れて、必要に応じてリソース ID で参照できますか? これらの属性とは正確には何で、どのように使用されるのでしょうか? これらのフィールドやその他のフィールドのアプリケーションで、どの値を選択する必要があるかを判断するためのより良い方法はありますか?

4

2 に答える 2

5

権限が何であるかを理解するには、 ContentProviderのドキュメントを参照する必要があります。

「コンテンツプロバイダーを識別します。サードパーティアプリケーションの場合、一意性を確保するために、これは完全修飾クラス名 (小文字に変換) にする必要があります。権限は、要素の権限属性で宣言されます」

アカウント タイプは、たとえばAccountManagerのクライアントがを呼び出すために使用される、Authenticator の識別子ですgetAccountsByType(String)

SampleSyncAdapterの場合:

android:contentAuthority="com.android.contacts"
android:accountType="com.example.android.samplesync"

android:accountType は、オーセンティケーターによって定義されたものと同じです。

したがって、content-Authority は、ローカルで同期されるコンテンツ プロバイダーを指定し、accountType は、データへのリモート アクセスに使用されるオーセンティケーターを指定します。accountType は、同期アダプターの特定の content-uri を取得するためにも使用されます。

たとえば、同期を開始する場合は、次のようにrequestSyncを呼び出す必要があります。

final Account account = new Account(accountName, ACCOUNT_TYPE);
ContentResolver.requestSync(account, CONTENT_AUTHORITY, new Bundle());

同時に、同期アダプターの content-uri を構築するには、次のようなものを使用できます。

Uri CONTENT_URI = ContactsContract.RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(RawContacts.ACCOUNT_NAME, accountName).appendQueryParameter(RawContacts.ACCOUNT_TYPE, SyncAdapter.ACCOUNT_TYPE).build();

android-sync-adapterをご覧ください


一方、前述の ContentProvider ドキュメントは改訂されています。最新版には次のように記載されています。

権限の設計

プロバイダーには通常、Android 内部名として機能する単一の機関があります。他のプロバイダーとの競合を避けるために、インターネット ドメインの所有権を (逆に) プロバイダー権限の基礎として使用する必要があります。この推奨事項は Android パッケージ名にも当てはまるため、プロバイダー権限を、プロバイダーを含むパッケージの名前の拡張子として定義できます。たとえば、Android パッケージ名がcom.example.<appname>の場合、プロバイダに権限を与える必要があります com.example.<appname>.provider

于 2011-12-15T20:43:20.513 に答える
0

SyncAdapter メタデータ ファイル syncadapter.xml の android:contentAuthority 属性は、マニフェストのプロバイダー宣言の android:authorities 属性と一致する必要があります。この値を、文字列「.provider」を追加したアプリのパッケージ名にします。これは、Android の開発者サイトhttp://developer.android.com/training/sync-adaptersからのものです。

だからあなたのマニフェストで:

<provider
    android:name="com.example.android.datasync.provider.StubProvider"
    android:authorities="com.example.android.datasync.provider"
    android:exported="false"
    android:syncable="true"/>

そしてあなたのsyncadapter.xmlで

<sync-adapter
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:contentAuthority="com.example.android.datasync.provider"
    android:accountType="com.android.example.datasync"
    android:userVisible="false"
    android:supportsUploading="false"
    android:allowParallelSyncs="false"
    android:isAlwaysSyncable="true"/>
于 2014-12-08T15:53:14.557 に答える