安卓图片推文

标签 android image twitter

我正在尝试从 sd 卡文件夹中发布图片,但仍然无法做到。我正在使用 twitter4j-core-3.0.3 api 并授予权限 android.permission.INTERNETandroid.permission.ACCESS_NETWORK_STATE。这是我的代码

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);


    mSharedPreferences = getApplicationContext().getSharedPreferences(
            "MyPref", 0);

    twitterButton = (Button) findViewById(R.id.twitPic);

    twitterButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) 
        {
            new ImageSender().execute();

        }
    });

    if (!isTwitterLoggedInAlready()) {
        Uri uri = getIntent().getData();
        if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {
            // oAuth verifier
            String verifier = uri
                    .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);

            try {
                requestToken = twitter
                        .getOAuthRequestToken(TWITTER_CALLBACK_URL);
                // Get the access token
                accessToken = twitter.getOAuthAccessToken(
                        requestToken, verifier);

                // Shared Preferences
                Editor e = mSharedPreferences.edit();

                // After getting access token, access token secret
                // store them in application preferences
                e.putString(PREF_KEY_OAUTH_TOKEN, accessToken.getToken());
                e.putString(PREF_KEY_OAUTH_SECRET,
                        accessToken.getTokenSecret());
                // Store login status - true
                e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);
                e.commit(); // save changes

                Log.e("Twitter OAuth Token", "> " + accessToken.getToken());


            } catch (Exception e) {
                // Check log for login errors
                Log.e("Twitter Login Error", "> " + e.getMessage());
            }
        }
    }       

}
private class ImageSender extends AsyncTask<URL, Integer, Long> {
    private String url;

    protected void onPreExecute() {
         pDialog = ProgressDialog.show(MainActivity.this, "", "Sending image...", true);             
         pDialog.setCancelable(false);
         pDialog.show();
    }

    protected Long doInBackground(URL... urls) {
         long result = 0;


        Log.d(TAG, "Start sending image...");

try {
    String ExternalStorageDirectoryPath = Environment
              .getExternalStorageDirectory()
              .getAbsolutePath();

    String targetPath = ExternalStorageDirectoryPath + "/Friends/"+"image4.jpg";


    File targetDirector = new File(targetPath);

    ConfigurationBuilder builder = new ConfigurationBuilder();
    builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
    builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);

    // Access Token
    String access_token = mSharedPreferences.getString(PREF_KEY_OAUTH_TOKEN, "");
    // Access Token Secret
    String access_token_secret = mSharedPreferences.getString(PREF_KEY_OAUTH_SECRET, "");

    AccessToken accessToken = new AccessToken(access_token, access_token_secret);
    twitter = new TwitterFactory(builder.build()).getInstance(accessToken);

    StatusUpdate status = new StatusUpdate("");
    status.setMedia(targetDirector);

    twitter.updateStatus(status);


    result = 1;

    Log.d(TAG, "Image uploaded, Twitpic url is " + url);    
} catch (TwitterException e) {  
Log.e(TAG, "Failed to send image "+e);
e.printStackTrace();
}
        return result;
        }

        protected void onProgressUpdate(Integer... progress) {
        }

        protected void onPostExecute(Long result) {
         pDialog.cancel();

         String text = (result == 1) ? "Image sent successfully.\n Twitpic url is: " + url : "Failed to send image";

         Toast.makeText(getApplicationContext(), text, Toast.LENGTH_LONG).show();
        }
    }
private boolean isTwitterLoggedInAlready() {
    // return twitter login status from Shared Preferences
    return mSharedPreferences.getBoolean(PREF_KEY_TWITTER_LOGIN, false);
}

这是我的日志

04-02 06:38:02.275: E/Tag(1762): Failed to send image 400:The request was invalid. An accompanying error message will explain why. This is the status code will be returned during version 1.0 rate limiting(https://dev.twitter.com/pages/rate-limiting). In API v1.1, a request without authentication is considered invalid and you will get this response.
04-02 06:38:02.275: E/Tag(1762): message - Bad Authentication data
04-02 06:38:02.275: E/Tag(1762): code - 215
04-02 06:38:02.275: E/Tag(1762): Relevant discussions can be found on the Internet at:
04-02 06:38:02.275: E/Tag(1762):    http://www.google.co.jp/search?q=b2b52c28 or
04-02 06:38:02.275: E/Tag(1762):    http://www.google.co.jp/search?q=11331d43
04-02 06:38:02.275: E/Tag(1762): TwitterException{exceptionCode=[b2b52c28-11331d43], statusCode=400, message=Bad Authentication data, code=215, retryAfter=-1, rateLimitStatus=null, version=3.0.3}

编辑:当我尝试在这部分发推文时

StatusUpdate status = new StatusUpdate("");
status.setMedia(targetDirector);
twitter.updateStatus(status);

twitter.updateStatus("如果你在 Twitter 上阅读这个,它有效!"); 然后会产生同样的错误。

几天前我一直在研究它,但没有找到解决方案。请任何人帮助我解决问题。谢谢

最佳答案

改变你的 AsyncTask 像这样使用它对我有用

 twitterButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) 
    {
        String status = null;   
    new updateTwitterStatus().execute(status);

    }
}); 

