Nathan Sundin
Nathan Sundin

Reputation: 1

Get twitter profile picture with Parse - Android

I am stuck on trying to get a Twitter ParseUser's profile picture. I have used ParseTwitterUtils to allow the user to log in to my app, and am attempting to get their profile picture upon sign up to my parse database.

I have used the following from Parse docs:

ParseTwitterUtils.logIn(this, new LogInCallback() {
  @Override
  public void done(ParseUser user, ParseException err) {
    if (user == null) {
      Log.d("MyApp", "Uh oh. The user cancelled the Twitter login.");
    } else if (user.isNew()) {
      Log.d("MyApp", "User signed up and logged in through Twitter!"); 
          ParseTwitterUtils.getTwitter().getUserId();
		  user.setUsername(ParseTwitterUtils.getTwitter()
                .getScreenName());
              
		  user.saveInBackground();
		  makeTwitterRequest();
		  MyActivity();
    } else {
      Log.d("MyApp", "User logged in through Twitter!");
    }
  }
});

The logging in works absolutely fine, and it gets the user name fine. Here is my makeTwitterRequest() method to attempt to get the profile picture so far. I havn't yet attempted to store it to Parse, only to get it using a Twitter API call:

private void makeTwitterRequest() {
    	

    	Twitter twitter = ParseTwitterUtils.getTwitter();
    	String twitterUrl = "https://api.twitter.com/1.1/users/show.json?user_id=" + twitter.getUserId();
    	HttpClient client = new DefaultHttpClient();
    	HttpGet request = new HttpGet(twitterUrl);
    	twitter.signRequest(request);
		try {
			HttpResponse response = client.execute(request);
			
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

Upon running this, whenever I hit the Twitter login button and log in, upon authenticating, I receive an error:

03-05 19:06:56.076: E/AndroidHttpClient(15055): Leak found
03-05 19:06:56.076: E/AndroidHttpClient(15055): java.lang.IllegalStateException: AndroidHttpClient created and never closed
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at android.net.http.AndroidHttpClient.<init>(AndroidHttpClient.java:158)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at android.net.http.AndroidHttpClient.newInstance(AndroidHttpClient.java:144)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at com.parse.twitter.Twitter.authorize(Twitter.java:115)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at com.parse.TwitterAuthenticationProvider.authenticate(TwitterAuthenticationProvider.java:39)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at com.parse.ParseUser.authenticateAsync(ParseUser.java:1482)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at com.parse.ParseUser.logInWithAsync(ParseUser.java:1502)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at com.parse.ParseUser.logInWithAsync(ParseUser.java:1291)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at com.parse.ParseTwitterUtils.logInInBackground(ParseTwitterUtils.java:247)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at com.parse.ParseTwitterUtils.logIn(ParseTwitterUtils.java:264)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at <mypackagename>.SignUpOrLoginActivity.onTwitterLoginButtonClicked(SignUpOrLoginActivity.java:231)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at <mypackagename>.SignUpOrLoginActivity.access$2(SignUpOrLoginActivity.java:229)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at <mypackagename>.SignUpOrLoginActivity$5.onClick(SignUpOrLoginActivity.java:95)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at android.view.View.performClick(View.java:4756)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at android.view.View$PerformClick.run(View.java:19749)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at android.os.Handler.handleCallback(Handler.java:739)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at android.os.Handler.dispatchMessage(Handler.java:95)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at android.os.Looper.loop(Looper.java:135)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at android.app.ActivityThread.main(ActivityThread.java:5221)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at java.lang.reflect.Method.invoke(Native Method)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at java.lang.reflect.Method.invoke(Method.java:372)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
03-05 19:06:56.076: E/AndroidHttpClient(15055): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

I believe that Parse is supposed to sort this out automatically with the log in procedure, however does anybody know what is wrong? Thanks very much for your time!

Upvotes: 0

Views: 688

Answers (1)

0wl
0wl

Reputation: 876

You can use following snippet of code:

Twitter twitter = ParseTwitterUtils.getTwitter();

HttpGet verifyGet = new HttpGet("https://api.twitter.com/1.1/users/show.json?user_id=" + twitter.getUserId());
ParseTwitterUtils.getTwitter().signRequest(verifyGet);

OkHttpClient client = new OkHttpClient();

Request request = null;

try {
    request = new Request.Builder()
            .url(verifyGet.getURI().toURL())
            .addHeader("Authorization", verifyGet.getFirstHeader("Authorization").getValue())
            .build();
} catch (MalformedURLException e) {
    e.printStackTrace();
}

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Request request, IOException e) {

    }

    @Override
    public void onResponse(Response response) throws IOException {
        if (response.isSuccessful()) {
            String jsonString = response.body().string();
        }
    }
});

It depends on OkHttp by Square (https://github.com/square/okhttp)

Upvotes: 3

Related Questions