首页 > 解决方案 > android中片段的Twitter授权问题

问题描述

我正在尝试将 twitter 登录集成到我的应用程序中。我想在一些片段中实现它,但是当我登录并按下授权应用程序时出现此错误:

2020-09-17 06:46:03.911 17049-17049/? E/Twitter: Authorization completed with an error
    com.twitter.sdk.android.core.TwitterAuthException: Authorize failed.
        at com.twitter.sdk.android.core.identity.TwitterAuthClient.handleAuthorize(TwitterAuthClient.java:100)
        at com.twitter.sdk.android.core.identity.TwitterAuthClient.authorize(TwitterAuthClient.java:92)
        at com.twitter.sdk.android.core.identity.TwitterLoginButton$LoginClickListener.onClick(TwitterLoginButton.java:164)
        at android.view.View.performClick(View.java:6597)
        at android.view.View.performClickInternal(View.java:6574)
        at android.view.View.access$3100(View.java:778)
        at android.view.View$PerformClick.run(View.java:25885)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6669)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

这是我的 MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private AppBarConfiguration mAppBarConfiguration;
    private FusedLocationProviderClient fusedLocationClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TwitterConfig config = new TwitterConfig.Builder(MainActivity.this)
                .logger(new DefaultLogger(Log.DEBUG))
                .twitterAuthConfig(new TwitterAuthConfig(getResources().getString(R.string.com_twitter_sdk_android_CONSUMER_KEY), getResources().getString(R.string.com_twitter_sdk_android_CONSUMER_SECRET)))
                .debug(true)
                .build();
        Twitter.initialize(config);

        setContentView(R.layout.activity_main);

        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);

        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
                    getLocation();
                } else {
                    ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 44);
                }
            }
        });
        DrawerLayout drawer = findViewById(R.id.drawer_layout);
        NavigationView navigationView = findViewById(R.id.nav_view);
        // Passing each menu ID as a set of Ids because each
        // menu should be considered as top level destinations.
        mAppBarConfiguration = new AppBarConfiguration.Builder(
                R.id.nav_cars, R.id.nav_find_car, R.id.nav_gallery, R.id.nav_slideshow, R.id.nav_quotes, R.id.nav_signin, R.id.nav_signup)
                .setDrawerLayout(drawer)
                .build();
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        NavigationUI.setupActionBarWithNavController(this, navController, mAppBarConfiguration);
        NavigationUI.setupWithNavController(navigationView, navController);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onSupportNavigateUp() {
        NavController navController = Navigation.findNavController(this, R.id.nav_host_fragment);
        return NavigationUI.navigateUp(navController, mAppBarConfiguration)
                || super.onSupportNavigateUp();
    }

    public static void startMainActivity(Activity activity) {
        Intent intent = new Intent(activity, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
        activity.startActivity(intent);
        activity.finish();
    }

    private void getLocation() {
        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            // TODO: Consider calling
            //    ActivityCompat#requestPermissions
            // here to request the missing permissions, and then overriding
            //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
            //                                          int[] grantResults)
            // to handle the case where the user grants the permission. See the documentation
            // for ActivityCompat#requestPermissions for more details.
            return;
        }

        fusedLocationClient.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
            @Override
            public void onSuccess(Location location) {

                if (location != null) {
                    Geocoder mGeocoder = new Geocoder(MainActivity.this, Locale.getDefault());
                    try {
                        List<Address> addresses = mGeocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
                        Log.e(TAG, "Address Line : " + addresses.get(0).getAddressLine(0));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else {
                    LocationUtil.enableLoc(MainActivity.this);
                }
            }
        });

    }

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

        if (requestCode == 306 && resultCode == Activity.RESULT_OK) {
            getLocation();
        }

        FragmentManager manager = getSupportFragmentManager();
        if (manager != null) {
            manager.findFragmentById(R.id.nav_host_fragment).onActivityResult(requestCode, resultCode, data);
            Log.d("Twitter", "fragment is true");
        }
        else Log.d("Twitter", "fragment is null");
    }

}

这是我的 SigninFragment.java

public class SigninFragment extends Fragment {

    private AppBarConfiguration mAppBarConfiguration;
    FragmentSigninBinding binding;
    CallbackManager callbackManager;
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);



        binding = DataBindingUtil.inflate(
                inflater, R.layout.fragment_signin, container, false);


        SigninViewModel signinViewModel = new ViewModelProvider(this, new SigninViewModelFactory(this, new SigninModel())).get(SigninViewModel.class);
        binding.setSignin(signinViewModel);
        binding.setLifecycleOwner(this);



        initFacebookLogin();
        initTwitterLogin();


        return binding.getRoot();
    }

    private void initFacebookLogin() {
        callbackManager = CallbackManager.Factory.create();

        binding.fbLoginButton.setFragment(this);

        // Callback registration
        binding.fbLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // App code

                Log.e("fblogin", loginResult.getAccessToken().getUserId());
            }

            @Override
            public void onCancel() {
                // App code
            }

            @Override
            public void onError(FacebookException exception) {
                // App code
            }
        });
    }

    private void initTwitterLogin() {

        binding.twLoginButton.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {
                // Do something with result, which provides a TwitterSession for making API calls

                // Do something with result, which provides a TwitterSession for making API calls
                TwitterSession session = TwitterCore.getInstance().getSessionManager().getActiveSession();
                TwitterAuthToken authToken = session.getAuthToken();
                //String token = authToken.token;
                //  String secret = authToken.secret;

                Log.e("login success", "twitter");
                loginMethod(session);
            }

            @Override
            public void failure(TwitterException exception) {
                // Do something on failure

                Toast.makeText(getActivity(),"Login failed", Toast.LENGTH_LONG).show();
            }
        });
    }

    public void loginMethod(TwitterSession twitterSession){
        String userName=twitterSession.getUserName();
//        Intent intent= new Intent(getActivity(),MainActivity.class);
//        intent.putExtra("username",userName);
//        startActivity(intent);
    }

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

        // Pass the activity result to the fragment, which will then pass the result to the login
        // button.
        callbackManager.onActivityResult(requestCode, resultCode, data);

        binding.twLoginButton.onActivityResult(requestCode, resultCode, data);
//        FragmentManager manager = getActivity().getSupportFragmentManager();
//        Fragment fragment = manager.findFragmentById(R.id.nav_signin);
//        if (fragment != null) {
//            Log.e("isfragment", "true");
//            fragment.onActivityResult(requestCode, resultCode, data);
//        }
    }


}

我也在清单中添加了这一行

<activity android:name="com.twitter.sdk.android.core.identity.OAuthActivity" />

我尝试将它集成到活动中并且它使登录成功但是当在片段中实现它时我遇到了这个问题

提前致谢!

标签: androidfragmenttwitter-login

解决方案


推荐阅读