1

我正在尝试在我的 android 应用程序中使用 REST api 在推文中上传视频。尝试使用 INIT 命令初始化上传文件会话时,我得到

代码:215,消息:错误的身份验证数据。

但是,身份验证工作正常,因为我只能使用 StatusesService 发送短信。这是代码 -

public class MainActivity extends AppCompatActivity {
    public static final String consumerKey = "...";
    public static final String consumerSecret = "...";
    private static final String uploadEndpoint = "https://upload.twitter.com/1.1/media/upload.json";
    public TwitterLoginButton loginButton;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TwitterAuthConfig twitterAuthConfig = new TwitterAuthConfig(MainActivity.consumerKey, MainActivity.consumerSecret);
        TwitterConfig config = new TwitterConfig.Builder(this)
                .logger(new DefaultLogger(Log.DEBUG))
                .twitterAuthConfig(twitterAuthConfig)
                .debug(true)
                .build();
        Twitter.initialize(config);
        loginButton = (TwitterLoginButton) findViewById(R.id.login_button);
        loginButton.setCallback(new Callback<TwitterSession>() {
            @Override
            public void success(Result<TwitterSession> result) {
                long sizeOfVideoInBytes = (new File(...)).length();
                HashMap<String, String> postParams = new HashMap<>();
                postParams.put("command", "INIT");
                postParams.put("media_type", "video/mp4");
                postParams.put("media_category", "tweet_video");
                postParams.put("total_bytes", String.valueOf(sizeOfVideoInBytes));

                TwitterSession session = TwitterCore.getInstance().getSessionManager().getActiveSession();
                TwitterAuthToken authToken = session.getAuthToken();
                String token = authToken.token;
                String secret = authToken.secret;
                HttpsURLConnection request = initTwitterApiRequest(uploadEndpoint, "POST", postParams, token, secret);
                enableStrictMode();
                try {
                    InputStream connectionInputStream;
                    int responseCode = request.getResponseCode();
                    if (responseCode < 400)
                        connectionInputStream = request.getInputStream();
                    else
                        connectionInputStream = request.getErrorStream();

                    StringBuffer response = new StringBuffer();

                    if(connectionInputStream != null) {
                        BufferedReader in = new BufferedReader(new InputStreamReader(connectionInputStream));
                        String inputLine;

                        while ((inputLine = in.readLine()) != null) {
                            response.append(inputLine);
                        }
                        in.close();
                    }

                    Map<String, List<String>> map = request.getHeaderFields();

                    JSONObject headerJSON = new JSONObject();
                    if(map != null) {
                        for (Map.Entry<String, List<String>> entry : map.entrySet()) {
                            String key = entry.getKey();
                            String value = entry.getValue().get(0);

                            if(key == null) {
                                key = UUID.randomUUID().toString();
                            }
                            headerJSON.put(key, value);
                        }
                    }

                    String responseResult = "{'code':" + String.valueOf(request.getResponseCode());
                    if (!response.toString().equals("")) {
                        responseResult = responseResult + ",'data':" + response.toString();
                    }
                    if(headerJSON.length() > 0) {
                        responseResult = responseResult + ",'headers':" + headerJSON.toString();
                    }
                    responseResult = responseResult + "}";

                    request.disconnect();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void failure(TwitterException exception) {
                exception.printStackTrace();
            }
        });
    }
    public void enableStrictMode()
    {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

        StrictMode.setThreadPolicy(policy);
    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        loginButton.onActivityResult(requestCode, resultCode, data);
    }

    private HttpsURLConnection initTwitterApiRequest(String url, String method, HashMap<String, String> postParams,
                                                     String token, String secret) {
        try {
            String paramString = "";
            for (Map.Entry<String, String> entry : postParams.entrySet()) {
                paramString = paramString + URLEncoder.encode(entry.getKey(), "UTF-8") + "=" + URLEncoder.encode(entry.getValue(), "UTF-8") + "&";
            }
            String requestUrl = url;
            if(!paramString.isEmpty()) {
                paramString = paramString.substring(0, paramString.length() - 1);
                requestUrl = requestUrl + "?" + paramString;
            }
            URL httpsUrl = new URL(requestUrl);
            HttpsURLConnection connection = (HttpsURLConnection) httpsUrl.openConnection();
            connection.setRequestMethod(method);
            TwitterAuthToken twitterAuthToken = new TwitterAuthToken(token, secret);
            TwitterAuthConfig twitterAuthConfig = new TwitterAuthConfig(consumerKey, consumerSecret);
            OAuthSigning oAuthSigning = new OAuthSigning(twitterAuthConfig, twitterAuthToken);
            Map<String, String> authHeaders = oAuthSigning.getOAuthEchoHeaders(method, url, postParams);
            for(Map.Entry<String, String> entry : authHeaders.entrySet()) {
                connection.setRequestProperty(entry.getKey(), entry.getValue());
            }
            return connection;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

我错过了什么吗?我该如何解决这个问题?

4

0 回答 0