2015-12-22 13 views
5

पर Google खाता पंजीकृत करना मैं थोड़ी देर के लिए इस समस्या का समाधान ढूंढ रहा हूं (दिन, मिनट नहीं), लेकिन यह मुझे काफी प्रभावी ढंग से बढ़ाता है।एंड्रॉइड डिवाइस प्रोग्रामेटिक रूप से

कृपया ध्यान दें कि यह पंजीकरण प्रक्रिया शुरू करने के बारे में कोई प्रश्न नहीं है। यह बिना किसी उपयोगकर्ता इंटरैक्शन के स्वचालित रूप से होना चाहिए।

मैं अपने कस्टम डिवाइस (उनमें से 1000) में एक Google खाता जोड़ना चाहता हूं। खाते का उपयोग ज्यादातर डिवाइस पर Google Play store को सक्रिय करने के लिए किया जाएगा ताकि नए संस्करण उपलब्ध होने पर ऐप अपडेट हो सके।

मेरे मौजूदा कोड (उन मैंने कोशिश की कम से कम टुकड़ा):

AccountManager mgr = AccountManager.get(this); 
Account acc = new Account("[email protected]", "com.google"); 
mgr.addAccountExplicitly(acc, "password", new Bundle())); 

स्वाभाविक रूप से एक

java.lang.SecurityException: caller uid 10047 is different than the authenticator's uid 

पैदावार तो कैसे मैं वास्तव में इस प्राप्त करने के बारे जाना चाहते हैं? मेरा डिवाइस जड़ है इसलिए यह एकमात्र तरीका है अगर यह बाधा नहीं है।

+0

जहां तक ​​मुझे पता है, आप किसी अन्य ऐप्स प्रमाणीकरणकर्ता के लिए खाता नहीं बना सकते हैं। अगर आपके पास फर्मवेयर और हस्ताक्षर कुंजी है, तो आप सिस्टम यूजर आईडी के साथ अपना यूजर आईडी साझा कर सकते हैं। इस मामले में, आप इसे रोकने में सक्षम हो सकते हैं। (उत्तर के रूप में नहीं लिख रहा है, क्योंकि मैं इस जानकारी के बारे में 100% निश्चित नहीं हूं) – Knossos

+0

खैर, टाइटेनियम बैकअप ऐसा कर सकता है ताकि किसी भी तरह से – velis

+2

ऐसा करने योग्य हो, क्योंकि यह आपका कस्टम डिवाइस है, और आप "Google Play store" रखने का दावा करते हैं उस पर, आपने इसे Google से लाइसेंस प्राप्त कर लिया होगा। आपको Google से यह पूछना चाहिए कि इन स्थितियों में Google खाते को पूर्व-स्थापित करने पर उनकी नीति क्या है, न केवल यह निर्धारित करने के लिए कि यह कैसे करना है, बल्कि यह भी कि यह पहले स्थान पर अधिकृत है या नहीं। – CommonsWare

उत्तर

0

ठीक है, जैसा कि यह पता चला है, यह कुछ आसानी से सुलझाया नहीं गया है। मैंने एक डिवाइस को पंजीकृत करना समाप्त कर दिया, फिर उपयोगकर्ता से फ़ाइल खींच ली। उपयोगकर्ता फ़ाइल का स्थान: /data/system/users/0/accounts.db (यदि डिवाइस पर एकाधिक उपयोगकर्ता प्रोफ़ाइल हैं, तो अंतिम निर्देशिका प्रश्न में प्रोफ़ाइल के अनुसार भिन्न हो सकती है)।

मैंने इस फ़ाइल को मेरे ऐप की संपत्ति में संग्रहीत किया है (gzipped, सुनिश्चित करें कि एक्सटेंशन कुछ.g.gz नहीं है क्योंकि यह पैकेजिंग के दौरान खो जाता है - क्यों जांच कर परेशान नहीं किया गया)।

सबसे पहले मैं जाँच करता है, तो मेरे उपयोगकर्ता पहले से मौजूद है:

AccountManager mgr = AccountManager.get(this); 
for (Account acc: mgr.getAccountsByType("com.google")) { 
    if (acc.name.equalsIgnoreCase("[email protected]")) 
    return; 
} 

यदि ऐसा है, मैं सिर्फ चरण छोड़ दें। अन्यथा मैं उपयोगकर्ता फ़ाइल को अनपैक करता हूं और मौजूदा एक को ओवरराइट करता हूं (su का उपयोग करके)। मैं यह सुनिश्चित करने के लिए एक रीबूट भी करता हूं कि परिवर्तन पंजीकृत हैं।

+0

क्या आपको ऐसा करने का बेहतर तरीका मिल गया है? यह मानता है कि आपने accounts.db को ईमेल के साथ पॉप्युलेट किया है और पासवर्ड के हैश के साथ एक बार मैन्युअल रूप से इस उपयोगकर्ता खाते को पंजीकृत किया है। क्या पहला कदम छोड़ने का कोई तरीका है, केवल कच्चे पासवर्ड को जानना और उसके हैंडहेड फॉर्म के बारे में कोई जानकारी नहीं है। इसके अलावा, मुझे यकीन नहीं है कि पासवर्ड के हैंडहेड फॉर्म डिवाइस पर समान होंगे, भले ही ऐसे उपकरणों का मॉडल बिल्कुल वही है। –

+0

@ तानासिसपेटास: वास्तव में, नहीं।जैसा कि यह पता चला है, Google के पास कुछ पता लगाने की जगह है। एक बार 50 डिवाइस एक ही खाते का उपयोग कर रहे थे, Play Store ने काम करना बंद कर दिया। इसलिए हमें अपने पैकेज अद्यतन तंत्र को लागू करने के लिए मजबूर होना पड़ा। – velis

+0

ठीक है, जानना अच्छा है! तो, 49 डिवाइस एक खाते के साथ ठीक थे? सभी उपकरणों के लिए पासवर्ड का हैश फॉर्म समान था? –

0

addAccountExplicitly() का उपयोग करके Google खाता जोड़ना/बनाना संभव नहीं है। आप केवल अपनी सेवाओं के लिए खाते जोड़ सकते हैं। यहां तक ​​कि आपका डिवाइस रूट है क्योंकि यह Google वेब सर्वर द्वारा खारिज कर दिया जाएगा। अधिक जानकारी के लिए यह link

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