Twitter Login / Android Authentication

I am trying to implement twitter login button in fragment on Android using Fabric. I got it to work in action, but I can't get it to work in fragment.

Here is my TwitterFragment class (extends fragment)

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

TwitterAuthConfig authConfig = new TwitterAuthConfig(mTWITTER_KEY, mTWITTER_SECRET);
Fabric.with(super.getActivity(), new Twitter(authConfig));

View view = inflater.inflate(R.layout.twitter_fragment, container, false);

loginButton = (TwitterLoginButton) view.findViewById(R.id.twitter_login_button);

loginButton.setCallback(new Callback<TwitterSession>() {
    @Override
    public void success(Result<TwitterSession> result) {

        TwitterSession session = result.data;

        String msg = "@" + session.getUserName() + " logged in! (#" + session.getUserId() + ")";
        Toast.makeText(getActivity().getApplicationContext(), msg, Toast.LENGTH_LONG).show();
    }

    @Override
    public void failure(TwitterException exception) {
        Log.d("TwitterKit", "Login with Twitter failure", exception);
    }
});

return view;
}


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    //loginButton.onActivityResult(requestCode, resultCode, data);
    Fragment fragment = getFragmentManager().findFragmentById(R.id.twitter_login_button);
    if (fragment != null) {
        fragment.onActivityResult(requestCode, resultCode, data);
    }
}

And my twitter_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="15dp">

    <com.twitter.sdk.android.core.identity.TwitterLoginButton
        android:id="@+id/twitter_login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>

</LinearLayout>

I get this in the first two lines of the monitor

Authorization completed with an error
com.twitter.sdk.android.core.TwitterAuthException: Authorize failed.

Any ideas what the problem is?

Thanks,

+4
source share
2 answers

I had the same problem and solved it this way:

  • in MainActivity, configure Twitter and add the onActivityResult function:

TwitterAuthConfig authConfig = new TwitterAuthConfig (TWITTER_KEY, TWITTER_SECRET); Fabric.with (this is the new Twitter (authConfig));

 @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        FragmentManager fragment = getSupportFragmentManager();
        if (fragment != null) {
       fragment.findFragmentByTag("LoginFragment").onActivityResult(requestCode, resultCode, data);
        }
        else Log.d("Twitter", "fragment is null");
    }
  1. LoginFragment onActivityResult

    @Override

     public void onActivityResult(int requestCode, int resultCode, Intent data) {
                super.onActivityResult(requestCode, resultCode, data);
                twitterlogin.onActivityResult(requestCode, resultCode, data);
        }
    

, , , .

+4
  • .

private static final String TWITTER_KEY = " "; private static final String TWITTER_SECRET = " ";

  1. Twitter onCreate() .

TwitterAuthConfig authConfig = TwitterAuthConfig (TWITTER_KEY, TWITTER_SECRET); Fabric.with( Twitter (authConfig));

  1. onActivityResult() .

    @Override protected void onActivityResult (int requestCode, int resultCode, Intent data) {   super.onActivityResult(requestCode, resultCode, data);

    List<Fragment> allFragments = getSupportFragmentManager().getFragments();
    for (Fragment fragmento : allFragments) {
        if (fragmento instanceof TwitterSignIn) {
            ((TwitterSignIn) fragmento).onActivityResult(requestCode, resultCode, data);
        }
    }
    

    }

  2. twitter.
    'TwitterLoginButton twitterLoginButton',

5 > 'onCreateView' .

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState)
{
    // Inflate the layout for this fragment
    view = inflater.inflate(R.layout.fragment_twitter_sign_in, container, false);
    twitterLoginButton = (TwitterLoginButton)view.findViewById(R.id.twitterLogin);
    textView = (TextView) view.findViewById(R.id.textView);
    parentLayout = (RelativeLayout) view.findViewById(R.id.twitterFragmentParentLinearLayout);
    parentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Utility.hideKeyboard(v, getContext());
        }
    });

    twitterLoginButton.setCallback(new Callback<TwitterSession>() {
        @Override
        public void success(Result<TwitterSession> result) {

            TwitterSession session = result.data;

            Twitter.getApiClient().getAccountService().verifyCredentials(true, false).enqueue(new Callback<User>(){
                @Override
                public void success(Result<User> userResult)
                {
                    try
                    {
                        User user = userResult.data;

                        textView.setText("UserNmae:"+user.name+"\nEmail:"+user.email+"\nImageUrl:"+user.profileImageUrl);
                    } catch (Exception e)
                    {
                        e.printStackTrace();
                    }
                }

                @Override
                public void failure(TwitterException e)
                {

                }
            });
            String msg = "@" + session.getUserName() + " logged in! (#" + session.getUserId() + ")";

        }

        @Override
        public void failure(TwitterException exception) {
            Log.d("TwitterKit", "Login with Twitter failure", exception);
        }
    });

    return view;
}
  1. 'onctivityResult()' .

    @Override public void onActivityResult (int requestCode, int resultCode, Intent data) {   super.onActivityResult(requestCode, resultCode, data);   twitterLoginButton.onActivityResult(requestCode, resultCode, data); }

  2. , , .

0

Source: https://habr.com/ru/post/1615830/


All Articles