如何在twitter应用程序中检查callback_url

时间:2011-05-09 13:34:12

标签: android

我有很多O_Auth的例子,但是没有人正常工作,我想在每个例子中唯一的回调URL,我得到401错误,如消费者密钥或签名不匹配。我已经在401上看到了很多这样的例子,唯一让我感兴趣的是我的回调网址。

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)

我已经看过所有这些例子以及更多。

但我仍然没有明白我的观点,如果在申请表格时我在回调网址上使用http://www.meomyo.com,那么我应该在编码时使用它 像android:scheme =“?” Android版: “?” 主持人= 我正在使用其他示例回调

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

我有消费者密钥以及密钥,但在回调网址的情况下,我被卡住了。 如果有人想我可以提供我的消费者以及秘密密钥。

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

    }
}

}

清单代码是

<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

现在我正在与服务提供商进行通信失败:收到的身份验证质询为空。这是我放在这里最简单的例子。

2 个答案:

答案 0 :(得分:8)

twitterapp:// connect是你的回电网址。

在Android manifest.xml中定义您的活动:

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

现在,它将打开Twitter网页,并且在成功验证后,将调用您的活动onNewIntent()回调方法。

在上面的示例中,使用您自己的活动名称。

除此之外,我的应用程序中的twitter集成是使用twitter4j完成的。

答案 1 :(得分:1)

你必须放置你认为独特的东西:

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

哦,等等......也许还有其他人拥有像你一样的狗...所以,使用你的应用程序的包名:

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

并且,如果它不适合你......我认为它与回调URL无关。你是如何在清单中宣布自己的活动的?您添加了android:launchMode="singleTask"参数,对吗?

而且,正如僵尸家伙指出的那样,你必须在你的auth活动的onNewIntent方法中处理回调。像这样:

final Uri uri = intent.getData();
if (uri != null && uri.getScheme().equals("name-of-your-dog")) {
    //etc...
}