2016-03-23 6 views
6

मैंने हाल ही में अपने ऐप में पासवर्ड की सुविधा के लिए Google के स्मार्ट लॉक को एकीकृत किया है और लगभग हर चीज अपेक्षाकृत आसानी से चल रही है।अभिविन्यास परिवर्तन पर एकाधिक स्मार्ट लॉक संवाद

सिर्फ एक छोटा सा मुद्दा मैं अभी तक ठीक करने के लिए सक्षम नहीं था नहीं है: ResultCallback#onResult में, यदि status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED निम्न आदेश एक गूगल संकल्प संवाद की प्रस्तुति की जाती है कि स्मार्ट लॉक के माध्यम से साख को बचाने के लिए है कि क्या पूछ की ओर जाता है (संलग्न छवि देखें) या जो क्रेडेंशियल्स का उपयोग करने, अगर वहाँ पहले से ही कई क्रेडेंशियल्स स्मार्ट लॉक में सहेजा हैं:

status.startResolutionForResult(getActivity(), REQUEST_CODE_READ); 

Google Smart Lock dialog: Save password with Smart Lock? Never or Save Password

जब संकल्प संवाद प्रस्तुत किया जाता है, और उपयोगकर्ता कुछ उन्मुखीकरण परिवर्तन, तो संकल्प संवाद पलता करता है , की प्रत्येक उन्हें दूसरों को ओवरलैप करना। उपयोगकर्ता के रूप में, आप पहले नहीं देखते हैं कि संवाद की कई प्रतियां हैं, लेकिन यदि आप पहले बंद करते हैं ("कभी नहीं" या "पासवर्ड सहेजें" पर टैप करके) ऊपर सबसे ऊपर संवाद गायब हो जाता है, नीचे एक और समान संवाद प्रकट होता है।

उत्तर

5

आप गतिविधि शुरू करने और रोकने के बीच कुछ राज्य बनाए रखकर इसे संभाल सकते हैं।

इस sample code में mIsResolving चर का उपयोग देखें। बस सहेजें कि onSaveInstanceState() को में पहले से लंबित संवाद कहा गया है और onCreate() में पुनर्स्थापित किया गया है, और अगर एपीआई को दोबारा कॉल करने के खिलाफ सुरक्षा हो तो onActivityResult() को मंशा के लिए प्राप्त किया जाता है।

private void resolveResult(Status status, int requestCode) { 
    // We don't want to fire multiple resolutions at once since that can result 
    // in stacked dialogs after rotation or another similar event. 
    if (mIsResolving) { 
     Log.w(TAG, "resolveResult: already resolving."); 
     return; 
    } 
    if (status.hasResolution()) { 
     try { 
      status.startResolutionForResult(MainActivity.this, requestCode); 
      mIsResolving = true; 
... 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
... 
    if (savedInstanceState != null) { 
     mIsResolving = savedInstanceState.getBoolean(KEY_IS_RESOLVING); 
    } 
... 

@Override 
protected void onSaveInstanceState(Bundle outState) { 
... 
    outState.putBoolean(KEY_IS_RESOLVING, mIsResolving); 
... 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    switch (requestCode) { 
... 
      mIsResolving = false; 
... 

यह कई ऐप्स के लिए एक आम ख़तरा है, इसलिए हम है कि क्या हम Play सेवाएं परत में इस राज्य का समर्थन कर सकते पर ध्यान देंगे, लेकिन अब के लिए, गतिविधि के लिए बूलियन उपयोग करने के लिए वर्तमान और सामान्य सिफारिश है संकल्प राज्य बनाए रखना।

0

मुझे पता है, यह एक पुराना सवाल है, लेकिन हाल ही में मुझे इस मुद्दे से लड़ना है, मेरे मामले में मैं कस्टम क्लास में status.startResolutionForResult() का उपयोग कर रहा था और मेरे पास onSaveInstanceState() तक कोई पहुंच नहीं थी (मैं कुछ कस्टम कॉलबैक कर सकता था इंटरफ़ेस के साथ, लेकिन मैं नहीं चाहता था), लेकिन मेरी कस्टम कक्षा में मेरे पास एक गतिविधि का एक उदाहरण था, इसलिए startResolutionForResult() पर कॉल करने से पहले मैं mActivity.hasWindowFocus() देख रहा हूं कि यह देखने के लिए कि क्या गतिविधि फोकस है, दिखाए गए संवाद के कारण, अगर यह है सच है, तो मैं startResolutionForResult() पर कॉल करता हूं, अन्यथा मैं कुछ भी नहीं करता

@Override 
public void onResult(@NonNull LocationSettingsResult result) { 

    final Status status = result.getStatus(); 
    switch (status.getStatusCode()){ 
     case LocationSettingsStatusCodes.SUCCESS: 

      getLocation(); 
      break; 
     case LocationSettingsStatusCodes.RESOLUTION_REQUIRED: 

      if (mActivity.hasWindowFocus()) { 
       try { 
        status.startResolutionForResult(mActivity, SETTINGS_CHECK); 
       } catch (IntentSender.SendIntentException e) { 
        e.printStackTrace(); 
       } 
      } 
      break; 
     case LocationSettingsStatusCodes.SETTINGS_CHANGE_UNAVAILABLE: 

      mReceiver.unableToObtainLocation(); 
      break; 
    } 
} 
संबंधित मुद्दे