2012-11-23 6 views
7

क्या यह जांचने का कोई तरीका है कि क्या उपयोगकर्ता ने जीसीएम पंजीकरण प्रक्रिया API 8 शुरू करने से पहले अपने डिवाइस पर अपना Google खाता जोड़ा है?जीसीएम प्रक्रिया शुरू करने से पहले उपयोगकर्ताओं को Google खाते को डिवाइस पर जोड़ा गया है या नहीं?

जब इसके बिना पंजीकरण करने का प्रयास किया जाता है तो ऐप बंद होने पर अप्रत्याशित रूप से चेतावनी देता है, इसलिए पहले जांचना, उपयोगकर्ता को सतर्क करना और ऐप बंद करना।

+0

'GCMRegistrar.checkDevice (यह) है,' इस परिदृश्य को संभाल नहीं करता है? – CommonsWare

+0

जहाँ तक मुझे पता है कि यह केवल जांचता है कि डिवाइस जीसीएम का समर्थन करता है, खाते को नियंत्रित नहीं करता ... – Harry

+0

ठीक है, अब, यह बदबू आ रही है। संभावित रूप से 'खाता प्रबंधक' के माध्यम से यह पता लगाने के लिए एक तरीका है कि कोई Google खाता है या नहीं, लेकिन मैंने अभी तक इसमें से किसी के साथ नहीं खेला है। – CommonsWare

उत्तर

16

मैंने चेकडिवाइस() के स्रोत पर एक नज़र डाली थी और जहां तक ​​मैं इसे देख सकता हूं केवल एपीआई स्तर की जांच करता है और यह कि जीसीएम पैकेज डिवाइस पर है। तो CommonsWare के सुझाव से पर निम्नलिखित, इस कोड मेरे लिए काम करने के लिए प्रकट होता है:

private boolean deviceHasGoogleAccount(){ 
     AccountManager accMan = AccountManager.get(this); 
     Account[] accArray = accMan.getAccountsByType("com.google"); 
     return accArray.length >= 1 ? true : false; 
} 

आप प्रकट

+0

धन्यवाद, मैं इसकी भी जांच करूंगा और वापस आऊंगा ... – Harry

+0

आपका समाधान काम करता है, हॉलैंड से धन्यवाद! – Harry

+1

एपीआई 23 और ऊपर में आपको रनटाइम पर अनुमतियों के लिए पूछने की आवश्यकता है और न केवल इसे मैनिफेस्ट – RPM

0

में लाइन

<uses-permission android:name="android.permission.GET_ACCOUNTS" /> 

की आवश्यकता होगी कैसे पकड़ने के लिए के बारे में अपने प्रश्न के लिए एक अपवाद:

try 
{ 
    GCMRegistrar.checkDevice(context); 
    System.out.println("Device has GCM capabilities. So registering for GCM"); 
    //// write code here to register for GCM 
} 
catch(Exception e) 
{ 
    System.out.println("Cannot cregister for GCM"); 
} 

यह अपवाद को पकड़ने के लिए तर्क है। तो यदि प्रयास के बाद भाग में कोई अपवाद फेंक दिया जाता है, तो पकड़ के बाद भाग में कोड निष्पादित किया जाएगा। checkDevice() एक अपवाद फेंकता है। यदि आप अपवाद नहीं पकड़ेंगे, तो ऐप क्रैश हो जाएगा।

इसके अलावा मुझे नहीं लगता कि वाक्यविन्यास बिल्कुल सही है, लेकिन यह कोड आपको यह बताएगा कि क्या करना है।

+0

में निर्दिष्ट करें, धन्यवाद, मैं इसकी जांच करूंगा और प्रतिक्रिया देउंगा ... – Harry

+0

कोई समस्या नहीं, बस मुझे बताएं कि यह काम नहीं करता है .. –

+0

नहीं, यह काम नहीं करता है। मुझे लॉगकैट में मिलता है "डिवाइस में जीसीएम क्षमताएं हैं। इसलिए जीसीएम के लिए पंजीकरण करना" लेकिन बाद में "पंजीकरण त्रुटि: ACCOUNT_MISSING" आता है। – Harry

3

यदि आप ACCOUNT_MISSING प्राप्त करते हैं तो आपको जीसीएम से मिली प्रतिक्रिया को सत्यापित करने की आवश्यकता है, तो आप त्रुटि को संभाल सकते हैं।

में अपने GCMIntentService Class आप onRegistered() onUnregistered() onMessage() onError() तरह के तरीकों, अपने onError() विधि

/** 
* Method called on Error 
* */ 
@Override 
public void onError(Context context, String errorId) { 
    Log.i(TAG, "Received error: " + errorId); 
    // HANDLE IF GCM SERVER SENT ERROR MESSAGES.! 
} 

enter image description here

में त्रुटि हैंडलिंग के बारे में अधिक जानकारी के लिए जाँच Documentation

संबंधित मुद्दे