Question

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());
            }

        }
    }
Was it helpful?

Solution

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.

OTHER TIPS

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top