2010-11-17 11 views
9

मैं पूछना चाहता हूं कि फोन पर पहले से कॉन्फ़िगर किए गए Google खाते के साथ उपयोगकर्ता को प्रमाणीकृत करने का सबसे अच्छा तरीका क्या है। मैंने पहले क्लाइंटलॉगिन को देखा है, लेकिन यह वही नहीं है जो मुझे चाहिए क्योंकि इसे उपयोगकर्ताओं को मेरे एप्लिकेशन में लॉगिन/पासवर्ड दर्ज करने की आवश्यकता है। मैं इसे ओथ के साथ कर सकता हूं लेकिन वहां मुझे उपयोगकर्ता से ब्राउज़र में अपने क्रेडेंशियल्स दर्ज करने के लिए कहा जाना चाहिए जो भी बेहतर नहीं है। मैं खाता प्रबंधक का उपयोग करना चाहता हूं (मैंने देखा है कि इसमें विशेष खाते के लिए विधि getPassword है लेकिन यह मेरे लिए काम नहीं करता है), यदि किसी भी तरह से खाता प्रबंधक + क्लाइंट लॉजिइन या खाता प्रबंधक + ओथ कृपया मुझे बताएं। नतीजतन मैं अपने लॉगिन/पासवर्ड (कोर्स के एंड्रॉइड डिवाइस पर पुष्टि के बिना) Google खाते के साथ लॉग इन करने की क्षमता चाहता हूं, मुझे यकीन नहीं है कि यह संभव है लेकिन अगर इसे लागू करने के लिए कोई तरीका मौजूद है तो कृपया मुझे बताएं। ..एंड्रॉइड: Google प्रमाणीकरण

+0

अच्छा होगा अगर आपने अपने प्रश्न के सही उत्तर के लिए मतदान किया। या, यदि आपकी जरूरतों के अनुरूप कोई भी नहीं है, तो उन पर टिप्पणी की। हमें बनाता है, उत्तरदाताओं (आपने उस समय एक टिप्पणी की थी) आपकी मदद करने के हमारे प्रयासों की सराहना करते हैं। :) –

उत्तर

0

feb2010 में एक stackoverflow सवाल से: Anyway to Authenticate a user using Google Apps in an Android application?

और लेख ब्लॉग पोस्ट: http://javagwt.blogspot.com/2009/12/authenticating-android-app-to-google.html

याद रखें, अंतर अब गूगल अब द्वि-चरणीय प्रमाणीकरण करता है कि ताकि आप करना पड़ सकता है है कुछ चरणों को संशोधित करें।

+0

मैंने इसे पहले ही पढ़ लिया है ...अधिक विशिष्ट होने के लिए मैं समझता हूं कि ओएथ तंत्र के साथ इसे कैसे किया जाए, जो कि ट्विटर जैसी अन्य सेवाओं के साथ प्रमाणित करने का एक अच्छा तरीका है, लेकिन Google खाते पहले ही एंड्रॉइड फोन में समर्थित हैं, और मैं उस चरण को छोड़ना चाहता हूं जहां उपयोगकर्ता को अपने प्रमाण पत्र दर्ज करना चाहिए और छोड़ना चाहिए सिर्फ पुष्टि है कि मेरा एप्लिकेशन डेटा पुनर्प्राप्त करने के लिए अपने खाते का उपयोग करेगा ... और क्या ... मैं ऐप इंजन से नहीं डेटा पुनर्प्राप्त करने की योजना बना रहा हूं लेकिन Google कार्यों से – endryha

3

आप खाता प्रबंधक में निर्माण का उपयोग कर सकते हैं:

Account[] accounts = accountManager.getAccountsByType("com.google"); 

फिर आप जिस खाते लौटे सूची से अपने पसंदीदा निकालें। अगला चरण AccountManager.getAuthToken पर कॉल करना होगा।

एक बार जब आप authToken है, तो आप उस पर Google API के लिए फोन करके पारित कर सकते हैं:

api.setUserToken(token); 

रूप setUserCredentials उपयोगकर्ता और पासवर्ड की आवश्यकता है कि करने के लिए विरोध।

