The CallBack URL specified in your app could be different from the Callback URL specified at the twitter developer console, or changing the callback url may help.
android twitter authentication callback is null
-
10-10-2022 - |
سؤال
I am implementing a twitter autentication in my app.
For some reason, after touching sign in and returning to my app, the
getIntent().getData();
is always null
It migth be some configuration issue of my because in a test app I made it works fine.
Could it has something to do that my app has a webview?
This is my code:
AndroidManifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.xxx"
android:versionCode="X"
android:versionName="X" >
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature
android:name="android.hardware.camera.autofocus"
android:required="false" />
<permission
android:name="your_package_name.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="your_package_name.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" />
<uses-sdk
android:minSdkVersion="9"
android:targetSdkVersion="15" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@android:style/Theme.Light.NoTitleBar"
android:windowSoftInputMode="adjustPan" >
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
<activity
android:name="xxx.xxx.xxx.Main"
android:configChanges="orientation|keyboardHidden|screenSize"
android:excludeFromRecents="false"
android:label="@string/title_activity_xxx"
android:launchMode="singleTask"
android:taskAffinity=""
android:windowSoftInputMode="adjustResize" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data
android:host="connect"
android:scheme="xxx" />
</intent-filter>
</activity>
// Other stuff
</aplication>
</manifest>
twitterlogin:
public void loginToTwitter() {
// Check if already logged in
ConfigurationBuilder builder = new ConfigurationBuilder();
builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);
twitter4j.conf.Configuration configuration = builder.build();
TwitterFactory factory = new TwitterFactory(configuration);
twitter = factory.getInstance();
try {
requestToken = twitter.getOAuthRequestToken(TWITTER_CALLBACK_URL);
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri
.parse(requestToken.getAuthenticationURL())));
} catch (TwitterException e) {
e.printStackTrace();
}
}
private boolean isTwitterLoggedInAlready() {
// return twitter login status from Shared Preferences
SharedPreferences preferences = getSharedPreferences(
Class.PREF_FILE_NAME, Context.MODE_PRIVATE);
return preferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false);
}
}
onResume:
if (!isTwitterLoggedInAlready()) {
Uri uri = getIntent().getData();
if (uri != null) {
Log.v("uri", uri.toString());
}
if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {
// oAuth verifier
String verifier = uri
.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
try {
// Get the access token
AccessToken accessToken = twitter.getOAuthAccessToken(
requestToken, verifier);
SharedPreferences preferences = getSharedPreferences(
Class.PREF_FILE_NAME, Context.MODE_PRIVATE);
// Shared Preferences
Editor e = preferences.edit();
// After getting access token, access token secret
// store them in application preferences
e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken());
e.putString(PREF_KEY_OAUTH_SECRET,
accessToken.getTokenSecret());
// Store login status - true
e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);
e.commit(); // save changes
Log.e("Twitter OAuth Token", "> " + accessToken.getToken());
// Getting user details from twitter
// For now i am getting his name only
long userID = accessToken.getUserId();
User user = twitter.showUser(userID);
String username = user.getName();
AccountSettings a = twitter.getAccountSettings();
Log.v("acc settings", a.toString());
Log.v("user", user.toString());
} catch (Exception e) {
// Check log for login errors
Log.e("Twitter Login Error", "> " + e.getMessage());
}
}
}
المحلول
نصائح أخرى
The problem I thing you are run the app in mobile device not emulator , you need to add Thread to get the response from twitter CallBack . like this :-
AccessToken accessToken //define it before onCreate() function
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
accessToken = twitter.getOAuthAccessToken(
requestToken, verifier);
long userID = accessToken.getUserId();
User user = twitter.showUser(userID);
String username = user.getName();
Log.e("Tn re", "> " + username);
} catch (TwitterException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.e("Twitter OAuth Token", "> " + accessToken.getToken());
}
}).start();
After that check your Long to show the response
لا تنتمي إلى StackOverflow