2013-06-06 27 views
7

Tôi cần đăng hình ảnh lên Tumblr. Tôi đọc số http://www.tumblr.com/docs/en/api/v2#auth và tôi biết rằng tôi cần nhận thông tin người dùng để lấy tên blog. Tôi đã sử dụng cùng một mã mà tôi đã sử dụng cho Twitter authetication, thay đổi các URL và tải thành công Tumblr webview. Tôi đã sử dụng mã sau đây để xác thực và lấy thông tin người dùng.Cần đăng hình ảnh lên blog Tumblr trong android

import java.io.BufferedInputStream; 
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.URL; 
import java.net.URLConnection; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.StatusLine; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpGet; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.apache.http.util.EntityUtils; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import com.twitter.imageupload.R; 
import com.twitter.imageupload.SecondClass; 
import com.twitter.imageupload.TwitterImageUpload; 

import oauth.signpost.OAuth; 
import oauth.signpost.OAuthConsumer; 
import oauth.signpost.OAuthProvider; 
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer; 
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider; 
import oauth.signpost.http.HttpParameters; 
import twitter4j.conf.Configuration; 
import twitter4j.conf.ConfigurationBuilder; 
import twitter4j.http.AccessToken; 
import twitter4j.http.OAuthAuthorization; 
import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.Uri; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.os.StrictMode; 
import android.preference.PreferenceManager; 
import android.util.Log; 
import android.view.Window; 
import android.webkit.WebView; 
import android.widget.Button; 
import android.widget.Toast; 


public class Tumblr_Web_View extends Activity { 
    SharedPreferences settings; 
    public static final String PREFS_NAME = "GREATEST_THINGS"; 
    SharedPreferences.Editor editor; 
    final String TAG = getClass().getName(); 
    Button cancel_button; 
    public static String usr_img, log_res, log_id; 
    private OAuthConsumer consumer; 
    private OAuthProvider provider; 

    WebView tumblr_web_view; 

    String tweet_Sign_in; 
    static twitter4j.Twitter twitter; 
    public static String userName; 
    public static URL twt_img_url; 
    AccessToken accessToken; 
    SharedPreferences twtuname_pref; 

    SharedPreferences userpref; 
    public static final String USER_PREF = "TWITTER_USER"; 
    SharedPreferences.Editor usereditor; 

    SharedPreferences twtlogpref; 
    public static SharedPreferences.Editor twtlogeditor; 
    public static final String TWTPREF_LOGIN = "LOGIN ID"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
     setContentView(R.layout.tumblr_web_view); 
     if (android.os.Build.VERSION.SDK_INT > 9) { 

      StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
        .permitAll().build(); 
      StrictMode.setThreadPolicy(policy); 
     } 
     tumblr_web_view = (WebView) findViewById(R.id.tumblr_web_view); 
     twtuname_pref = this.getSharedPreferences("user_pref", 1); 
     settings = getSharedPreferences(PREFS_NAME, 0); 
     editor = settings.edit(); 
     userpref = getSharedPreferences(USER_PREF, 0); 
     twtlogpref = getSharedPreferences(TWTPREF_LOGIN, 0); 
     try { 
      this.consumer = new CommonsHttpOAuthConsumer(
        Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET); 
      this.provider = new CommonsHttpOAuthProvider(Constants.REQUEST_URL, 
        Constants.ACCESS_URL, Constants.AUTHORIZE_URL); 
     } catch (Exception e) { 
      Log.e(TAG, "Error creating consumer/provider", e); 
     } 

