Android Null异常:无身份验证标头信息-偶数设置.setUserToken(auth_token)

Android Null异常:无身份验证标头信息-偶数设置.setUserToken(auth_token),android,oauth-2.0,gdata-api,accountmanager,Android,Oauth 2.0,Gdata Api,Accountmanager,我有以下方法: public String tryGoogleAuthentication(String auth_token){ ContactsService contactsService = new ContactsService("....."); contactsService.setUserToken(auth_token); IFeed feed = null; try { feed = contactsService.getFe

我有以下方法:

public String tryGoogleAuthentication(String auth_token){
    ContactsService contactsService = new ContactsService(".....");
    contactsService.setUserToken(auth_token);

    IFeed feed = null;
    try {
        feed = contactsService.getFeed(new URL("https://www.google.com/m8/feeds/  contacts/default/full?max-results=10000"), ContactFeed.class);
    } catch (IOException e) {
        e.printStackTrace();
        return CONST.GOOGLE_AUTH_INVALID_TOKEN;
    } catch (ServiceException e) {          
        e.printStackTrace();
        return CONST.GOOGLE_AUTH_INVALID_TOKEN;
    } catch (NullPointerException e) {
        e.printStackTrace();
        return CONST.GOOGLE_AUTH_INVALID_TOKEN;
    }

    if (feed == null)
        return "";

    String externalId = feed.getId();
    IPerson person = feed.getAuthors().get(0);
    String email = person.getEmail();
    String name = person.getName();
    String nameLang = person.getNameLang();

    System.out.println("externalId: " + externalId);
    System.out.println("email: " + email);
    System.out.println("name: " + name);
    System.out.println("nameLang: " + nameLang);

    return CONST.STATUS_OK;
}
我得到了一个错误:

java.lang.NullPointerException: No authentication header information
at com.google.gdata.util.AuthenticationException.initFromAuthHeader(AuthenticationException.java:96)
at com.google.gdata.util.AuthenticationException.<init>(AuthenticationException.java:67)
at com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:600)
at com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:563)
at com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:552)
at com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:530)
at com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:535)
at com.google.gdata.client.Service.getFeed(Service.java:1135)
at com.google.gdata.client.Service.getFeed(Service.java:998)
at com.google.gdata.client.GoogleService.getFeed(GoogleService.java:631)
at com.google.gdata.client.Service.getFeed(Service.java:1017)
at ro.servlet.data.ClientAuthenticator.tryGoogleAuthentication(ClientAuthenticator.java:96)
....
java.lang.NullPointerException:无身份验证头信息
位于com.google.gdata.util.AuthenticationException.initFromAuthHeader(AuthenticationException.java:96)
位于com.google.gdata.util.AuthenticationException。(AuthenticationException.java:67)
位于com.google.gdata.client.http.HttpGDataRequest.handleErrorResponse(HttpGDataRequest.java:600)
位于com.google.gdata.client.http.GoogleGDataRequest.handleErrorResponse(GoogleGDataRequest.java:563)
位于com.google.gdata.client.http.HttpGDataRequest.checkResponse(HttpGDataRequest.java:552)
位于com.google.gdata.client.http.HttpGDataRequest.execute(HttpGDataRequest.java:530)
位于com.google.gdata.client.http.GoogleGDataRequest.execute(GoogleGDataRequest.java:535)
位于com.google.gdata.client.Service.getFeed(Service.java:1135)
位于com.google.gdata.client.Service.getFeed(Service.java:998)
位于com.google.gdata.client.GoogleService.getFeed(GoogleService.java:631)
位于com.google.gdata.client.Service.getFeed(Service.java:1017)
在ro.servlet.data.ClientAuthenticator.tryGoogleAuthentication(ClientAuthenticator.java:96)中
....
请告诉我应该将什么设置为contactsService(setUserToken除外)才能正常工作

我以前没有使用过gData(我是一名android/iPhone开发人员)-我从android设备获取了auth字符串(通过让用户确认),并通过安全通道将其传递到我的服务器-现在我想收集一些关于此联系人的数据(首先,姓氏和提供商uid-我需要一个包含我应用程序中用户的数据库)

我真的需要完成这项任务,所以请,如果有人知道如何解决这个问题,请帮助我

下面的类描述了我从android设备获取auth字符串的方式

package ro.locationsApp.android.login;