public class updateTwitterStatus extends AsyncTask<String, String, String> {         
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        ProgressBar_show();
    }

    protected String doInBackground(String... args) {

        try {
            ConfigurationBuilder builder = new ConfigurationBuilder();
            builder.setOAuthConsumerKey(TWITTER_CONSUMER_KEY);
            builder.setOAuthConsumerSecret(TWITTER_CONSUMER_SECRET);

            // Access Token
            access_token = SharedPreferences.getString(PREF_KEY_OAUTH_TOKEN, "");
            // Access Token Secret
            access_token_secret = SharedPreferences.getString(PREF_KEY_OAUTH_SECRET, "");            

            String upload_image_url = postPicture( "/mnt/sdcard/yourimage.jpg", " ");
            Log.d("--------------upload_image_url=" + upload_image_url.toString() + "---------", " ");

        } catch (Exception e) {              
            Log.d("Twitter Update Error", e.getMessage());
        }
        return null;
    }

    public String postPicture(String fileName, String message) {

        try {
            Log.d("----start---postPicture()---", " ");
            File file = new File(fileName);
            MediaProvider mProvider = getMediaProvider();

            String accessTokenToken = access_token;
            String accessTokenSecret = access_token_secret;

            Properties props = new Properties();
            props.put(PropertyConfiguration.MEDIA_PROVIDER, mProvider);
            props.put(PropertyConfiguration.OAUTH_ACCESS_TOKEN, accessTokenToken);
            props.put(PropertyConfiguration.OAUTH_ACCESS_TOKEN_SECRET, accessTokenSecret);
            props.put(PropertyConfiguration.OAUTH_CONSUMER_KEY, TWITTER_CONSUMER_KEY);
            props.put(PropertyConfiguration.OAUTH_CONSUMER_SECRET, TWITTER_CONSUMER_SECRET);
            Configuration conf = new PropertyConfiguration(props);

            ImageUploadFactory factory = new ImageUploadFactory(conf);
            ImageUpload upload = factory.getInstance(mProvider);
            String url;
            url = upload.upload(file, message);
            Log.d("----end---postPicture()---", " ");
            return url;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    MediaProvider getMediaProvider() {

        Log.d("----start---getMediaProvider()---", " ");

        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
        String provider = preferences.getString("pictureService", "twitter");

        MediaProvider mProvider;
        if (provider.equals("yfrog"))
            mProvider = MediaProvider.YFROG;
        else if (provider.equals("twitpic"))
            mProvider = MediaProvider.TWITPIC;
        else if (provider.equals("twitter"))
            mProvider = MediaProvider.TWITTER;
        else
            throw new IllegalArgumentException("Picture provider " + provider + " unknown");

        Log.d("----end---getMediaProvider()---", " ");

        return mProvider;
    }

    protected void onPostExecute(String file_url) {
        ProgressBar_hide();
        // updating UI from Background Thread
        runOnUiThread(new Runnable() {
            public void run() {
                Toast.makeText(getApplicationContext(), "Status tweeted successfully", Toast.LENGTH_SHORT).show();              
            }
        });
    }
}

关于安卓图片推文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15758058/

相关文章:

twitter - 在 Twitter API 中,如果我通过保存在我的数据库中的推文 ID 检查推文是否已在推特上删除

android - Android 的 GUI-less 编程就像普通的 Linux 系统一样

java - 如果不存在则插入整数,如果 Firebase 实时数据库 Android 中已存在则递增

android - 如何知道android设备是否支持多用户?

python - 用于图像缩放的双三次插值

python - 使用 tweepy 和 pyspark 流式传输 Twitter

java - 讨论: Encryption for Password Keeper Android application

html - 背景图片不显示

javascript - 如何使 span 看起来像 img?

twitter - 如何配置http ://localhost:9000 to http:/mylocal. loc