3

Android ユーザーがアプリを使用して Twitter/Tumblr に画像を投稿できるようにしようとしています。ユーザーとアカウントの情報を認証して取得することはできますが、実際の画像のアップロードに問題があります。(基本的に、すべての HTTP GET API 呼び出しには問題ありませんが、HTTP POST には問題ありません)。

次のエラーが表示されます (それぞれ Twitter/Tumblr):

"response":{"errors":[{"message":"Error creating status","code":189}]}
"response":{"errors":["Error uploading photo."]},"meta":{"msg":"Bad Request","status":400}

これが何を意味するか知っている人はいますか?ユーザー情報などを取得できるので、認証エラーではないと思います...問題はパラメーター、おそらくメディアにあるように見えます。

画像ファイル/データ/URL の使用、HttpParams/MultipartEntity の使用、「メディア」/「メディア[]」の使用など、いくつかのオプションを試しましたが、あまり成功していません。以下は、私が使用している現在のコードです。私のフォーマットに何か問題がありますか?Twitter/Tumblr が探しているものは他にありますか? 誰かにアイデア、提案、または改善があれば、大歓迎です。ありがとう!

private class TwitterShareTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        String result = "";
        HttpClient httpclient = GlobalValues.getHttpClient();
        HttpPost request = new HttpPost("https://api.twitter.com/1.1/statuses/update_with_media.json");

        try {
            MultipartEntity entity = new MultipartEntity();
            entity.addPart("status", new StringBody(ETdescription.getText().toString()));
            entity.addPart("media[]", new FileBody(new File(GlobalValues.getRealPathFromURI(
                    Camera_ShareActivity.this, imageUri))));
            request.setEntity(entity);
            TwitterUtils.getTwitterConsumer().sign(request);

            HttpResponse response = httpclient.execute(request, GlobalValues.getLocalContext());
            HttpEntity httpentity = response.getEntity();
            InputStream instream = httpentity.getContent();
            result = GlobalValues.convertStreamToString(instream);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (OAuthMessageSignerException e) {
            e.printStackTrace();
        } catch (OAuthExpectationFailedException e) {
            e.printStackTrace();
        } catch (OAuthCommunicationException e) {
            e.printStackTrace();
        }

        return result;
    }

    public void onPostExecute(String result) {
        try {
            JSONObject jObject = new JSONObject(result.trim());
            System.out.println(jObject);
        } catch (JSONException e) {
            e.printStackTrace();
        }           
    }
}

~~~ 編集: YuDroid の要求に応じて ~~~

private static class TwitterUploadTask extends AsyncTask<String, Void, String> {

    private File image;
    private String message;
    private OAuthConsumer twitterConsumer;

    public TwitterUploadTask(OAuthConsumer consumer, File file, String string) {
        this.image = file;
        this.message = string;
        this.twitterConsumer = consumer;
    }

    @Override
    protected String doInBackground(String... params) {
        String result = "";
        HttpClient httpclient = GlobalValues.getHttpClient();
        HttpPost request = new HttpPost("https://api.twitter.com/1.1/statuses/update_with_media.json");

        ByteArrayInputStream bais = null;
        try {
            FileInputStream fis = new FileInputStream(image);
            BufferedInputStream bis = new BufferedInputStream(fis, 8192);
            Bitmap bm = BitmapFactory.decodeStream(bis);
            bis.close();
            fis.close();

            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
            byte[] myTwitterByteArray = baos.toByteArray();
            bais = new ByteArrayInputStream(myTwitterByteArray);
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            MultipartEntity entity = new MultipartEntity();
            entity.addPart("status", new StringBody(message));
            entity.addPart("media[]", new InputStreamBody(bais, image.getName()));
            request.setEntity(entity);
            twitterConsumer.sign(request);

            HttpResponse response = httpclient.execute(request, GlobalValues.getLocalContext());
            HttpEntity httpentity = response.getEntity();
            InputStream instream = httpentity.getContent();
            result = GlobalValues.convertStreamToString(instream);
            Log.i("statuses/update_with_media", result);
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (OAuthMessageSignerException e) {
            e.printStackTrace();
        } catch (OAuthExpectationFailedException e) {
            e.printStackTrace();
        } catch (OAuthCommunicationException e) {
            e.printStackTrace();
        }

        return result;
    }

    public void onPostExecute(String result) {
        try {
            JSONObject jObject = new JSONObject(result.trim());
            System.out.println(jObject);
        } catch (JSONException e) {
            e.printStackTrace();
        }           
    }
}
4

0 に答える 0