0

私の Android アプリケーションでは、画像を twitpic にアップロードする必要があります。SD カードにいくつかの画像があり、ボタンをクリックした後に twitpic にアップロードしたいと考えています。これが私のコードです。

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();                
        }
    });

    uri = getIntent().getData();
    if (uri != null && uri.toString().startsWith(TWITTER_CALLBACK_URL)) {
        // oAuth verifier
        String verifier = uri
                .getQueryParameter(URL_TWITTER_OAUTH_VERIFIER);
        try {
            // Get the access token
            oAuthAccessToken = twitter.getOAuthAccessToken(
                    verifier);
            int userID = oAuthAccessToken.getUserId();
            User user = twitter.showUser(userID);
            username = user.getName();
        }
        catch (Exception e) {
            // TODO: handle exception
        }
    }
}
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);
            twitterSession.storeAccessToken(oAuthAccessToken, username);
            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();
        }
    }

ここに私の 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";

private static Twitter twitter;

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) 
        return new AccessToken(token, tokenSecret);
    else
        return null;
}

ここに NullPointer 例外があります。

editor.putString(TWEET_AUTH_KEY, accessToken.getToken());

そして私のログは

03-31 05:09:20.178: E/AndroidRuntime(1075): FATAL EXCEPTION: AsyncTask #1 03-31 05:09:20.178: E/AndroidRuntime(1075): java.lang.RuntimeException: doInBackground の実行中にエラーが発生しました() 03-31 05:09:20.178: E/AndroidRuntime(1075): android.os.AsyncTask$3.done(AsyncTask.java:299) 03-31 05:09:20.178: E/AndroidRuntime(1075): java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 03-31 05:09:20.178: E/AndroidRuntime(1075): java.util.concurrent.FutureTask.setException(FutureTask.java:219) 03-31 05:09:20.178: E/AndroidRuntime(1075): java.util.concurrent.FutureTask.run(FutureTask.java:239) 03-31 05:09:20.178: E/AndroidRuntime(1075): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 03-31 05:09:20.178: E/AndroidRuntime(1075): java.util.concurrent.ThreadPoolExecutor で。runWorker(ThreadPoolExecutor.java:1080) 03-31 05:09:20.178: E/AndroidRuntime(1075): java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 03-31 05:09: 20.178: E/AndroidRuntime(1075): at java.lang.Thread.run(Thread.java:856) 03-31 05:09:20.178: E/AndroidRuntime(1075): 原因: java.lang.NullPointerException 03- 31 05:09:20.178: E/AndroidRuntime(1075): com.my.androidtwitpicapplication.TwitterSession.storeAccessToken(TwitterSession.java:36) 03-31 05:09:20.178: E/AndroidRuntime(1075): com. my.androidtwitpicapplication.MainActivity$ImageSender.doInBackground(MainActivity.java:91) 03-31 05:09:20.178: E/AndroidRuntime(1075): com.my.androidtwitpicapplication.MainActivity$ImageSender.doInBackground(MainActivity.java:1) で) 03-31 05:09:20.178: E/AndroidRuntime(1075): android.os.AsyncTask$2.call(AsyncTask.java:287) 03-31 05:09:20.178: E/AndroidRuntime(1075): java.util.concurrent.FutureTask.run(FutureTask.java:234)

メソッドの呼び出しに問題があると思いますがpublic void storeAccessToken(AccessToken accessToken, String username)、問題を解決できません。問題を解決するのを手伝ってください。ありがとう

4

1 に答える 1

0
catch (Exception e) {
   // TODO: handle exception
}

ここで例外がキャッチされた場合、がスローさoAuthAccessTokenれる可能性がありnullます。その例外を処理するために、さらに多くのことを行う必要があります ( null で呼び出さないことを含む)。storeAccessTokenNullPointerExceptionstoreAccessTokenAccessToken

于 2013-03-31T05:22:21.107 に答える