我正在我的应用中实现推特认证。
出于某种原因,在触摸登录并返回我的应用后,
getIntent().getData();
始终为空
迁移是我的一些配置问题,因为在测试应用程序中,我使它工作正常。
我的应用程序有webview吗?
这是我的代码:
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());
}
}
}
答案 0 :(得分:0)
您的应用中指定的CallBack网址可能与Twitter开发者控制台指定的回拨网址不同,或者更改回调网址可能有所帮助。
答案 1 :(得分:0)
问题是我在移动设备中运行应用程序而非模拟器,您需要添加线程以获取来自Twitter CallBack的响应。像这样: -
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();
之后检查你的Long以显示回复