मैं C#, Visual Studio और Xamarin का उपयोग करके Android APP में Google One Tap लागू कर रहा हूं।
मेरी मूल समस्या यह है कि मैं दो कंप्यूटरों के साथ काम कर रहा हूं। जब मैं कंप्यूटर ए से ऐप बनाता और डिबग करता हूं, तो BeginSignIn() अपेक्षा के अनुरूप OnActivityResult() पर पहुंच जाता है। जब मैं कंप्यूटर बी से निर्माण और डीबग करता हूं, तो BeginSignIn() हमेशा विफलता श्रोता की ओर जाता है। दोनों ही मामलों में, मैं एक ही टैबलेट पर एपीपी लोड कर रहा हूं। दोनों ही मामलों में मैं बिना किसी बदलाव के प्रोजेक्ट कोड की क्लोनिंग कर रहा हूं।
चूंकि मैं यूएसबी को किसी भी कंप्यूटर से कनेक्ट करके परीक्षण करने के लिए एक ही टैबलेट का उपयोग कर रहा हूं, टैबलेट पर स्पष्ट रूप से एक सहेजा गया क्रेडेंशियल है (क्योंकि यह कंप्यूटर ए से अपेक्षित काम करता है)।
ऊपर वर्णित चीजों के अलावा, मैंने कंप्यूटर बी पर एक एपीके बनाने और इसे टैबलेट पर स्थापित करने का प्रयास किया। इसका एक ही परिणाम था, यानी, BeginSignIn() को कॉल करने के बाद यह विफलता श्रोता में समाप्त हो गया। फिर मैंने कंप्यूटर ए पर एपीके बनाने की कोशिश की। यह टैबलेट पर विफल रहा, यानी, BeginSignIn() के बाद, यह विफलता श्रोता के पास गया। इसलिए, मैंने 4 अलग-अलग तरीकों की कोशिश की है: कंप्यूटर ए, बी से डिबग और कंप्यूटर ए, बी पर बनाया गया एपीके। इन 4 में से, केवल वही जो बिना किसी त्रुटि के साइन इन प्रक्रिया से गुजरता है, वह कंप्यूटर A से डिबग है।
अनुरोध पैकेट बनाने के लिए स्निपेट यहां दिया गया है। यह Google One Tap के बारे में doc पेज पर कोड के बहुत करीब है। , सिवाय इसके कि जावा के बजाय C# है।
TheBeginSignInRequest = new BeginSignInRequest.Builder()
.SetPasswordRequestOptions(new PasswordRequestOptions.Builder()
.SetSupported(true)
.Build())
.SetGoogleIdTokenRequestOptions(
new GoogleIdTokenRequestOptions.Builder()
.SetSupported(true)
// Your server's client ID, not your Android client ID.
.SetServerClientId(
GetString(Resource.String.default_web_client_id))
.SetFilterByAuthorizedAccounts(false)
.Build())
.SetAutoSelectEnabled(false)
.Build();
यहां BeginSignIn शुरू करने के लिए स्निपेट दिया गया है। कंप्यूटर ए पर, यह पूर्ण और सफल श्रोताओं की ओर जाता है। कंप्यूटर बी पर, यह पूर्ण और विफलता श्रोताओं की ओर जाता है।
Log.Info("bob", "SignInButton_Click: sign in.");
var SignInTask = TheOneTap_SignInClient.BeginSignIn(TheBeginSignInRequest);
SignInTask.AddOnCanceledListener(this);
SignInTask.AddOnCompleteListener(this);
SignInTask.AddOnSuccessListener(this);
SignInTask.AddOnFailureListener(this);
यहां कंप्यूटर ए से लॉग है। मैं केवल ऑनसक्सेस() में लॉग अप शामिल करता हूं क्योंकि यह कंप्यूटर बी पर ऑनफेलर() के बराबर है।
10-11 16:18:00.091 14053 14053 I bob : SignInButton_Click: sign in.
10-11 16:18:00.149 866 2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.171 866 2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.173 866 1568 D AccountManagerService: getUserAccounts0
10-11 16:18:00.173 866 1778 D AccountManagerService: getUserAccounts0
10-11 16:18:00.174 866 1778 I chatty : uid=1000(system) Binder:866_E identical 1 line
10-11 16:18:00.175 866 1778 D AccountManagerService: getUserAccounts0
10-11 16:18:00.176 866 2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.177 866 2818 I chatty : uid=1000(system) Binder:866_11 identical 1 line
10-11 16:18:00.180 866 2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.182 866 4626 D AccountManagerService: getUserAccounts0
10-11 16:18:00.184 866 4626 D AccountManagerService: getUserAccounts0
10-11 16:18:00.185 866 2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.188 866 4626 D AccountManagerService: getUserAccounts0
10-11 16:18:00.190 866 2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.190 866 2818 D AccountManagerService: getUserAccounts0
10-11 16:18:00.201 1594 1610 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:18:00.201 1594 1610 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:18:00.326 866 4626 D AccountManagerService: getUserAccounts0
10-11 16:18:00.327 1594 1610 E Auth : [GoogleAccountDataServiceImpl] getToken() -> NEED_REMOTE_CONSENT. App: com.SalmonCreekGames.SolitaireMobile, Service: oauth2:openid
10-11 16:18:00.346 14053 14053 I bob : OnComplete()
10-11 16:18:00.404 14053 14053 I bob : OnSuccess. result=com.google.android.gms.auth.api.identity.BeginSignInResult@5da485a
यहां कंप्यूटर बी से लॉग स्निपेट दिखाया गया है कि यह विफलता श्रोता पर कैसे समाप्त होता है।
10-11 16:27:34.251 15767 15767 I bob : SignInButton_Click: sign in.
10-11 16:27:34.329 866 919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.356 9625 9625 D BoundBrokerSvc: onBind: Intent { act=com.google.android.gms.chromesync.service.zeroparty.START cmp=com.google.android.gms/.chimera.GmsApiService }
10-11 16:27:34.357 9625 9625 D BoundBrokerSvc: Loading bound service for intent: Intent { act=com.google.android.gms.chromesync.service.zeroparty.START cmp=com.google.android.gms/.chimera.GmsApiService }
10-11 16:27:34.372 866 4582 D ConnectivityService: filterNetworkStateForUid() uid: 10019, pid: 1594
10-11 16:27:34.372 866 4582 D ConnectivityService: isNetworkWithLinkPropertiesBlocked: uid=10019, vpn=DISCONNECTED,false
10-11 16:27:34.372 866 4582 D ConnectivityService: filterNetworkStateForUid() uid: 10019, pid: 1594, networkInfo: [type: WIFI[], state: CONNECTED/CONNECTED, reason: (unspecified), extra: (none), failover: false, available: true, roaming: false]
10-11 16:27:34.379 866 1775 D AccountManagerService: getUserAccounts0
10-11 16:27:34.384 866 1775 D AccountManagerService: getUserAccounts0
10-11 16:27:34.385 9625 9625 D BoundBrokerSvc: onBind: Intent { act=com.google.android.gms.auth.key.retrieval.service.START cmp=com.google.android.gms/.chimera.GmsApiService }
10-11 16:27:34.385 9625 9625 D BoundBrokerSvc: Loading bound service for intent: Intent { act=com.google.android.gms.auth.key.retrieval.service.START cmp=com.google.android.gms/.chimera.GmsApiService }
10-11 16:27:34.385 866 1775 D AccountManagerService: getUserAccounts0
10-11 16:27:34.387 866 2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.392 866 919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.392 866 2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.394 866 2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.394 866 919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.394 866 2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.396 866 2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.396 866 919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.398 866 919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.398 866 2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.401 866 2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.402 866 919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.403 866 2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.404 866 2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.405 866 919 D AccountManagerService: getUserAccounts0
10-11 16:27:34.409 866 2944 D AccountManagerService: getUserAccounts0
10-11 16:27:34.416 1594 22041 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:27:34.416 1594 22041 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:27:34.419 1594 29593 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:27:34.419 1594 29593 I System.out: (HTTPLog)-Static: isSBSettingEnabled false
10-11 16:27:34.524 866 1775 D AccountManagerService: getUserAccounts0
10-11 16:27:34.529 866 1775 D AccountManagerService: getUserAccounts0
10-11 16:27:34.559 15767 15767 I bob : OnComplete()
10-11 16:27:34.618 15767 15767 I bob : OnFailure.
Computer A:
Windows 10 Pro Version 21H1 19043.1237
Visual Studio Community Version 16.8.4
Computer B:
Windows 10 Home Version 20H2 19042.1237
Visual Studio Community Version 16.11.12
Tablet
Samsung SM-T380
Android Version 9
1 उत्तर
इसलिए मुझे अंततः कंप्यूटर बी से काम करने के लिए एक टैप साइन इन मिला। मैं उत्तर की तलाश में एक लंबी स्पर्शरेखा पर चला गया। आखिरकार मैंने ऑनफेलर हैंडलर में और डीबग संदेश जोड़े।
public void OnFailure(Java.Lang.Exception e)
{
// No saved credentials found. Launch the One Tap sign-up flow, or
// do nothing and continue presenting the signed-out UI.
Log.Info("bob", $"OnFailure: Couldn't start One Tap UI: " + e.Message)
}
आउटपुट में e.Message जोड़ने के परिणामस्वरूप संदेश प्राप्त हुआ: "मिलान करने वाला क्रेडेंशियल नहीं ढूंढा जा सकता।" इस संदेश ने मुझे इस SO प्रश्न तक पहुँचाया: एंड्रॉइड पर वन टैप साइन-इन और साइन-अप करते समय "16: मैचिंग क्रेडेंशियल नहीं ढूंढ सकता" प्राप्त करना। रॉय सोलबर्ग द्वारा उस प्रश्न के उत्तर में 3 अलग-अलग मामले शामिल हैं और मुझे बहुत मदद मिली है।
समस्या का अंतिम समाधान Google क्लाउड प्लेटफ़ॉर्म कंसोल -> एपिस और सेवाएं -> क्रेडेंशियल पृष्ठ पर एक और OAuth 2.0 क्लाइंट आईडी जोड़ना था। नई क्लाइंट आईडी कंप्यूटर बी के लिए विशिष्ट है। स्पष्ट रूप से विकास के लिए लैपटॉप से यूएसबी पर डिवाइस तक चलता है, प्रत्येक व्यक्तिगत विकास कंप्यूटर द्वारा एक अलग कीस्टोर का उपयोग किया जाता है।
Visual Studio Xamarin के लिए, मुझे यह पृष्ठ मिला: अपने कीस्टोर का सिग्नेचर ढूँढना। इसमें डिबग रन के लिए उपयोग किए जाने वाले कीस्टोर के बारे में जानकारी है। मैंने उस पृष्ठ में वर्णित keytool.exe का उपयोग करके कंप्यूटर B पर डीबग कीस्टोर से SHA1 निकाला। फिर, मैंने GCP कंसोल पर क्लाइंट आईडी बनाने के लिए कहा SHA1 का उपयोग किया।
प्रत्येक डेवलपर कंप्यूटर के लिए एक अलग क्लाइंट आईडी रखने के बजाय ऐसा करने का एक क्लीनर तरीका हो सकता है, लेकिन अभी के लिए यह मेरे लिए काम कर रहा है।
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
android
एंड्रॉइड Google का मोबाइल ऑपरेटिंग सिस्टम है, जिसका उपयोग प्रोग्रामिंग या डिजिटल डिवाइस (स्मार्टफोन, टैबलेट, ऑटोमोबाइल्स, टीवी, वियर, ग्लास, IoT) को विकसित करने के लिए किया जाता है। एंड्रॉइड से संबंधित विषयों के लिए, एंड्रॉइड-विशिष्ट टैग जैसे कि एंड्रॉइड-इरादे, एंड्रॉइड-गतिविधि, एंड्रॉइड-एडॉप्टर आदि का उपयोग करें। विकास या प्रोग्रामिंग के अलावा अन्य प्रश्नों के लिए, लेकिन एंड्रॉइड फ्रेमवर्क से संबंधित हैं, इस लिंक का उपयोग करें: https: // android.stackexchange.com।