나는 아래의 방법이 있습니다널 예외 : - 아니 인증 헤더 정보도 설정 .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)
....
내가 설정 갈까요 무엇인지 알려주세요 적절한 작업을 위해 contactsService (setUserToken 제외)에?
안드로이드/아이폰 개발자 인 gData를 사용하지 않았습니다 - 사용자에게 인증을 허용하여 안드로이드 장치에서 인증 문자열을 가져 와서 보안 채널을 통해 서버에 전달합니다 - 이제이 연락처에 대한 데이터를 수집하고 싶습니다 (첫 번째 성 및 공급자 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);
}
}
감사합니다,
알렉스.
여기에 몇 개의 추가 공백이 있습니다 : "../feeds/contact/ ..." "하지만"잘못된 요청 "예외가 발생합니다. 유효하지 않은 토큰을 사용하여 "인증 헤더 정보 없음"예외를 발견 한 유일한 방법. –
Android에서 인증 토큰을 어떻게 얻었습니까? 그것은 어떻게 생겼어 ? –
나는 안드로이드 장치에서 인증 토큰을 얻는 데 사용되는 클래스로 내 질문을 편집했습니다. –