     Log.i(TAG, "Starting task to retrieve request token."); 
     // new OAuthRequestTokenTask(this,consumer,provider).execute(); 
     try { 
      Log.i(TAG, "Retrieving request token from Google servers"); 
      final String url = provider.retrieveRequestToken(consumer, 
        Constants.OAUTH_CALLBACK_URL); 
      Log.i(TAG, "Popping a browser with the authorize URL : " + url); 
      // Intent intent = new Intent(Intent.ACTION_VIEW, 
      // Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | 
      // Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND); 
      // this.startActivity(intent); 
      tumblr_web_view.loadUrl(url); 

     } catch (Exception e) { 
      Log.e(TAG, "Error during OAUth retrieve request token", e); 
     } 
    } 

    /** 
    * Called when the OAuthRequestTokenTask finishes (user has authorized the 
    * request token). The callback URL will be intercepted here. 
    */ 
    @Override 
    public void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     SharedPreferences prefs = PreferenceManager 
       .getDefaultSharedPreferences(this); 
     final Uri uri = intent.getData(); 
     if (uri != null 
       && uri.getScheme().equals(Constants.OAUTH_CALLBACK_SCHEME)) { 
      Log.i(TAG, "Callback received : " + uri); 
      Log.i(TAG, "Retrieving Access Token"); 

      new RetrieveAccessTokenTask(this, consumer, provider, prefs) 
        .execute(uri); 

      // finish(); 

     } 
    } 

    public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Void> { 

     @SuppressWarnings("unused") 
     private Context context; 
     private OAuthProvider provider; 
     private OAuthConsumer consumer; 
     private SharedPreferences prefs; 

     public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer, 
       OAuthProvider provider, SharedPreferences prefs) { 
      this.context = context; 
      this.consumer = consumer; 
      this.provider = provider; 
      this.prefs = prefs; 
     } 

     /** 
     * Retrieve the oauth_verifier, and store the oauth and 
     * oauth_token_secret for future API calls. 
     */ 
     @Override 
     protected Void doInBackground(Uri... params) { 
      Uri uri = params[0]; 
      Log.v("uri >>", uri + ""); 

      String oauth_verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER); 

      try { 
       consumer.setTokenWithSecret(consumer.getToken(), 
         consumer.getTokenSecret()); 
      // provider.retrieveAccessToken(consumer, oauth_verifier); 

       Log.v("getToken", consumer.getToken()); 
       Log.v("getTokenSecret", consumer.getTokenSecret()); 

       Editor uname_editor = twtuname_pref.edit(); 
       uname_editor.putString("token", consumer.getToken()); 

       uname_editor.putString("secret_token", 
         consumer.getTokenSecret()); 
       uname_editor.putString("login_status", "already_logged"); 
       uname_editor.commit(); 

       HttpClient httpClient = new DefaultHttpClient(); 
       HttpGet httpGet = new HttpGet(
         "http://api.tumblr.com/v2/user/info"); 
       try { 

        HttpResponse httpResponse = httpClient.execute(httpGet); 
        System.out.println("httpResponse"); 
        InputStream inputStream = httpResponse.getEntity() 
          .getContent(); 
        InputStreamReader inputStreamReader = new InputStreamReader(
          inputStream); 
        BufferedReader bufferedReader = new BufferedReader(
          inputStreamReader); 
        StringBuilder stringBuilder = new StringBuilder(); 
        String bufferedStrChunk = null; 
        while ((bufferedStrChunk = bufferedReader.readLine()) != null) { 
         stringBuilder.append(bufferedStrChunk); 
        } 
        System.out.println("Returning value of doInBackground :" 
          + stringBuilder.toString()); 
       } catch (ClientProtocolException cpe) { 
        System.out 
          .println("Exception generates caz of httpResponse :" 
            + cpe); 
        cpe.printStackTrace(); 
       } catch (IOException ioe) { 
        System.out 
          .println("Second exception generates caz of httpResponse :" 
            + ioe); 
        ioe.printStackTrace(); 
       } 

      } catch (Exception e) { 
       Log.e(TAG, "OAuth - Access Token Retrieval Error", e); 
      } 

      return null; 
     } 

    } 

} 

Tôi gặp lỗi sau.

06-06 23:06:20.084: I/System.out(20264): Returning value of doInBackground :{"meta":{"status":401,"msg":"Not Authorized"},"response":[]} 

những gì tôi đã làm sai?

