2013-07-10 4 views
0

Я пытаюсь интегрировать Facebook и Twitter в мое приложение. Когда пользователь нажимает на кнопку, я показываю диалог с двумя вариантами Facebook и Twitter. когда пользователь нажимает на Twitter, я закрываю диалог и звоню в Twitter PrepareRequestToken activity.onActivityResult() вызывается после Dialog Dismiss в Android

Вот мой PrepareRequestToken класс:

public class PrepareRequestTokenActivity extends Activity { 

    final String TAG = getClass().getName(); 
    private Twitter twitter; 
    private CommonsHttpOAuthConsumer consumer; 
    private OAuthProvider provider; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getConsumerProvider(); 
     try { 
      consumer = new CommonsHttpOAuthConsumer(ConstantValues.CONSUMER_KEY, ConstantValues.CONSUMER_SECRET); 
      provider = new DefaultOAuthProvider(
        "https://api.twitter.com/oauth/request_token", 
        "https://api.twitter.com/oauth/access_token", 
        "https://api.twitter.com/oauth/authorize"); 
      String authUrl = provider.retrieveRequestToken(consumer, ConstantValues.CALLBACK_URL); 
      Toast.makeText(this, "Please authorize this app!", Toast.LENGTH_LONG).show(); 
      setConsumerProvider(); 
      startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))); 
     } catch (Exception e) { 
      Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show(); 
     } 
    } 


    @Override 
    public void onNewIntent(Intent intent) { 

     SharedPreferences prefs = PreferenceManager 
       .getDefaultSharedPreferences(this); 
     final Uri uri = intent.getData(); 
     if (uri != null && uri.getScheme().equals(ConstantValues.OAUTH_CALLBACK_SCHEME)) { 
      new RetrieveAccessTokenTask(this, consumer, provider, prefs).execute(uri); 
      //showMessage(); 
     } 
//  finish(); 
     super.onNewIntent(intent); 
    } 

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

     private OAuthProvider provider; 
     private OAuthConsumer consumer; 

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

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

       AccessToken a = new AccessToken(consumer.getToken(), consumer.getTokenSecret()); 
       storeAccessToken(a); 

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

       //Log.e("Login", "Twitter Initialised"); 
       System.out.println("finishing...!!"); 
       Intent returnIntent = new Intent(); 
       returnIntent.putExtra("valid", "valid"); 
       setResult(RESULT_OK, returnIntent); 
//    finish(); 
       Log.i(TAG, "OAuth - Access Token Retrieved"); 
      } catch (Exception e) { 
       Log.e(TAG, "OAuth - Access Token Retrieval Error", e); 
       setResult(RESULT_CANCELED); 
//    finish(); 
      } 

      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      System.out.println("onpostexecute...!!"); 
      finish(); 
     } 

    } 
    private void setConsumerProvider() { 
     if (provider!=null){ 
      ((DogRescueApplication)getApplication()).setProvider(provider); 
     } 
     if (consumer!=null){ 
      ((DogRescueApplication)getApplication()).setConsumer(consumer); 
     } 
    } 
    private void getConsumerProvider() { 
     OAuthProvider p = ((DogRescueApplication)getApplication()).getProvider(); 
     if (p!=null){ 
      provider = p; 
     } 
     CommonsHttpOAuthConsumer c = ((DogRescueApplication)getApplication()).getConsumer(); 
     if (c!=null){ 
      consumer = c; 
     } 
    } 
    private void storeAccessToken(AccessToken a) { 
     System.out.println("Storing keys!!"); 
     SharedPreferences settings = getSharedPreferences(ConstantValues.PREFS_NAME, MODE_PRIVATE); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putString("accessTokenToken", a.getToken()); 
     editor.putString("accessTokenSecret", a.getTokenSecret()); 
     editor.commit(); 
    } 

} 

Я начал эту деятельность с помощью:

give_twitter.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
        Intent i = new Intent(CampaignActivity.this,PrepareRequestTokenActivity.class); 
        startActivityForResult(i, TWITTER_AUTH_REQ_CODE); 
       dialog.dismiss(); 
      } 
     }); 

и погрузо ответ как:

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
switch (requestCode) { 

     case TWITTER_AUTH_REQ_CODE: 
      if(resultCode == RESULT_OK){ 
       if(checkForSavedLogin()){ 
//     String post_msg = "Hello.. Mobile APp"; 
//     TwitterUtilities.postTweet(twitter, post_msg); 
        getTwitterProfileData(); 
       } 
      } 
      break; 
     } 
    } 

Но onActivityResult() метод не вызывается в ответ .. Пожалуйста, помогите мне в этом ..

+0

У вас есть ошибки? –

+0

нет .. я не получаю никаких ошибок .. когда диалог отклонен, вызывается метод onactivityresult .. но он не звонит, когда я получил токен .. – wolverine

ответ

0

Проблема решена. После возврата из Интернета активность создается снова, поэтому я использовал небольшое условие, чтобы проверить, нет ли данных о намерениях в моем OnCreate. с помощью этого кода я могу получить результат:

if (getIntent().getData()!=null) { 
      Uri uri = getIntent().getData(); 
      if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) { 
       String verifier = uri.getQueryParameter(URL_TWITTER_OAUTH_VERIFIER); 
       try { 
        AccessToken accessToken = twitter.getOAuthAccessToken(requestToken, verifier); 
        // Shared Preferences 
        Editor e = mSharedPreferences.edit(); 
        e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken()); 
        e.putString(PREF_KEY_OAUTH_SECRET,accessToken.getTokenSecret()); 
        e.putBoolean(PREF_KEY_TWITTER_LOGIN, true); 
        e.commit(); 
        Log.e("Twitter OAuth Token", "> " + accessToken.getToken()); 
        getTwitterProfileData(); 

       } catch (Exception e) { 
        Log.e("Twitter Login Error", "> " + e.getMessage()); 
       } 
      } 
     } 

ПРИМЕЧАНИЕ: Я изменил немного в моем PrepareRequestToken классе соответствовать этому.

0

вы пробовали вызова Finish() после setResult (междунар, намерение) ?? Потому что в вашем случае это прокомментировано в doInBackground!

+0

да .. я уже пробовал этот ... но бесполезно. . – wolverine

+0

вы на GingerBread ?? – thegiga

+0

, поскольку из Документации: in setResult (int, intent); Как и в случае с GINGERBREAD, здесь у вас есть Intent.FLAG_GRANT_READ_URI_PERMISSION и/или Intent.FLAG_GRANT_WRITE_URI_PERMISSION. Это предоставит Деянию получение результата доступа к определенным URI в намерении. Вот почему только что подтвердили, тестируете ли вы его на прянике или нет. – thegiga

Смежные вопросы