2013-03-27 3 views
1

내 안드로이드 응용 프로그램에서 twitpic에 이미지를 업로드하고 싶습니다. 내 sd 카드에 몇 가지 이미지가 있습니다. 버튼을 클릭하면 이미지가 twitpic에 업로드됩니다. 여기에 내 코드 ...오류 : android의 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): FATAL EXCEPTION: AsyncTask #1 03-27 11:47:34.427: E/AndroidRuntime(2676): java.lang.RuntimeException: An error occured while executing doInBackground() 03-27 11:47:34.427: E/AndroidRuntime(2676): at android.os.AsyncTask$3.done(AsyncTask.java:299) 03-27 11:47:34.427: E/AndroidRuntime(2676): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 03-27 11:47:34.427: E/AndroidRuntime(2676): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 03-27 11:47:34.427: E/AndroidRuntime(2676): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 03-27 11:47:34.427: E/AndroidRuntime(2676): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 03-27 11:47:34.427: E/AndroidRuntime(2676): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 03-27 11:47:34.427: E/AndroidRuntime(2676): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 03-27 11:47:34.427: E/AndroidRuntime(2676): at java.lang.Thread.run(Thread.java:856) 03-27 11:47:34.427: E/AndroidRuntime(2676): Caused by: java.lang.NullPointerException 03-27 11:47:34.427: E/AndroidRuntime(2676): at com.my.androidtwitpicapplication.MainActivity$ImageSender.doInBackground(MainActivity.java:78) 03-27 11:47:34.427: E/AndroidRuntime(2676): at com.my.androidtwitpicapplication.MainActivity$ImageSender.doInBackground(MainActivity.java:1) 03-27 11:47:34.427: E/AndroidRuntime(2676): at android.os.AsyncTask$2.call(AsyncTask.java:287) 03-27 11:47:34.427: E/AndroidRuntime(2676): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 03-27 11:47:34.427: E/AndroidRuntime(2676): ... 4 more

널 포인터이다 여기에오다

.setOAuthAccessToken(accessToken.getToken()) 

어떻게 오류를 제거 할 수 있습니까? 고마워요 ...

+0

MainActivity.java의 78 행에 null 포인터가 있습니다. 이 줄에 어떤 코드가 있는지 확인할 수 있습니까? –

+0

답장을 보내 주셔서 감사합니다. 나는 나의 질문을 편집했다. – andDev

+0

TwitterSession? 무슨 API를 사용하고 계십니까 twitpic4j? –

답변

0

getAccessToken() 토큰 또는 tokenSecret 중 하나 또는 둘 다 sharedpreference에서 null이 올 것입니다.

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이 위에서 요구하는 모든 정보를 저장한다는 것을 코드에서 확인할 수 있습니다. 그리고 그것이 부름 받고 있는지 나는 알 수 없다. 그래서 부름을 받았는지보세요?

+0

답장을 보내 주셔서 감사합니다. 자, 이제 그 위에 @user_CC – andDev

+0

당신이 어떻게 시작하는지 알려주세요 .. –

+0

이 해결 된 친구가 맞습니까? –