2012-10-29 20 views
10

我建立這個Twitter的應用程序,其中瀏覽器被稱爲從我的主要活動來驗證.. 在一個線程中運行下面的代碼(的AsyncTask)onNewIntent(意向)不工作,因爲它應該

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

    } 
} 

但儘管如此,persist..another東西是問題,一切工作在仿真器(2.3)很好.. 在我的Android device..its 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> 
+0

看來問題是Android 2.3.5和2.3.6 .. –

回答

0

我不熟悉與Twitter athentication過程,但你可以嘗試FLAG_ACTIVITY_CLEAR_TOP而不是Intent.FLAG_ACTIVITY_SINGLE_TOP。如果在堆棧的頂部您的主要活動中

後者只適用於你,其他的清除棧,並確保在頂部的活動。

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

} 

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

看看這個......它可以幫助你..

相關問題