问题描述
我正在尝试将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 (将#修改为@)