8

हां, आप खाता प्रबंधक में जानकारी तक पहुंच सकते हैं और उपयोगकर्ता को पंजीकृत पासवर्ड के बिना पंजीकृत Google खाते (उदाहरण के लिए) का उपयोग कर प्रमाणित कर सकते हैं।

नीचे कोड nick johnson द्वारा और के द्वारा अपने मुख्य गतिविधि के साथ tencent

शुरू उदाहरण से एक कार्यात्मक मिश्रण और मैच है:

package com.tg.auth; 


import org.apache.http.impl.client.DefaultHttpClient; 

import android.accounts.Account; 
import android.accounts.AccountManager; 
import android.accounts.AccountManagerFuture; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class AppInfo extends Activity { 
    DefaultHttpClient http_client = new DefaultHttpClient(); 
    Activity activity; 
    String TAG = "TGtracker"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.app_info); 
     activity = this; 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     //Log.v(TAG, "resuming activity"); 
     AccountManager accountManager = AccountManager.get(getApplicationContext()); 
     //if result is null, you might not have a valid internet connection 
     Log.i(TAG, "got token, yipee: "+updateToken(accountManager, true)); 
    } 


    private String updateToken(AccountManager am, boolean invalidateToken) { 
     String authToken = "null"; 
     try { 
      Account[] accounts = am.getAccountsByType("com.google"); 
      AccountManagerFuture<Bundle> accountManagerFuture; 
      if(activity == null){//this is used when calling from an interval thread 
       accountManagerFuture = am.getAuthToken(accounts[0], "android", false, null, null); 
      } else { 
       accountManagerFuture = am.getAuthToken(accounts[0], "android", null, activity, null, null); 
      } 
      Bundle authTokenBundle = accountManagerFuture.getResult(); 
      authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN).toString(); 
      Log.v(TAG, "newToken preinvalidate: "+authToken); 

      if(invalidateToken) { 
       am.invalidateAuthToken("com.google", authToken); 
       authToken = updateToken(am, false); 

      } 
     } catch (IOException e) { 
      Log.e(TAG, "the exception was: "+e.toString()); 
      e.printStackTrace(); 
     } 
     return authToken; 
    } 
} 

उपयोग:

package com.tg.auth; 

import android.accounts.Account; 
import android.accounts.AccountManager; 
import android.app.ListActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class ZAuth02aActivity extends ListActivity { 
    protected AccountManager accountManager; 
    protected Intent intent; 
    String TAG = "TGtracker"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     accountManager = AccountManager.get(getApplicationContext()); 
     Account[] accounts = accountManager.getAccountsByType("com.google"); 
     this.setListAdapter(new ArrayAdapter<Account>(this, R.layout.list_item, accounts));   

    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     Account account = (Account)getListView().getItemAtPosition(position); 
     Intent intent = new Intent(this, AppInfo.class); 
     intent.putExtra("account", account); 
     startActivity(intent); 
    } 
} 

एक AppInfo वर्ग बनाने एक मैनिफेस्ट फ़ाइल, कुछ हद तक इस तरह (गतिविधियों को घोषित करना चाहिए + अनुमतियां):

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.tg.auth" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="7" /> 
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"></uses-permission> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS"></uses-permission> 
    <uses-permission android:name="android.permission.USE_CREDENTIALS"></uses-permission> 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".ZAuth02aActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".AppInfo"></activity> 
    </application> 

</manifest> 

उपयोग निक जॉनसन लेआउट फ़ाइलों को here

+0

जब मैं इसे आज़माता हूं, तो मुझे एक त्रुटि मिलती है जो मिलता है Result() इस लाइन से मुख्य धागे पर चलाएं: बंडल ऑथ टोकनबंडल = खाता प्रबंधक। भविष्य .getResult(); मैं यह पता लगाने पर काम कर रहा हूं कि इसे क्यों और कैसे हल किया जाए। –

0

Android SDK में "प्रमाणन" नमूना परियोजना की जाँच करें डाउनलोड कर सकते हैं, यह वास्तव में है कि नहीं करता है।

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