2012-01-12 4 views
9

में मैं अपने खाता प्रबंधक प्रमाणक और सेवा और पूरे सौदा क्रियान्वित किया है और यह सब काम करने ठीक लग रहा है।अस्वीकार से अधिक खातों खाता प्रबंधक

नहीं है, तथापि, एक छोटी सी समस्या: मैं केवल एक ही खाते खाता प्रबंधक में मौजूद करने के लिए अपने अनुप्रयोग के लिए चाहते हैं, लेकिन काफी यह सीमित करने के लिए एक रास्ता खोज नहीं कर पा रहे।

कोई खोज करते हैं और नया खाता जोड़ने से पहले (प्रकार के अनुसार) चालू खातों को हटाने के लिए मेरी एकमात्र समाधान है?

मेरे वर्तमान कोड:

private void removeAccounts() 
{ 
    Account [] accounts = mAcctMgr.getAccountsByType (mAccountType); 

    if (accounts.length == 0) return; 

    final Handler handler = new Handler(); 

    AccountManagerCallback<Boolean> callback = new AccountManagerCallback<Boolean>() 
    { 
     @Override 
     public void run(AccountManagerFuture<Boolean> arg0) 
     { 
      // nada 
     } 
    }; 

    for (Account a : accounts) { 
     mAcctMgr.removeAccount (a, callback, handler); 
    } 
} 

मैं किसी भी तरह से नहीं है इस एक सुरुचिपूर्ण समाधान फोन, लेकिन इस समय केवल एक चीज है कि काम करता है हो रहा है।

+0

खातों को खोजने और हटाने या ओवरराइड करने के खिलाफ क्या बोलता है यदि पहले से ही –

+3

मौजूद है क्योंकि यदि खाते को सीमित करने का कोई तरीका है, तो यह स्पष्ट रूप से * उचित * तरीका होगा। क्या आपने यह किया है? एक खाता लोड करने के बाद फ़ील्ड अंतिम होने पर मैं एक खाता ओवरराइड नहीं कर सकता। हटाना असीमित है और एक इंटरफ़ेस का उपयोग करता है जो सभी दस्तावेज पर नहीं है। इंटरफ़ेस विधि को खाली छोड़ना काम करता प्रतीत होता है, लेकिन स्पष्ट कारणों से मैं ऐसा नहीं करना चाहता हूं। – copolii

+0

मैंने पहले ही खाता प्रबंधक का उपयोग किया है और मुझे खातों को सीमित करने के किसी भी अन्य तरीके से नहीं पता है। मुझे लगता है कि अगर आप पुराने को हटाना चाहते हैं तो उसे एक संवाद के साथ उपयोगकर्ता को संकेत देना चाहिए और फिर उसे एक नया बनाना चाहिए। मुझे नहीं लगता कि ऐसा करने के लिए एक और शानदार तरीका है। –

उत्तर

5

आपके प्रमाणक वर्ग (जिनमें AbstractAccountAuthenticator फैली), सबसे पहले देखें एक खाता मौजूद रहने पर की addAccount समारोह में। यदि कोई खाता पहले से मौजूद है, तो बस शून्य करें (और शायद टोस्ट संदेश दिखाएं)। यदि कोई खाता नहीं है, तो बस बंडल वापस करें जैसे आप पहले कर रहे थे।

 if(AccountHelper.accountExists(mContext)) { 
     mHandler.post(new Runnable() { 

      @Override 
      public void run() { 
       Toast.makeText(mContext, "Only one account allowed", Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     return null; 
    } 
+4

addAccount पर वापस लौट रहा है: "परिणाम अगर प्रतिक्रिया के माध्यम से परिणाम वापस किया जाना है"। आप टोस्ट संदेश को शूट कर सकते हैं लेकिन एक बंडल को इसके साथ वापस करना चाहिए: त्रुटि को इंगित करने के लिए "KEY_ERROR_CODE और KEY_ERROR_MESSAGE"। [सार तत्व खाता प्रमाणीकरणकर्ता] (http://developer.android.com/reference/android/accounts/AbstractAccountAuthenticator.html) – SysHex

+0

मैं कैसे जांचूं कि कोई खाता मौजूद है या नहीं? –

12

प्रति javadocs for addAccount(), अगर एक त्रुटि स्थिति उत्पन्न होती है और ऐसा खाता बनाते हैं, तो आप एक बंडल कि KEY_ERROR_CODE और KEY_ERROR_MESSAGE पैरामीटर शामिल हों लौटना चाहिए,

if (accountExists) { 
     final Bundle result = new Bundle(); 
     result.putInt(AccountManager.KEY_ERROR_CODE, ERROR_CODE_ONE_ACCOUNT_ALLOWED); 
     result.putString(AccountManager.KEY_ERROR_MESSAGE, context.getString(R.string.one_account_allowed)); 

     handler.post(new Runnable() { 

      @Override 
      public void run() { 
       RepeatSafeToast.show(context, R.string.one_account_allowed); 
      } 
     }); 
     return result; 
    } 

रिटर्निंग nullविफलता का मतलब यह नहीं करता है, इसका मतलब है कि परिणाम addAccount() विधि पर प्रतिक्रिया पैरामीटर के माध्यम से संवाद किया जाएगा।

+1

लेकिन, यह 'Toast' – Manjunath

+0

प्रदर्शित नहीं करता है कैसे हो मैं accountExists के लिए ठीक करूं? मुझे नहीं पता कि एंड्रॉइड खाता प्रबंधक में कोई विशेष खाता प्रकार मौजूद है या नहीं। –

0

कि लिंक कैसे एक खाता है, जो आपके अनुरोध renameAccount on developer.Android के बराबर हो सकता है नाम बदलने कहते हैं। हालांकि यह केवल एपीआई-स्तर 21 से उपलब्ध है। अगर किसी को इसे पहले के उपकरणों के लिए बनाने का कोई तरीका मिलता है, तो कृपया साझा करें!