2011-12-15 8 views
6

मैं एक कस्टम एंड्रॉइड सिंक एडाप्टर बना रहा हूं और एसडीके उदाहरण "नमूना सिंक एडाप्टर" के बाद एक स्नैग हिट कर रहा हूं। - मैं xml/syncadapter.xml के बराबर बना रहा हूं।Android SyncAdapter सामग्री क्या हैं प्राधिकरण और खाता प्रकार?

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

documentation of AbstractThreadedSyncAdapter कहता है:: यहाँ भागों मैं के बारे में उलझन में हूँ

android:contentAuthority और android:accountType विशेषताओं से संकेत मिलता है कि कौन सी सामग्री अधिकार और जो के लिए खाते प्रकार इस सिंक एडाप्टर कार्य करता है।

प्रलेखन परिपत्र है जिसमें यह कहता है कि नाम कुछ भी आपको पहले से नहीं बताता है। मुझे लगता है कि दोनों मेरी कंपनी के नाम com.acme. से शुरू होंगे लेकिन वहां से मुझे कोई सुराग नहीं है। मुझे संदेह है कि स्ट्रिंग्स कुछ भी हो सकते हैं, जब तक कि वे वैश्विक स्तर पर अनूठे होते हैं ताकि किसी भी अन्य ऐप्स के साथ संघर्ष न किया जा सके जो एक ही डिवाइस पर हो। मुझे लगता है कि इसका मतलब है कि मुझे अपने कोड में कहीं और सटीक तारों का उपयोग करने की आवश्यकता होगी। हालांकि, मैं जानना चाहता हूं, मुझे इन तारों की आवश्यकता होगी ?! मैंने com.android.contacts के लिए grep करने की कोशिश की और पहले उल्लिखित फ़ाइल एकमात्र जगह है जिसका उपयोग किया जाता है, मैं पा सकता हूं। इसलिए यह कहना असंभव है कि उदाहरण को देखकर contentAuthority का उपयोग कैसे किया जाता है।
यदि हां, तो क्या मैं उन्हें दोनों स्ट्रिंग संसाधन में डाल सकता हूं और उन्हें आवश्यक संसाधन आईडी द्वारा संदर्भित कर सकता हूं? वास्तव में ये विशेषताएं क्या हैं और उनका उपयोग कैसे किया जाता है? क्या इन और अन्य क्षेत्रों के लिए अपने आवेदन के लिए मुझे कौन से मूल्य चुनना चाहिए, यह जानने का कोई बेहतर तरीका है?

+0

डुप्लिकेट नहीं है लेकिन संबंधित सवाल [मैं एंड्रॉयड खाता प्रबंधक उपयोग करना चाहिए?] (http://stackoverflow.com/a/8614699/94363) – rds

उत्तर

5

को समझने के लिए क्या अधिकार आप documentation of ContentProvider देखने की जरूरत है:

इसमें कहा गया है:। "यह सामग्री प्रदाता की पहचान करता है तीसरे दल के अनुप्रयोगों के लिए, यह एक पूरी तरह से योग्य वर्ग के नाम होना चाहिए (कम लोअरकेस) विशिष्टता सुनिश्चित करने के लिए। प्राधिकार तत्व के अधिकारियों में घोषित किया जाता है विशेषता "

खाता प्रकार आपके प्रमाणक कि खाता प्रबंधक के ग्राहकों द्वारा उदाहरण के लिए इस्तेमाल किया जाएगा getAccountsByType(String) कॉल करने के लिए की एक identificator है।

SampleSyncAdapter के लिए:

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

एंड्रॉयड: ACCOUNTTYPE प्रमाणक द्वारा परिभाषित किया गया है कि एक के समान है।

तो सामग्री-प्राधिकरण निर्दिष्ट करता है कि कौन सा सामग्री प्रदाता स्थानीय रूप से सिंक्रनाइज़ किया जाएगा और खाता टाइप निर्दिष्ट करता है कि कौन से प्रमाणीकरण का उपयोग डेटा को दूरस्थ रूप से एक्सेस करने के लिए किया जाएगा। खाता टाइप का उपयोग सिंक एडाप्टर की विशिष्ट सामग्री-यूरी प्राप्त करने के लिए भी किया जाता है।

उदाहरण के लिए जब आप एक सिंक आप इस तरह requestSync कॉल करने की आवश्यकता शुरू करना चाहते हैं: एक ही समय में

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

अपना समन्वयन अनुकूलक आप की तरह कुछ का उपयोग कर सकते के लिए सामग्री-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 दस्तावेज़ संशोधित किया गया है। latest version कहता है:

एक अधिकार

एक प्रदाता आमतौर पर एक अधिकार है, जो अपनी एंड्रॉयड-आंतरिक नाम के रूप में पेश करता है डिजाइनिंग। अन्य प्रदाताओं के साथ संघर्ष से बचने के लिए, आप को अपने प्रदाता प्राधिकरण के आधार पर इंटरनेट डोमेन स्वामित्व (रिवर्स में) का उपयोग करना चाहिए। चूंकि यह सिफारिश एंड्रॉइड पैकेज नामों के लिए भी सच है, तो आप प्रदाता युक्त पैकेज के नाम के एक्सटेंशन के रूप में अपने प्रदाता प्राधिकरण को परिभाषित कर सकते हैं। उदाहरण के लिए, यदि आपका एंड्रॉइड पैकेज नाम com.example.<appname> है, तो आप को अपने प्रदाता को com.example.<appname>.provider देना चाहिए।

+0

मुझे नहीं लगता कि यह सही है। यहाँ पर क्यों। एक पूर्ण योग्य क्लास नाम का उपयोग करना जो लोअरकेस है नोटपैड उदाहरण AUTHORITY ("com.google.provider.NotePad") के विपरीत है। सामग्री प्राधिकरण सिंक एडाप्टर के लिए है। पूरी तरह से योग्य नाम में "प्रदाता" और न ही पूंजीकृत नोटपैड शामिल नहीं होगा। – Mitch

+0

"तीसरे पक्ष के अनुप्रयोगों के लिए ..."। इसका मतलब है कि यह अजीब बात नहीं है कि नोटपैड पूंजी अक्षरों का उपयोग करता है। – kingston

+0

और कृपया इसे देखें: http://stackoverflow.com/questions/4649808/syncadapter-without-a-contentprovider – kingston

0

एंड्रॉयड: अधिकारियों आपके प्रकट में अपने प्रदाता घोषणा के लिए विशेषता: अपने SyncAdapter मेटा डेटा फ़ाइल syncadapter.xml में contentAuthority विशेषता एंड्रॉयड मेल खाना चाहिए। इस ऐप को अपने ऐप का पैकेज नाम स्ट्रिंग ".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"/> 
संबंधित मुद्दे