2015-12-15 5 views
13

क्या Google ड्राइव से संबंधित कोड को प्रदूषित किए बिना एप्लिकेशन के लिए वर्तमान गतिविधि का उपयोग करने के बजाय, Google गतिविधि के साथ एकीकृत करना संभव है?वर्तमान गतिविधि का उपयोग कर Google ड्राइव एकीकरण

मेरे पास पृष्ठभूमि "सेवा" है (एक एंड्रॉइड सेवा नहीं - केवल एक यूआई-अज्ञेय वर्ग) जो Google ड्राइव से कुछ डेटा लोड करने के लिए ज़िम्मेदार है। एक सेवा के रूप में, इसका कोई वास्तविक व्यवसाय गतिविधि नहीं है। हालांकि, samples for Drive integration में प्रमाणीकरण की आवश्यकता होने वाली स्थिति को संभालने के लिए onActivityResult का ओवरराइड है। मुझे यकीन नहीं है कि अगर मेरी सेवा किसी गतिविधि के रूप में लागू नहीं की जाती है तो मुझे इस जानकारी को कैसे पकड़ लिया जाएगा।

मान लीजिए कि मैं अपनी "सेवा" से वर्तमान Activity का संदर्भ प्राप्त कर सकता हूं, क्या कोई तरीका है कि मैं पूरी तरह से आत्मनिर्भर तरीके से Google ड्राइव एकीकरण को कार्यान्वित कर सकता हूं?

+0

करता है आपका ऐप्लिकेशन है गूगल प्लस के लिए लॉग इन –

+0

@war_Hero: उम, लॉगिन Google डिस्क API ने उकसाया जा करने के लिए माना जाता है। यह मेरे प्रश्न का एक बिंदु है - गतिविधि के संदर्भ के बाहर से साफ तरीके से इसे कैसे संभालना है। –

+0

कारण मैंने पूछा कि क्या आपके पास जी + लॉगिन है या नहीं, फिर पुनः-लेखक की आवश्यकता नहीं है –

उत्तर

6

मैंने एक ऐसे ऐप से ऐसा कुछ किया है जिसमें गतिविधि और सिंक सेवा है। आप वास्तव में demo here में बहुत सारी कार्यक्षमता देख सकते हैं। यह डेमो सेवा सेवा का उपयोग नहीं करता है, लेकिन विचार वही रहता है।

1/init() विधि के साथ एक सिंगलटन क्लास (GDAA) बनाएं जो आपके गतिविधि संदर्भ को स्वीकार करता है। यह init() एक स्थानीय स्थैतिक GoogleApiClient को तुरंत चालू करेगा जो तब तक जीवित रहता है जब तक आपको खातों को स्विच करने की आवश्यकता नहीं है (बाद में समझाया गया)।
init() को शुरुआत में एक गतिविधि संदर्भ के साथ कहा जाता है या जब किसी अन्य उपयोगकर्ता खाते (विभिन्न उपयोगकर्ता के लिए अलग GooDrive) पर स्विच करने की आवश्यकता होती है। गतिविधि इसके संदर्भ में गुजरती है और onConnFail(), onConnOK() कॉलबैक की आपूर्ति करती है।
पूर्णता के लिए, कनेक्शन बाधित होने पर onConnectionSuspended() के लिए भी प्रावधान होना चाहिए (WIFI/CELL कनेक्शन ड्रॉप नहीं, लेकिन GooPlaySvcs निलंबन)।

  • onConnFail() कॉलबैक प्रमाणीकरण/प्राधिकरण जिसका परिणाम onActivityResult() में वापस आता है के लिए GooPlaySvcs को नियंत्रण से गुजरता है। फिर से कनेक्ट करें, धोएं, कुल्लाएं, दोहराएं ...
  • onConnOK() कॉलबैक आपकी गतिविधि को बताता है कि सबकुछ तैयार है।

जैसा कि मैंने कहा, यदि आप के लिए एक नए खाते के लिए एक नया GoogleApiClient बनाने के लिए कई GooDrive खातों संभाल फिर init() फोन करना होगा। बस 'REQ_ACCPICK' निशान here का पालन करें। आपको खाता प्रबंधक 'एएम' कक्षा here में देख सकते हैं जैसा कि आप अपने खाते को प्रबंधित करना होगा। इस नृत्य का अधिकांश MainActivity में देखा जा सकता है।
पूर्णता के लिए, मुझे यह भी उल्लेख करना चाहिए कि GoogleApiClient.Builder() में setAccountName(email) को छोड़कर और खाता पिकिंग रीसेट करने के लिए clearDefaultAccountAndReconnect() का उपयोग करके आप GooPlaySvcs पर खाता प्रबंधन छोड़ सकते हैं। लेकिन आपका ऐप नहीं जानता कि वर्तमान उपयोगकर्ता कौन है। फिर भी एक और खाता प्रबंधन प्लसएपी के माध्यम से संभाला जा सकता है (या जिसे भी कहा जाता है, कभी इसका इस्तेमाल नहीं किया जाता है)। लेकिन मैं पीछे हटा।

2/जब प्रारंभ किया जाता है और निजी स्थिर GoogleApiClient mGAC में गैर-शून्य है और जुड़ा हुआ है, GDAA स्थिर तरीकों कहीं से भी अपने अनुप्रयोग में, संदर्भित किया जा सकता एक सेवा भी शामिल है। GoogleApiClient जीवित नहीं है या कनेक्ट नहीं है, तो विधियां निश्चित रूप से विफल हो जाएंगी।

यहां वर्णित डेमो में, सभी जीडीएए कॉल 'प्रतीक्षा()' (सिंक) स्वाद के हैं। यदि कोई गैर-UI थ्रेड से सेवा की तरह कहा जाता है तो यह कोई समस्या नहीं है। वे आसानी से इस उदाहरण की तरह async संस्करणों में बदल सकता है:

