Twitter 应用 returns onActivityResult 中的错误值

Twitter app returns wrong value in onActivityResult

我正在撰写一条推文,然后启动 Twitter 应用程序以像这样发推文:

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

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

使用 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>

实际上,在这种情况下,onActivityResult() 的用法可能不正确。要捕获组合结果,如 said, we should use BroadcastReceiver. But this information is not enough for us. Because in many cases, twitter composing ways are confused with each other. Like 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 中捕获 composer 结果。

我不会分享任何关于 First Way 的代码块。但是为什么我们需要第一种方式呢?其实第一种方式包含的内容很丰富,但是只要我看到,它不支持捕获结果。所以第二种方式在很多情况下对我们来说已经足够了。 但是如果Twitter应用程序不存在设备,第二种方式会因为session而崩溃。在这种情况下,我们应该使用第一种方式打开composer互联网浏览器中的屏幕。所以我们应该同时使用两种方法,但就像你看到的那样,第一种比第二种更有效。

注意:请不要忘记添加 twitter 套件初始化配置和身份验证机制。