【问题标题】:onNewIntent(intent) not working as it shouldonNewIntent(intent) 不能正常工作
【发布时间】:2012-10-19 02:06:54
【问题描述】:

我正在构建这个 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>

【问题讨论】:

  • 看来问题出在 Android 2.3.5 和 2.3.6..

标签: android oauth


【解决方案1】:

我不熟悉 Twitter 的认证过程,但你可以试试FLAG_ACTIVITY_CLEAR_TOP,而不是Intent.FLAG_ACTIVITY_SINGLE_TOP

仅当您的主要活动在堆栈顶部时,后者才对您有效,另一个清除堆栈并确保您的活动在顶部。

【讨论】:

    【解决方案2】:

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

    ConstantsTwit.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);
    

    看看这个...它可能对你有帮助..

    【讨论】:

      猜你喜欢
      • 2013-03-30
      • 2010-11-30
      • 2021-10-02
      • 2017-08-06
      • 2013-11-22
      • 1970-01-01
      • 2013-09-10
      • 2017-04-05
      • 2013-07-25
      相关资源
      最近更新 更多