DriveFile df = ...; 
// sync version 
DriveContentsResult rslt = df.open(mGAC, DriveFile.MODE_READ_ONLY, null).await(); 
if ((rslt != null) && rslt.getStatus().isSuccess()) { 
    DriveContents cont = rslt.getDriveContents(); 
    InputStream is = cont.getInputStream(); 
    cont.discard(mGAC); // or cont.commit(); they are equiv if READONLY 
} 
// async version 
df.open(mGAC, DriveFile.MODE_READ_ONLY, null).setResultCallback(
    new ResultCallback<DriveContentsResult>() { 
    @Override 
    public void onResult(DriveContentsResult rslt) { 
    if ((rslt != null) && rslt.getStatus().isSuccess()) { 
     DriveContents cont = rslt.getDriveContents(); 
     InputStream is = cont.getInputStream(); 
     cont.discard(mGAC); // or cont.commit(); they are equiv if READONLY 
    } 
    } 
}); 

स्वाद आप अनुप्रयोग की जरूरत है (बनाम async प्रसंस्करण भस्म वापसी मूल्यों के साथ स्पेगेटी कोड) पर निर्भर करता है।

यह उल्लेख किया जाना चाहिए कि यह डेमो एपी के GDAA संस्करण का उपयोग करता है। एक REST Api है साथ ही इसे उसी तरह से संभाला जा सकता है (सिंक स्वाद केवल)। एक वैकल्पिक डेमो जो वास्तव में एक ही तर्क और विधियों का उपयोग करता है here उपलब्ध है। आप दोनों को
com.google.api.services.drive.Drive और com.google.android.gms.common.api.GoogleApiClient दोनों के साथ एक सिंगलटन कक्षा में भी जोड़ सकते हैं।

हालांकि जीडीएए और आरईएसटी एपीआई को मिश्रण करना खतरनाक है, क्योंकि आप निश्चित रूप से समय के मुद्दों में भाग लेंगे क्योंकि जीडीएए अपने स्वयं के कार्यक्रम पर सिंक्रनाइज़ करता है, जबकि आरईएसटी आपके नियंत्रण में है।

यह मदद की उम्मीद है, गुड लक

2

मुझे लगता है कि आप प्रभाव आप गूगल ड्राइव REST API का उपयोग कर चाहते हैं कॉल https://developers.google.com/drive/v2/reference/

यहाँ आप कैसे आगे बढ़ना कर सकते हैं प्राप्त कर सकते हैं। चूंकि आप संदर्भ प्राप्त करते हैं तो आप ड्राइव करने के लिए एपीआई कॉल कर सकते हैं। के लिए गूगल के बाद से प्रमाणीकरण OAuth 2.0 इस प्रकार आप इन API प्रमाणीकरण https://developers.google.com/identity/

6

onActivityResult कोड पथ केवल प्रयोग किया जाता है जब वहाँ एक प्रमाणीकरण उपयोगकर्ता हस्तक्षेप की आवश्यकता विफलता है को प्राप्त करने के लिए कॉल कर सकते हैं। इस प्रकार परिभाषा के अनुसार, इसे आपकी सेवा द्वारा "पृष्ठभूमि में" आसानी से संभाला नहीं जा सकता है।

पृष्ठभूमि सेवा के मामले में, मुझे लगता है कि प्रमाणीकरण विफलता को संभालने का एक उचित तरीका है "आपको जारी रखने के लिए प्रमाणीकृत करने की आवश्यकता" के प्रभाव के बारे में एक अधिसूचना दिखाना है। जब आप अधिसूचना पर टैप करते हैं तो आप अधिसूचना के लिए एक इरादा संलग्न कर सकते हैं ताकि यह आपकी खुद की "ResolveAuthActivity" लॉन्च करे। यह ResolveAuthActivity बस एपीआई से कनेक्ट करने का प्रयास करता है, ऑनकनेक्शन विफलता में विफलता को संभालता है, और उसके बाद संकल्प इरादा लॉन्च करता है। एक बार विफलता हल हो जाने के बाद, आपकी ResolveAuthActivity एपीआई से फिर से कनेक्ट करने का प्रयास करने के लिए आपकी सेवा को दबा सकती है।

+0

नमूना आपके पहले कथन का विरोधाभास प्रतीत होता है। यही है, यह _sccessccess_ प्रमाणीकरण को संभालने में विफल रहा है - विफलता नहीं। https://github.com/googledrive/android-demos/blob/master/app/src/main/java/com/google/android/gms/drive/sample/demo/BaseDemoActivity.java#L98 –

+0

यह एक संभालना है सफल प्रमाणीकरण संकल्प * पिछली कनेक्शन विफलता के बाद *। यदि आप नोटिस करते हैं, तो REQUEST_CODE_AUTHENTICATION को कनेक्शन कनेक्शन में अंदर से लॉन्च किया गया है, और ऑनएक्टिविटी रिसेट को एक बार REQUEST_CODE_AUTHENTICATION पूर्ण करने के लिए कहा जाता है। तो पूर्ण कोड प्रवाह है: 1. GoogleApiClient.connect का उपयोग करके कनेक्ट करने का प्रयास करें, 2. यदि कनेक्शन विफल हुआ (यानी ऑनकनेक्शनफेल कहा जाता है), लॉन्च प्रमाणीकरण रिज़ॉल्यूशन, 3. AtctivityResult में रिज़ॉल्यूशन के परिणाम को संभाल लें। अगर आपको (1) पर कोई विफलता नहीं मिली है, तो आप एक्टिविटी रिसेट प्रवाह पर नहीं जाएंगे। – Prima

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