質問

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 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.

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top