Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check callback_url in twitter application

Tags:

android

i have loads of examples for O_Auth but no one is working properly and i guess the only thing is callback URL in every example, I am getting 401 error like consumer key or signature didn't match. I already seen so many examples on 401 the only thing that goes into my favor is my callback url.

android app cannot connect to twitter. Getting 401 when requesting access token with signpost within android with-signpost-within-android Android Dev - Callback URL not working... (0_o)

I already seen all these examples and many more.

But still i am not getting my point, If at the time of application form i use http://www.meomyo.com at callback url, Then what should i use it in my coding like android:scheme="?" android:host="?" currrently i am using other examples callbacks

    //private static final Uri CALLBACK_URI = Uri.parse("bloa-app://twitt");
private static final Uri CALLBACK_URI = Uri.parse("twitterapp://connect");

i have consumer key as well secret key, but in case of callback url i am stuck on it. If anyone want i can provide my consumer as well secret key.

public class OAuth extends Activity {

private static final String APP =   "OAUTH";

private Twitter twitter;
private OAuthProvider provider;
private CommonsHttpOAuthConsumer consumer;

private String CONSUMER_KEY =       "Xh3o8Gh1JQnklkUnTvvA";
private String CONSUMER_SECRET =    "SCLy6yoUSth53goAsYYkoqR4ZuBoaInyJXsm5PQR11I";
private String CALLBACK_URL =       "merabharatmahan://piyush";

private TextView tweetTextView;
private Button buttonLogin;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tweetTextView = (TextView)findViewById(R.id.tweet);
    buttonLogin = (Button)findViewById(R.id.ButtonLogin);
    buttonLogin.setOnClickListener(new OnClickListener() {  
        public void onClick(View v) {
            askOAuth();
        }
    });
}

/**
 * Open the browser and asks the user to authorize the app.
 * Afterwards, we redirect the user back here!
 */
private void askOAuth() {
    try {
        consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
        provider = new DefaultOAuthProvider("http://twitter.com/oauth/request_token",
                                            "http://twitter.com/oauth/access_token",
                                            "http://twitter.com/oauth/authorize");
        String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);
        Toast.makeText(this, "Please authorize this app!", Toast.LENGTH_LONG).show();
        this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
    } catch (Exception e) {
        Log.e(APP, e.getMessage());
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
    }
}


/**
 * As soon as the user successfully authorized the app, we are notified
 * here. Now we need to get the verifier from the callback URL, retrieve
 * token and token_secret and feed them to twitter4j (as well as
 * consumer key and secret).
 */
@Override
protected void onNewIntent(Intent intent) {

    super.onNewIntent(intent);

    Uri uri = intent.getData();
    if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {

        String verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);

        try {
            // this will populate token and token_secret in consumer
            provider.retrieveAccessToken(consumer, verifier);

            // TODO: you might want to store token and token_secret in you app settings!!!!!!!!
            AccessToken a = new AccessToken(consumer.getToken(), consumer.getTokenSecret());

            // initialize Twitter4J
            twitter = new TwitterFactory().getInstance();
            twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
            twitter.setOAuthAccessToken(a);

            // create a tweet
            Date d = new Date(System.currentTimeMillis());
            String tweet = "#OAuth working! " + d.toLocaleString();

            // send the tweet
            twitter.updateStatus(tweet);

            // feedback for the user...
            tweetTextView.setText(tweet);
            Toast.makeText(this, tweet, Toast.LENGTH_LONG).show();
            buttonLogin.setVisibility(Button.GONE);

        } catch (Exception e) {
            Log.e(APP, e.getMessage());
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }

    }
}

}

manifest code is

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".OAuth"
              android:label="@string/app_name"
              android:launchMode="singleInstance">
        <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:scheme="merabharatmahan" android:host="piyush" />
        </intent-filter>
    </activity>

</application

now i am getting communication with the service provider is failed: Received Authentication challenge is null. It is the simplest example that i put here.

like image 523
PiyushMishra Avatar asked May 09 '11 13:05

PiyushMishra


2 Answers

You must put whatever you think will be unique:

android:scheme="name-of-your-dog" android:host="something-else"

Oh, wait... maybe there's someone else owning a dog called like yours... so, use the package name of your app:

android:scheme="com.your.package" android:host="something-else"

And, if it's not working for you... I don't think it's related to the callback URL. How are you declaring your activity in the manifest? You added the android:launchMode="singleTask" parameter, right?

And, as the zombie guy pointed out, you must handle the callback in the onNewIntent method of your auth activity. Something like this:

final Uri uri = intent.getData();
if (uri != null && uri.getScheme().equals("name-of-your-dog")) {
    //etc...
}
like image 23
Cristian Avatar answered Nov 14 '22 21:11

Cristian


twitterapp://connect is your call back url.

In Android manifest.xml define your activity like this:

<activity android:name=".auth.SocialNetworkActivity"
    android:configChanges="orientation"
        android:label="Connect SNS" android:launchMode="singleTask">
        <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:scheme="twitterapp" android:host="connect" />
        </intent-filter>
    </activity>

Now, it will open twitter web page, and on successful authentication, your activities onNewIntent() callback method will be called.

In above example, use your own activity name.

Apart from that, twitter integration in my application is done using twitter4j.

like image 70
Zoombie Avatar answered Nov 14 '22 21:11

Zoombie