android - एंड्रॉइड: Google प्रमाणीकरण




authentication oauth (3)

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


आप AccountManager में बिल्ड का उपयोग कर सकते हैं:

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

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

आपके पास authToken होने के बाद, आप इसे कॉल करके Google API पर भेज सकते हैं:

api.setUserToken(token);

सेट यूसर क्रेडेंशियल्स के विपरीत जो उपयोगकर्ता और पासवर्ड की आवश्यकता होती है


एंड्रॉइड एसडीके में "ऑथ" नमूना प्रोजेक्ट की जांच करें, यह बिल्कुल ठीक है।


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

नीचे दिए गए कोड एक कार्यात्मक मिश्रण है और निक जॉन्सन द्वारा और दस सेंसर के उदाहरणों से मिलान करते हैं

अपनी मुख्य गतिविधि से शुरू करें:

    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 वर्ग बनाएँ:

    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;
    }
}

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

    <?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>

निक जॉन्सन की लेआउट फ़ाइलों का उपयोग करें जिन्हें आप यहां डाउनलोड कर सकते हैं







accountmanager