2012-03-15 8 views
0

私は以下の方法があります:ヌル例外: - 認証なしのヘッダー情報さえ設定.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) 
.... 

私が設定shoud何教えてください適切に動作するためにcontactsService(setUserTokenを除く)に?

私はアンドロイドデバイスから認証文字列を取り出し(ユーザーにこれを確認させることによって)、セキュリティ保護されたチャネルを介してサーバーに渡しました(私はアンドロイド/ iPhone開発者です) - 今、私はこの連絡先に関するデータを収集したいと思っています(最初の姓とプロバイダーのuid - 私のアプリでユーザーとデータベースが必要です)。

私は本当にこのタスクを完了する必要がありますので、どうすればこの問題を解決できるか知っていれば、助けてください!

以下のクラスは、アンドロイドデバイスから認証文字列を取得する方法を示しています。

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/...」 'が、「不正なリクエスト」例外をスローします。無効なトークンを使用して「認証ヘッダー情報がありません」という例外が発生したことが判明した唯一の方法です。 –

+0

どのようにAndroidから認証トークンを取得しましたか?どんな風に見えますか ? –

+0

アンドロイドデバイスから認証トークンを取得するために使用されたクラスで質問を編集しました。 –

答えて

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

あなたのアカウントのトークンタイプが間違っています。連絡先APIスコープは、v2の場合はhttp://www.google.com/m8/feeds/v3の場合はhttps://www.google.com/m8/feeds/の場合

+0

ありがとう、ガブリエル、あなたは私を救った! accountManager.getAuthToken(account、 "cp"、false、 \t \t \t \t新しいGetAuthTokenCallback()、null); –

関連する問題