2010-01-26 12 views
5

kullanarak aşağıdaki hatayı alıyorum?Facebook Connect Android stream.publish @ http://api.facebook.com/restserver.php

:

HttpURLConnection conn = null; 
OutputStream out = null; 
InputStream in = null; 
try { 
    conn = (HttpURLConnection) _loadingURL.openConnection(); 
    conn.setDoOutput(true); 
    conn.setDoInput(true); 
    if (method != null) { 
     conn.setRequestMethod(method); 
     if ("POST".equals(method)) { 
      //"application/x-www-form-urlencoded"; 
      String contentType = "multipart/form-data; boundary=" + kStringBoundary; 
      //String contentType = "application/x-www-form-urlencoded"; 
      conn.setRequestProperty("Content-Type", contentType); 
     } 

     // Cookies are used in FBPermissionDialog and FBFeedDialog to 
     // retrieve logged user 
     conn.connect(); 
     out = conn.getOutputStream(); 
     if ("POST".equals(method)) { 
      String body = generatePostBody(postParams); 
      if (body != null) { 
       out.write(body.getBytes("UTF-8")); 
      } 
     } 
     in = conn.getInputStream(); 

İşte akışı yayınlamak için kullanıyorum bir yöntem vardır:

String contentType = "application/x-www-form-urlencoded"; 

veya

String contentType = "multipart/form-data; boundary=" + kStringBoundary; 

Bu benim akışı yazıyorum nasıl: mıyım olarak ayarlandı

private void publishFeed(String themessage) { 
    //Intent intent = new Intent(this, FBFeedActivity.class); 
    // intent.putExtra("userMessagePrompt", themessage); 
    // intent.putExtra("attachment", 
    Map<String, String> getParams = new HashMap<String, String>(); 
    // getParams.put("display", "touch"); 
    // getParams.put("callback", "fbconnect://success"); 
    // getParams.put("cancel", "fbconnect://cancel"); 

    Map<String, String> postParams = new HashMap<String, String>(); 

    postParams.put("api_key", _session.getApiKey()); 
    postParams.put("method", "stream.publish"); 
    postParams.put("session_key", _session.getSessionKey()); 
    postParams.put("user_message", "TESTING 123"); 
    // postParams.put("preview", "1"); 
    postParams.put("attachment", "{\"name\":\"Facebook Connect for Android\",\"href\":\"http://code.google.com/p/fbconnect-android/\",\"caption\":\"Caption\",\"description\":\"Description\",\"media\":[{\"type\":\"image\",\"src\":\"http://img40.yfrog.com/img40/5914/iphoneconnectbtn.jpg\",\"href\":\"http://developers.facebook.com/connect.php?tab=iphone/\"}],\"properties\":{\"another link\":{\"text\":\"Facebook home page\",\"href\":\"http://www.facebook.com\"}}}"); 
    // postParams.put("user_message_prompt", "22222"); 


    try { 
     loadURL("http://api.facebook.com/restserver.php", "POST", getParams, postParams); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } 
} 

İşte buyPostBody():

private String generatePostBody(Map<String, String> params) { 
    StringBuilder body = new StringBuilder(); 
    StringBuilder endLine = new StringBuilder("\r\n--").append(kStringBoundary).append("\r\n"); 

    body.append("--").append(kStringBoundary).append("\r\n"); 

    for (Entry<String, String> entry : params.entrySet()) { 
     body.append("Content-Disposition: form-data; name=\"").append(entry.getKey()).append("\"\r\n\r\n"); 
     String value = entry.getValue(); 
     if ("user_message_prompt".equals(entry.getKey())) { 
      body.append(value); 
     } 
     else { 
      body.append(CcUtil.encode(value)); 
     } 

     body.append(endLine); 
    } 

    return body.toString(); 
} 

Teşekkürler.

+0

'loadURL() yöntemi nasıl uygulanır? PS. Lütfen gönderinizi yeniden düzenleyin, bazı kodları burada okuyamayız .... –

cevap

0

Facebook Geliştiriciler Wiki gelen bu edilmektedir: (Facebook API üzerinde örn Photos.upload) dosyalarını yalnızca Ayrıca

yüklerken http://wiki.developers.facebook.com/index.php/API

Note: If you manually form your HTTP POST requests to Facebook, you must include the request data in the POST body. In addition, you should include a Content-Type: header of application/x-www-form-urlencoded.

Kullanım çok parçalı/form-data dayanarak Bu API referansı, http://wiki.developers.facebook.com/index.php/How_Facebook_Authenticates_Your_Application, yanlış yaptığınız şey budur.

1) Facebook parametrelerini saklamak için HashMap'u kullanmayın. Parametreler anahtarlarından sorted olmalıdır. Bunun yerine, SortedMap arayüzünü kullanın ve Facebook parametrelerini saklamak için TreeMap kullanın.

2) Daima Facebook'a çağrıyı gönderen önce haritada yılında sig parametresini ekleyin. Facebook "sig parametresi isteğinizi bulamadığı için" 104 Yanlış imza "alıyorsunuz.

Referans (http://wiki.developers.facebook.com/index.php/How_Facebook_Authenticates_Your_Application), facebook'un kullandığı bir MD5 imzasının tam olarak nasıl oluşturulacağını gösterir.

Facebook için hızlı bir şekilde sig değerini nasıl oluşturabilirsiniz.

String hashString = ""; 
     Map<String, String> sortedMap = null; 
     if (parameters instanceof TreeMap) { 
      sortedMap = (TreeMap<String, String>) parameters; 
     } else { 
      sortedMap = new TreeMap<String, String>(parameters); 
     } 

     try { 
      Iterator<String> iter = sortedMap.keySet().iterator(); 
      StringBuilder sb = new StringBuilder(); 
      synchronized (iter) { 
       while (iter.hasNext()) { 
        String key = iter.next(); 
        sb.append(key); 
        sb.append("="); 
        String value = sortedMap.get(key); 
        sb.append(value == null ? "" : value); 
       } 
      } 
      sb.append(secret); 

      MessageDigest digest = MessageDigest.getInstance("MD5"); 
      byte[] digested = digest.digest(sb.toString().getBytes()); 

      BigInteger bigInt = new BigInteger(1, digested); 
      hashString = bigInt.toString(16); 
      while (hashString.length() < 32) { 
       hashString = "0" + hashString; 
      } 
     } catch (NoSuchAlgorithmException nsae) { 
      // TODO: handle exception 
      logger.error(e.getLocalizedMessage(), e); 
     } 

     return hashString; 
İlgili konular