cập nhật: Đã nhận được thông tin người dùng thành công ngay bây giờ. Có tên blog của người dùng.

public class RetrieveAccessTokenTask extends AsyncTask<Uri, Void, Void> { 

      @SuppressWarnings("unused") 
      private Context context; 
      private OAuthProvider provider; 
      private OAuthConsumer consumer; 
      private SharedPreferences prefs; 

      public RetrieveAccessTokenTask(Context context, OAuthConsumer consumer, 
        OAuthProvider provider, SharedPreferences prefs) { 
       this.context = context; 
       this.consumer = consumer; 
       this.provider = provider; 
       this.prefs = prefs; 
      } 

      /** 
      * Retrieve the oauth_verifier, and store the oauth and 
      * oauth_token_secret for future API calls. 
      */ 
      @Override 
      protected Void doInBackground(Uri... params) { 
       Uri uri = params[0]; 
       Log.v("uri >>", uri + ""); 

       String oauth_verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER); 

       try { 
        consumer.setTokenWithSecret(consumer.getToken(), 
          consumer.getTokenSecret()); 
        provider.retrieveAccessToken(consumer, oauth_verifier); 

        Log.v("getToken", consumer.getToken()); 
        Log.v("getTokenSecret", consumer.getTokenSecret()); 

        Editor uname_editor = twtuname_pref.edit(); 
        uname_editor.putString("token", consumer.getToken()); 

        uname_editor.putString("secret_token", 
          consumer.getTokenSecret()); 
        uname_editor.putString("login_status", "already_logged"); 
        uname_editor.commit(); 

        HttpClient httpClient = new DefaultHttpClient(); 
        HttpGet httpGet = new HttpGet(
          "http://api.tumblr.com/v2/user/info"); 
        try { 
     consumer.sign(httpGet); 
         HttpResponse httpResponse = httpClient.execute(httpGet); 
         System.out.println("httpResponse"); 
         InputStream inputStream = httpResponse.getEntity() 
           .getContent(); 
         InputStreamReader inputStreamReader = new InputStreamReader(
           inputStream); 
         BufferedReader bufferedReader = new BufferedReader(
           inputStreamReader); 
         StringBuilder stringBuilder = new StringBuilder(); 
         String bufferedStrChunk = null; 
         while ((bufferedStrChunk = bufferedReader.readLine()) != null) { 
          stringBuilder.append(bufferedStrChunk); 
         } 
         System.out.println("Returning value of doInBackground :" 
           + stringBuilder.toString()); 
        } catch (ClientProtocolException cpe) { 
         System.out 
           .println("Exception generates caz of httpResponse :" 
             + cpe); 
         cpe.printStackTrace(); 
        } catch (IOException ioe) { 
         System.out 
           .println("Second exception generates caz of httpResponse :" 
             + ioe); 
         ioe.printStackTrace(); 
        } 

       } catch (Exception e) { 
        Log.e(TAG, "OAuth - Access Token Retrieval Error", e); 
       } 

       return null; 
      } 

     } 

Tôi đã cố gắng đăng hình ảnh lên blog của người dùng đã đăng nhập. Sử dụng mã sau đây. Nhưng không nhận được phản hồi.