import java.io.IOException;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
import org.apache.http.params.HttpParams;
import org.json.JSONObject;
import ro.locationsApp.android.CONST;
import android.R;
import android.accounts.Account;
import android.accounts.AccountManager;
import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
import android.accounts.AuthenticatorException;
import android.accounts.OperationCanceledException;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class AccountList extends ListActivity {
protected AccountManager accountManager;
protected Intent intent;
DefaultHttpClient http_client = getThreadSafeClient();
private Account currentUsedAccount;

/** 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");
    String[] names = new String[accounts.length];
    for (int i = 0; i < accounts.length; i++) {
        System.out.println(accounts[i].name);
        names[i] = accounts[i].name;
    }

    this.setListAdapter(new ArrayAdapter<String>(this,
            R.layout.simple_list_item_1, names));
}

@SuppressWarnings("unchecked")
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
    Account account = accountManager.getAccountsByType("com.google")[position];     
    accountManager.getAuthToken(account, "ah", false,
            new GetAuthTokenCallback(), null);
    currentUsedAccount = account;
}

public static DefaultHttpClient getThreadSafeClient() {
    DefaultHttpClient client = new DefaultHttpClient();
    ClientConnectionManager mgr = client.getConnectionManager();
    HttpParams params = client.getParams();

    client = new DefaultHttpClient(new ThreadSafeClientConnManager(params, 
            mgr.getSchemeRegistry()), params);


    return client;
}

@SuppressWarnings("rawtypes")
private class GetAuthTokenCallback implements AccountManagerCallback {

    public void run(AccountManagerFuture result) {
        Bundle bundle;
        try {
            bundle = (Bundle) result.getResult();
            Intent intent = (Intent) bundle.get(AccountManager.KEY_INTENT);
            if (intent != null) {
                // User input required
                startActivity(intent);
            } else {
                onGetAuthToken(bundle);                 
            }
        } catch (OperationCanceledException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (AuthenticatorException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
};

protected void onGetAuthToken(Bundle bundle) {
    final String auth_token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
    System.out.println("AUTH TOKEN: " + auth_token);
    new Thread(new Runnable() {

        @Override
        public void run() {
            try {
                JSONObject request = new JSONObject();
                request.put(CONST.ID_ATTR, CONST.ID_GOOGLE_AUTH);
                JSONObject body = new JSONObject();
                body.put(CONST.GOOGLE_AUTH_TOKEN, auth_token);
                request.put(CONST.DATA_ATTR, body);
                JSONObject response = new JSONObject(new RequestHandler().request(DataSource.LOCATIONS_SERVER_URL, request.toString()));
                String bodyResponse = response.optJSONObject(CONST.DATA_ATTR).optString(CONST.STATUS_ATTR);
                if(bodyResponse.equals(CONST.STATUS_OK)){

                }
                else if(bodyResponse.equals(CONST.GOOGLE_AUTH_INVALID_TOKEN)){
                    runOnUiThread(new Runnable() {
                        @SuppressWarnings("unchecked")
                        public void run() {
                            invalidateUserToken(auth_token);
                            accountManager.getAuthToken(currentUsedAccount, "ah", false,
                                    new GetAuthTokenCallback(), null);
                        }
                    });
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();
}

public void invalidateUserToken(String token){
    AccountManager accountManager = AccountManager.get(this);
    accountManager.invalidateAuthToken("com.google", token);
}

}
包ro.locationsApp.android.login;
导入java.io.IOException;
导入org.apache.http.conn.ClientConnectionManager;
导入org.apache.http.impl.client.DefaultHttpClient;
导入org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;
导入org.apache.http.params.HttpParams;
导入org.json.JSONObject;
导入ro.locationsApp.android.CONST;
导入android.R;
导入android.accounts.Account;
导入android.accounts.AccountManager;
导入android.accounts.AccountManagerCallback;
导入android.accounts.accountmanager未来;
导入android.accounts.AuthenticatorException;
导入android.accounts.OperationCanceledException;
导入android.app.ListActivity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.view.view;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
公共类AccountList扩展了ListActivity{
受保护的AccountManager AccountManager;
受保护的意图;
DefaultHttpClient http_client=getThreadSafeClient();
私人帐户currentUsedAccount;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
accountManager=accountManager.get(getApplicationContext());
Account[]accounts=accountManager.getAccountsByType(“com.google”);
字符串[]名称=新字符串[accounts.length];
对于(int i=0;iaccountManager.getAuthToken(currentUsedAccount, "ah", false,
                            new GetAuthTokenCallback(), null);