Показать поиск в твиттере с помощью ANDROID и Twitter Kit (не из ткани) - PullRequest
0 голосов
/ 31 декабря 2018

Я начинаю новый простой проект, который показывает фид на домашнем экране с некоторым хэстагом из твиттера

Я создал приложение для твиттера с панели инструментов 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);
        }
    }

}
...