try { 
           HttpClient client = new DefaultHttpClient(); 
           client.getConnectionManager() 
             .getSchemeRegistry() 
             .register(
               new Scheme("SSLSocketFactory", SSLSocketFactory 
                 .getSocketFactory(), 443)); 
           HttpConnectionParams.setConnectionTimeout(client.getParams(), 
             10000); 
           HttpResponse response1; 
           HttpPost post = new HttpPost(
             "http://api.tumblr.com/v2/blog/"+username+".tumblr.com/post"); 
           consumer.sign(post); 
           JSONObject json_obj_val = new JSONObject(); 
           json_obj_val.put("type", "photo"); 
           json_obj_val.put("caption", "test"); 
           json_obj_val.put("source", "http://50.57.227.117/blacksheep/uploaded/Detailed_images/961314275649aladdins.jpg"); 

            post.setHeader("Content-Type", "application/json"); 
           post.setHeader("Accept", "application/json"); 
           StringEntity entity_val = new StringEntity(
             json_obj_val.toString()); 
           entity_val.setContentEncoding(new BasicHeader(
             HTTP.CONTENT_TYPE, "application/json")); 
           post.setEntity(entity_val); 
           response1 = client.execute(post); 
           String response_string = EntityUtils.toString(response1.getEntity()); 
           Log.v("response >>", response_string); 
           Log.v("response length >>", response_string.length() + ""); 
          } catch (UnsupportedEncodingException e1) { 
           // TODO Auto-generated catch block 
           e1.printStackTrace(); 
          } catch (ClientProtocolException e1) { 
           // TODO Auto-generated catch block 
           e1.printStackTrace(); 
          } catch (ParseException e1) { 
           // TODO Auto-generated catch block 
           e1.printStackTrace(); 
          } catch (JSONException e1) { 
           // TODO Auto-generated catch block 
           e1.printStackTrace(); 
          } catch (IOException e1) { 
           // TODO Auto-generated catch block 
           e1.printStackTrace(); 
          } catch (OAuthMessageSignerException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } catch (OAuthExpectationFailedException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } catch (OAuthCommunicationException e) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 

Có phản hồi sau. có gì sai trong mã?

06-11 16:24:46.312: V/response >>(27710): {"meta":{"status":400,"msg":"Bad Request"},"response":{"errors":["Post cannot be empty."]}} 
+0

Tôi thấy HttpGet của bạn nhưng tôi không thấy nơi bạn đang gửi mã thông báo cùng với Nhận. – Ally

+0

cảm ơn Ally. Bây giờ tôi nhận được thông tin người dùng. Xem bản cập nhật. Tôi đã cố đăng hình ảnh lên blog của người dùng. Nó đã thất bại. – Manikandan

+0

Tôi không biết nhiều về Android, nhưng bạn không nên đặt thông số đăng bài/dữ liệu bài một số thay vì thực thể? Chỉ cần lướt qua một số tài liệu, tôi nghĩ rằng bạn có thể muốn sử dụng setParams() và vượt qua nó một số HttpParams thay thế? – Ally

Trả lời

1

Tôi đã tìm ra giải pháp. Tôi đã sử dụng đoạn mã sau và đăng thành công hình ảnh lên blog của người dùng đã đăng nhập.

DefaultHttpClient client = new DefaultHttpClient(); 
HttpResponse resp = null; 
String result = null; 
    HttpPost hpost = new HttpPost("http://api.tumblr.com/v2/blog/" + username + ".tumblr.com/post"); 
           List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
         nameValuePairs.add(new BasicNameValuePair("type", "photo")); 
         nameValuePairs.add(new BasicNameValuePair("caption", "hello")); 
     nameValuePairs.add(new BasicNameValuePair("source", "url_of_the_image")); 


      String debug = ""; 
      try { 
       hpost.setEntity(new UrlEncodedFormEntity(
         nameValuePairs)); 
       consumer.sign(hpost); 
       resp = client.execute(hpost); 
       result = EntityUtils.toString(resp.getEntity()); 
       Log.v("result >>", result); 
      } catch (UnsupportedEncodingException e) { 
       debug += e.toString(); 
      } catch (OAuthMessageSignerException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (OAuthExpectationFailedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (OAuthCommunicationException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ClientProtocolException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
+0

Serial try/catch, nasty .. nếu có điều gì đó không chắc chắn bạn muốn dừng lại tại thời điểm đó? Tại sao không chỉ có một thử/nắm bắt và đặt trình tự bên trong nó, mỗi người trong số những người bắt sẽ nhận lỗi riêng lẻ. – philask

+0

Tôi cần phải đăng hình ảnh từ thẻ sd vì vậy tôi đã đưa ra file.getAbsolutePath nhưng không hoạt động. Bạn có thể cho tôi biết làm thế nào để làm điều đó? –

Các vấn đề liên quan