Twitter授权问题与Android中的片段

问题描述

我正在尝试将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,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,Intent data) {
        super.onActivityResult(requestCode,data);

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

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


}

我也将此行添加到清单中

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

我尝试将其集成到活动中,这使登录成功,但是在片段中实现它时出现此问题

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)