2012-03-15 4 views
0

У меня есть метод ниже:Null исключение: Нет информации заголовка аутентификации - даже установка .setUserToken (auth_token)

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) 
.... 

Пожалуйста, скажите, что я установил Шоуда к контактамУслуги (кроме setUserToken), чтобы работать нормально?

Я не использовал gData раньше (я разработчик android/iPhone). Я взял строку auth из устройства Android (давая пользователю подтвердить это) и передав ее по защищенному каналу на мой сервер - Теперь я хочу собрать некоторые данные об этом контакте (во-первых, фамилия и провайдер uid - мне нужна база данных с пользователями в моем приложении).

Мне действительно нужно закончить эту задачу, поэтому, пожалуйста, если кто знает, как это можно исправить, помогите мне!

В этом классе описывается способ получения строки auth с устройства Android.

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

} 

Спасибо,

Алекс.

+0

Дополнительные места здесь: '" ../feeds/ contacts/... "', но это вызывает исключение «Bad Request». Единственным способом, который я обнаружил, чтобы получить исключение «Нет информации заголовка проверки подлинности», было использование недопустимого токена. –

+0

Как вы получили токен аутентификации от Android? Как это выглядит ? –

+0

Я отредактировал свой вопрос с классом, используемым для получения маркера auth с устройства Android. –

ответ

0
accountManager.getAuthToken(currentUsedAccount, "ah", false, 
          new GetAuthTokenCallback(), null); 

Ваша учетная записьTokenType неверна. Область API для контактов: http://www.google.com/m8/feeds/ для v2 или https://www.google.com/m8/feeds/ для v3

+0

Спасибо, Габриэль, ты спас меня! Я изменил его на: accountManager.getAuthToken (учетная запись, «cp», false, \t \t \t \t новый GetAuthTokenCallback(), null); –

 Смежные вопросы

  • Нет связанных вопросов^_^