Ошибка: загрузка изображения в twitpic в Android

В моем приложении для Android я хочу загрузить изображение в twitpic. На моей SD-карте есть несколько изображений. Когда я нажимаю кнопку, изображение загружается в twitpic. Вот мой код...

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    uploadImage = (Button) findViewById(R.id.uploadImage);
    uploadImage.setOnClickListener(new View.OnClickListener() {

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

        }
    });
}

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

     protected void onPreExecute() {
mProgressDialog = ProgressDialog.show(MainActivity.this, "", "Sending image...", true);

mProgressDialog.setCancelable(false);
mProgressDialog.show();
}

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

            TwitterSession twitterSession   = new TwitterSession(MainActivity.this);
            AccessToken accessToken = twitterSession.getAccessToken();

Configuration conf = new ConfigurationBuilder()
            .setOAuthConsumerKey(twitter_consumer_key)
            .setOAuthConsumerSecret(twitter_secret_key)
            .setOAuthAccessToken(accessToken.getToken())
            .setOAuthAccessTokenSecret(accessToken.getTokenSecret())
            .build();

OAuthAuthorization auth = new OAuthAuthorization (conf, conf.getOAuthConsumerKey (), conf.getOAuthConsumerSecret (),
new AccessToken (conf.getOAuthAccessToken (), conf.getOAuthAccessTokenSecret ()));

ImageUpload upload = ImageUpload.getTwitpicUploader (twitpic_api_key, auth);

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

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

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


    File targetDirector = new File(targetPath);
url = upload.upload(new File(targetDirector.getAbsolutePath()));
result = 1;

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

e.printStackTrace();
}

            return result;
        }

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

        protected void onPostExecute(Long result) {
         mProgressDialog.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();
        }
    }



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

Класс TwitterSession здесь...

public class TwitterSession {
private SharedPreferences sharedPref;
private Editor editor;

private static final String TWEET_AUTH_KEY = "auth_key";
private static final String TWEET_AUTH_SECRET_KEY = "auth_secret_key";
private static final String TWEET_USER_NAME = "user_name";
private static final String SHARED = "Twitter_Preferences";

public TwitterSession(Context context) {
    sharedPref    = context.getSharedPreferences(SHARED, Context.MODE_PRIVATE);

    editor        = sharedPref.edit();
}

public void storeAccessToken(AccessToken accessToken, String username) {
    editor.putString(TWEET_AUTH_KEY, accessToken.getToken());
    editor.putString(TWEET_AUTH_SECRET_KEY, accessToken.getTokenSecret());
    editor.putString(TWEET_USER_NAME, username);

    editor.commit();
}

public void resetAccessToken() {
    editor.putString(TWEET_AUTH_KEY, null);
    editor.putString(TWEET_AUTH_SECRET_KEY, null);
    editor.putString(TWEET_USER_NAME, null);

    editor.commit();
}

public String getUsername() {
    return sharedPref.getString(TWEET_USER_NAME, "");
}

public AccessToken getAccessToken() {
    String token        = sharedPref.getString(TWEET_AUTH_KEY, null);
    String tokenSecret  = sharedPref.getString(TWEET_AUTH_SECRET_KEY, null);

    if (token != null && tokenSecret != null) 
    {
        AccessToken accessToken =  new AccessToken(token, tokenSecret);
        int userID = accessToken.getUserId();
        User user = null;
        try {
            user = twitter.showUser(userID);
        } catch (TwitterException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        String username = user.getName();

        storeAccessToken(accessToken, username);
        return accessToken;
    }
    else
        return null;
}

} Вот мой журнал

03-27 11:47:34.427: E/AndroidRuntime(2676): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: AsyncTask # 1 03-27 11:47:34.427: E/AndroidRuntime(2676): java.lang.RuntimeException: Произошла ошибка при выполнении doInBackground () 03-27 11:47:34.427: E/AndroidRuntime(2676): на android.os.AsyncTask$3.done(AsyncTask.java:299) 03-27 11:47:34.427: E/AndroidRuntime(2676): в java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 03-27 11:47:34.427: E/AndroidRuntime(2676): в java.util.concurrent.FutureTask.setException(FutureTask.java:219) 03-27 11:47:34.427: E/AndroidRuntime(2676): в java.util.concurrent.FutureTask.run(FutureTask.java:239) 03-27 11:47:34.427: E/AndroidRuntime(2676): в android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 03-27 11:47:34.427: E/AndroidRuntime(2676): в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:10) 03-27 11:47:34.427: E/AndroidRuntime(2676): в java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 03-27 11:47:34.427: E/AndroidRuntime(2676): на java.lang.Thread.run(Thread.java:856) 03-27 11:47:34.427: E/AndroidRuntime(2676): вызвано: java.lang.NullPointerException 03-27 11:47:34.427: E/AndroidRuntime(2676): на com.my.androidtwitpicapplication.MainActivity$ImageSender.doInBackground(MainActivity.java:78) 03-27 11:47:34.427: E/AndroidRuntime(2676): в com.my.androidtwitpicapplication.MainActivity$ImageSender.doInBackground(MainActivity.java:1) 03-27 11:47:34.427: E/AndroidRuntime(2676): на android.os.AsyncTask$2.call(AsyncTask.java:287) 03-27 11:47:34.427: E/AndroidRuntime(2676): на java.util.concurrent.FutureTask.run(FutureTask.java:234) 03-27 11:47:34.427: E/AndroidRuntime(2676): ... еще 4

Null Pointer идет сюда

.setOAuthAccessToken(accessToken.getToken())

Как я могу удалить ошибку? Спасибо...

1 ответ

В вашем методе getAccessToken() либо token, либо tokenSecret, либо оба имеют нулевое значение из разделяемой настройки.

public AccessToken getAccessToken() {


     // either or both of them below are coming up as null
    String token        = sharedPref.getString(TWEET_AUTH_KEY, null);
    String tokenSecret  = sharedPref.getString(TWEET_AUTH_SECRET_KEY, null);

    if (token != null && tokenSecret != null) 
        //here you are retreiving the accesstoken when it is not there in the shared preference then you need to save it as well because otherwise it will create a new AccessToken every time

        AccessToken accToken =  new AccessToken(token, tokenSecret);

        storeAccessToken(accToken, userName); /// you need to sort out where the userName will come from as it is needed by your StoreAccessToken method so next time getAccessToken is called it will retrieve the AccessToken from SharedPreference

        return 
    else
        return null;
}

Теперь из кода видно, что storeAccessToken хранит всю необходимую вам информацию выше. И я не вижу, как это называется. Так что, пожалуйста, посмотрите, как это называется?

Другие вопросы по тегам