14

我正在构建这个 twitter 应用程序,其中调用浏览器以从我的主要活动进行身份验证.. 在线程中运行以下代码(AsyncTask)

Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND);
context.startActivity(intent);

这里

context is the context of main activity..the uri is returned through `intent`..

经过身份验证后,它要做的是回到我的主要活动,回到它现在的状态。现在发生的事情是,它创建了另一个主要活动的实例。

我在用

@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent); 
    SharedPreferences prefs = getSharedPreferences("twitter", 0);
    final Uri uri = intent.getData();
    if (uri != null && uri.getScheme().equals(Constants.OAUTH_CALLBACK_SCHEME)) {

        setLoggedIn(true, tlogout);
        tstatus=true;

        new RetrieveAccessTokenTask(this,consumer,provider,prefs,tstring).execute(uri);

    }
}

但是,问题仍然存在..另一件事是,在模拟器(2.3)中一切正常..在我的设备中不起作用..它的 Android 2.3.6

我的清单是

<activity
    android:name=".mainActivity"

    android:launchMode="singleTask"

    android:label="@string/title_activity_main" >
    <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="x-oauthflow-twitter" android:host="callback" />

    </intent-filter>
</activity>
4

2 回答 2

0

我不熟悉 Twitter 认证过程,但您可以尝试FLAG_ACTIVITY_CLEAR_TOP代替Intent.FLAG_ACTIVITY_SINGLE_TOP.

后者仅适用于您的主要活动在堆栈顶部,另一个清除堆栈并确保您的活动在顶部。

于 2012-10-29T18:15:43.463 回答
0

OAuthRequestTokenTask.java

package com.android.twit;

import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.util.Log;

public class OAuthRequestTokenTask extends AsyncTask<Void, Void, Void> {

final String TAG = getClass().getName();
private Context context;
private OAuthProvider provider;
private OAuthConsumer consumer;

/**
 * 
 * We pass the OAuth consumer and provider.
 * 
 * @param context
 *            Required to be able to start the intent to launch the browser.
 * @param provider
 *            The OAuthProvider object
 * @param consumer
 *            The OAuthConsumer object
 */
public OAuthRequestTokenTask(Context context, OAuthConsumer consumer,
        OAuthProvider provider) {
    this.context = context;
    this.consumer = consumer;
    this.provider = provider;
}

/**
 * 
 * Retrieve the OAuth Request Token and present a browser to the user to
 * authorize the token.
 * 
 */
@Override
protected Void doInBackground(Void... params) {

    try {
        Log.i(TAG, "Retrieving request token from Google servers");
        final String url = provider.retrieveRequestToken(consumer,
                ConstantsTwit.OAUTH_CALLBACK_URL);
        Log.i(TAG, "Popping a browser with the authorize URL : " + url);
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url))
                .setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
                        | Intent.FLAG_ACTIVITY_NO_HISTORY
                        | Intent.FLAG_FROM_BACKGROUND);
        context.startActivity(intent);
    } catch (Exception e) {
        Log.e(TAG, "Error during OAUth retrieve request token", e);
    }

    return null;
}

}

PrepareRequestTokenActivity.java

package com.android.twit;

import oauth.signpost.OAuth;
import oauth.signpost.OAuthConsumer;
import oauth.signpost.OAuthProvider;
import oauth.signpost.basic.DefaultOAuthProvider;
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.util.Log;


public class PrepareRequestTokenActivity extends Activity {

final String TAG = getClass().getName();

private OAuthConsumer consumer;
private OAuthProvider provider;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        // CommonsHttpOAuthConsumer
        this.consumer = new CommonsHttpOAuthConsumer(
                ConstantsTwit.CONSUMER_KEY, ConstantsTwit.CONSUMER_SECRET);
        // this.provider = new
        // CommonsHttpOAuthProvider(Constants.REQUEST_URL,
        // Constants.ACCESS_URL, Constants.AUTHORIZE_URL);
        this.provider = new DefaultOAuthProvider(ConstantsTwit.REQUEST_URL,
                ConstantsTwit.ACCESS_URL, ConstantsTwit.AUTHORIZE_URL);
    } catch (Exception e) {
        Log.e(TAG, "Error creating consumer / provider", e);
    }

    Log.i(TAG, "Starting task to retrieve request token.");
    new OAuthRequestTokenTask(this, this.consumer, this.provider).execute();
}

/**
 * Called when the OAuthRequestTokenTask finishes (user has authorized the
 * request token). The callback URL will be intercepted here.
 */
@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    Log.e("", "onNewIntent() is called...");
    SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(this);
    final Uri uri = intent.getData();
    if (uri != null
            && uri.getScheme().equals(ConstantsTwit.OAUTH_CALLBACK_SCHEME)) {
        Log.i(TAG, "Callback received : " + uri);
        Log.i(TAG, "Retrieving Access Token");
        new RetrieveAccessTokenTask(this, consumer, provider, prefs)
                .execute(uri);
        finish();
    }
}

