我正在尝试将 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" />
我尝试将它集成到活动中并且它使登录成功但是当在片段中实现它时我遇到了这个问题
提前致谢!