Я начинаю новый простой проект, который показывает фид на домашнем экране с некоторым хэстагом из твиттера
Я создал приложение для твиттера с панели инструментов dev и получил CONSUMER_KEY и CONSUMER_SECRET.
Проблема заключается в интеграции, идея заключается в том, что пользователь вошел в систему с гостем пользователя.Но я не знаю, как с или без пользователя (guestUser) я получаю несколько подобных ошибок
например, сейчас я получаю эту ошибку с кодом ниже
E/Twitter: Failed to get app auth token
com.twitter.sdk.android.core.TwitterApiException: HTTP request failed, Status: 403
at com.twitter.sdk.android.core.Callback.onResponse(Callback.java:42)
at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:70)
at android.os.Handler.handleCallback(Handler.java:790)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:172)
at android.app.ActivityThread.main(ActivityThread.java:6590)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Thisмой код прямо сейчас.
package com.javapapers.android.twitterfeedreader.app;
import android.app.Activity;
import android.app.ListActivity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.media.MediaBrowserCompat;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
import com.javapapers.android.util.AndroidNetworkUtility;
import com.twitter.sdk.android.core.Callback;
import com.twitter.sdk.android.core.DefaultLogger;
import com.twitter.sdk.android.core.GuestSession;
import com.twitter.sdk.android.core.Result;
import com.twitter.sdk.android.core.Twitter;
import com.twitter.sdk.android.core.TwitterApiClient;
import com.twitter.sdk.android.core.TwitterApiException;
import com.twitter.sdk.android.core.TwitterAuthConfig;
import com.twitter.sdk.android.core.TwitterConfig;
import com.twitter.sdk.android.core.TwitterCore;
import com.twitter.sdk.android.core.TwitterException;
import com.twitter.sdk.android.core.TwitterSession;
import com.twitter.sdk.android.core.internal.TwitterApiConstants;
import com.twitter.sdk.android.core.models.Search;
import com.twitter.sdk.android.core.models.SearchMetadata;
import com.twitter.sdk.android.core.models.Tweet;
import com.twitter.sdk.android.tweetui.CompactTweetView;
import com.twitter.sdk.android.tweetui.SearchTimeline;
import com.twitter.sdk.android.tweetui.TweetTimelineListAdapter;
import com.twitter.sdk.android.tweetui.TweetTimelineRecyclerViewAdapter;
import java.util.logging.Level;
import retrofit2.Call;
public class MainActivity extends Activity {
private TwitterApiClient twitterApiClient;
final static String twitterScreenName = "buendomingo";
final static String TAG = "MainActivity";
TwitterCore core;
RecyclerView recyclerView;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
super.setContentView(R.layout.main);
recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(null);
Twitter.initialize(this);
TwitterConfig config = new TwitterConfig.Builder(this)
.logger(new DefaultLogger(Log.DEBUG))
.twitterAuthConfig(new TwitterAuthConfig(
getString(R.string.com_twitter_sdk_android_CONSUMER_KEY),
getString(R.string.com_twitter_sdk_android_CONSUMER_SECRET)))
.debug(true)
.build();
Twitter.initialize(config);
initTwitterSearch();
}
public void doSearch() {
final Call<Search> search = twitterApiClient.getSearchService()
.tweets("#hiking", null, null, null, null, 50, null, null, null, true);
search.enqueue(new SearchCallback());
}
public class SearchCallback extends Callback<Search> {
@Override
public void success(Result<Search> result) {
if (result.data.tweets.size() > 0) {
recyclerView.setAdapter(new TweetsAdapter(result.data));
} else {
//error 215 show
}
}
@Override
public void failure(TwitterException e) {
final TwitterApiException apiException = (TwitterApiException) e;
final int errorCode = apiException.getErrorCode();
Log.d(TAG, "error code " + errorCode, apiException);
if (errorCode == TwitterApiConstants.Errors.APP_AUTH_ERROR_CODE || errorCode == TwitterApiConstants.Errors.GUEST_AUTH_ERROR_CODE) {
// Session is bad, so clear existing sessions and retry
// TODO max retries to prevent looping
core.getSessionManager().clearActiveSession();
initTwitterSearch();
} else {
}
}
}
private void initTwitterSearch() {
core = TwitterCore.getInstance();
TwitterSession session = core.getSessionManager().getActiveSession();
if (session != null) {
twitterApiClient = core.getApiClient(session);
} else {
twitterApiClient = core.getGuestApiClient();
}
if (twitterApiClient != null) {
doSearch();
}
}
private class TweetsAdapter extends RecyclerView.Adapter {
private static final int TYPE_TWEET = 0;
private final Search search;
public TweetsAdapter(Search search) {
this.search = search;
}
@Override
public int getItemViewType(int position) {
return TYPE_TWEET;
}
@Override
public int getItemCount() {
return search.tweets.size();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case TYPE_TWEET:
CompactTweetView view = new CompactTweetView(parent.getContext(), search.tweets.get(0));
return new TweetsItemViewHolder(view);
default:
throw new IllegalArgumentException();
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case TYPE_TWEET:
TweetsItemViewHolder tivh = (TweetsItemViewHolder) holder;
tivh.bindTweet(search.tweets.get(position));
break;
}
}
}
public void testGetGuestApiClient_twitterNotInitialized() throws Exception {
try {
TwitterCore.getInstance().getGuestApiClient();
} catch (IllegalStateException ex) {
ex.printStackTrace();
}
}
private class TweetsItemViewHolder extends RecyclerView.ViewHolder {
private final CompactTweetView view;
public TweetsItemViewHolder(CompactTweetView view) {
super(view);
this.view = view;
}
public void bindTweet(Tweet tweet) {
view.setTweet(tweet);
}
}
}