public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Void> {

    private Context context;
    private OAuthProvider provider;
    private OAuthConsumer consumer;
    private SharedPreferences prefs;

    public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer,
            OAuthProvider provider, SharedPreferences prefs) {
        this.context = context;
        this.consumer = consumer;
        this.provider = provider;
        this.prefs = prefs;
    }

    /**
     * Retrieve the oauth_verifier, and store the oauth and
     * oauth_token_secret for future API calls.
     */
    @Override
    protected Void doInBackground(Uri... params) {
        final Uri uri = params[0];
        final String oauth_verifier = uri
                .getQueryParameter(OAuth.OAUTH_VERIFIER);

        try {
            provider.retrieveAccessToken(consumer, oauth_verifier);

            final Editor edit = prefs.edit();
            edit.putString(OAuth.OAUTH_TOKEN, consumer.getToken());
            edit.putString(OAuth.OAUTH_TOKEN_SECRET,
                    consumer.getTokenSecret());
            edit.commit();

            String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
            String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");

            consumer.setTokenWithSecret(token, secret);
            // context.startActivity(new Intent(context,
            // AndroidTwitterSample.class));

            executeAfterAccessTokenRetrieval();

            Log.e(TAG, "OAuth - Access Token Retrieved");

        } catch (Exception e) {
            Log.e(TAG, "OAuth - Access Token Retrieval Error", e);
        }

        return null;
    }

    private void executeAfterAccessTokenRetrieval() {
        String msg = getIntent().getExtras().getString("tweet_msg");
        String path = getIntent().getExtras().getString("imagePath");
        try {
            TwitterUtils.sendTweet(prefs, msg, path);
        } catch (Exception e) {
            Log.e(TAG, "OAuth - Error sending to Twitter", e);
        }
    }
}

}

常量Twit.java

package com.android.twit;

public class ConstantsTwit {

public static final String CONSUMER_KEY = "xxxxxxxxxxxxxxx";
public static final String CONSUMER_SECRET = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

public static final String REQUEST_URL = "  https://api.twitter.com/oauth/request_token";
public static final String ACCESS_URL = "https://api.twitter.com/oauth/access_token";
public static final String AUTHORIZE_URL = "https://api.twitter.com/oauth/authorize";

public static final String OAUTH_CALLBACK_SCHEME = "x-test-oauth-twitter";
public static final String OAUTH_CALLBACK_HOST = "callback";
public static final String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME
        + "://" + OAUTH_CALLBACK_HOST;

}

在 AndroidManifest.xml 中

<activity
        android:name="com.android.twit.PrepareRequestTokenActivity"
        android:configChanges="touchscreen|keyboard|keyboardHidden|navigation|orientation"
        android:excludeFromRecents="true"
        android:launchMode="singleTask"
        android:windowSoftInputMode="stateAlwaysHidden" >
        <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="callback"
                android:scheme="x-test-oauth-twitter" />
        </intent-filter>
    </activity>

TwitterUtils.java

package com.android.twit;

import oauth.signpost.OAuth;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.http.AccessToken;
import android.app.Activity;
import android.content.SharedPreferences;
import android.widget.Toast;

public class TwitterUtils {

public static Activity tmp_Add_Daily_Mood;

public static boolean isAuthenticated(SharedPreferences prefs) {

    String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
    String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");

    AccessToken a = new AccessToken(token, secret);
    Twitter twitter = new TwitterFactory().getInstance();
    twitter.setOAuthConsumer(ConstantsTwit.CONSUMER_KEY,
            ConstantsTwit.CONSUMER_SECRET);
    twitter.setOAuthAccessToken(a);

    try {
        twitter.getAccountSettings();
        return true;
    } catch (TwitterException e) {
        return false;
    }
}

public static void sendTweet(SharedPreferences prefs, String msg)
        throws Exception {
    String token = prefs.getString(OAuth.OAUTH_TOKEN, "");
    String secret = prefs.getString(OAuth.OAUTH_TOKEN_SECRET, "");

    AccessToken a = new AccessToken(token, secret);
    Twitter twitter = new TwitterFactory().getInstance();
    twitter.setOAuthConsumer(ConstantsTwit.CONSUMER_KEY,
            ConstantsTwit.CONSUMER_SECRET);
    twitter.setOAuthAccessToken(a);
    twitter.updateStatus(msg);
}


}

用法

Intent i = new Intent(getApplicationContext(),
                    PrepareRequestTokenActivity.class);
i.putExtra("tweet_msg", getTweetMsg());         
startActivity(i);

看看这个...它可能会帮助你..

于 2012-11-02T05:11:23.560 回答