Twitter应用程序在onActivityResult中返回错误的值

时间:2017-05-30 16:49:06

标签: android twitter twitter-fabric

我正在编写推文然后启动推特应用程序来推文:

intent = new TweetComposer.Builder(getFragmentActivity())
                        .text(viewHolder.etShareText.getText().toString())
                        .url(contentUrl)
                        .image(imageUri)
                        .createIntent();

它工作了很长时间,它仍然有效,我能够在我的个人资料上发布推文,但前段时间我的结果 RESULT_CANCELED > onActivityResult()方法尽管实际结果是成功的。 也许在Twitter API中有些变化?现在如何处理结果?

2 个答案:

答案 0 :(得分:1)

实际上,在这种情况下onActivityResult()的使用可能不是真正的方法。为了捕捉作曲结果,如vijikumar所说,我们应该使用BroadcastReceiver。但这些信息对我们来说还不够。因为在很多情况下,Twitter构成方式彼此混淆。就像documentation所说的那样;有两种方法可以撰写推文:

  • 启动Twitter应用程序的Tweet Composer
  • 启动Twitter Kit Native Composer

如果您更喜欢使用第一种方式,只要我看到,使用BroadcastReceiver,onActivityResult等就没有健康的方法来捕获合成结果。

BroadcastReceiver方法无法使用第一种方式。但是如果您更喜欢使用第二种方式,则可以使用BroadcastReceiver在健康的位置捕获组合结果。你不应该认为第一种方式并不重要。我将简要地谈谈第一种方式。

要做到以上这些;

第二种方式

在您的应用程序级别gradle文件中添加以下存储库和依赖项

repositories {
        jcenter()
}

compile 'com.twitter.sdk.android:twitter-core:3.1.1'
compile 'com.twitter.sdk.android:tweet-composer:3.1.1'

然后添加以下BroadcastReceiver

public class MyResultReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    if (TweetUploadService.UPLOAD_SUCCESS.equals(intent.getAction())) {
      // success
    } else if (TweetUploadService.UPLOAD_FAILURE.equals(intent.getAction())) {
      // failure
    } else if (TweetUploadService.TWEET_COMPOSE_CANCEL.equals(intent.getAction())) {
      // cancel
    }
  }
}

然后将您的BroadcastReceiver添加到应用程序清单文件中,如下所示

<receiver
  android:name=".MyResultReceiver"
  android:exported="false">
  <intent-filter>
    <action android:name="com.twitter.sdk.android.tweetcomposer.UPLOAD_SUCCESS"/>
    <action android:name="com.twitter.sdk.android.tweetcomposer.UPLOAD_FAILURE"/>
    <action android:name="com.twitter.sdk.android.tweetcomposer.TWEET_COMPOSE_CANCEL"/>
  </intent-filter>
</receiver>

最后,要打开作曲家屏幕,请使用以下代码块启动ComposerActivity

final TwitterSession session = TwitterCore.getInstance().getSessionManager()
    .getActiveSession();
final Intent intent = new ComposerActivity.Builder(YourActivity.this)
    .session(session)
    .text("Love where you work")
    .hashtags("#twitter")
    .createIntent();
startActivity(intent);

使用这种方式时,您将在BroadcastReceiver中捕获作曲家结果。

我不会分享任何关于 First Way 的代码块。但为什么我们需要第一种方式呢?实际上第一种方式包含非常丰富的内容,但只要我看到,它不支持捕获结果。因此,在许多情况下,第二种方式对我们来说足够 然而,如果Twitter应用程序不存在该设备,第二种方式将因会话而崩溃。 在这种情况下,我们应该使用第一种方式在互联网浏览器中打开作曲家屏幕。因此,我们应该使用两种方式,但就像你看到第一种方法比第二方更有效。

注意:请不要忘记添加twitter工具包初始化配置和认证机制。

答案 1 :(得分:0)

使用BroadcastReceiver。

public class MyResultReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (TweetUploadService.UPLOAD_SUCCESS.equals(intent.getAction())) {
            // success
            final Long tweetId = intentExtras.getLong(TweetUploadService.EXTRA_TWEET_ID);
        } else {
            // failure
            final Intent retryIntent = intentExtras.getParcelable(TweetUploadService.EXTRA_RETRY_INTENT);
        }
    }
}

在清单

<receiver
  android:name=".MyResultReceiver"
  android:exported="false">
  <intent-filter>
    <action android:name="com.twitter.sdk.android.tweetcomposer.UPLOAD_SUCCESS"/>
    <action android:name="com.twitter.sdk.android.tweetcomposer.UPLOAD_FAILURE"/>
  </intent-filter>
</receiver>