2013-05-24 2 views
0

Facebook sdk를 사용하여 Facebook에 로그인하려고합니다. 로그인하지 않고 대화 상자를 열지 만 자격 증명을받지 못하면 작동하지 않습니다. Facebook 앱을 설치하면 Facebook 앱이 열리지 만 로그인이 완료되지 않아 토큰과 사용자 ID를 얻을 수 없습니다. 나는 벽에 메시지를 게시 할 수도 없다. 그러나 "메시지가 성공적으로 표시되었습니다"라는 축배는 표시되지만 Facebook 벽에는 게시되지 않습니다. 코드 :Facebook sdk 3.0.1이 제대로 작동하지 않습니다.

public boolean isSession() { 
    access_token = sp.getString(TOKEN, "x"); 
    expires = sp.getLong(EXPIRES, -1); 
    Log.d("TAG", access_token); 

    if (access_token != null && expires != -1) { 
     facebook.setAccessToken(access_token); 
     facebook.setAccessExpires(expires); 
    } 
    return facebook.isSessionValid(); 
} 

private class LoginDialogListener implements DialogListener { 
    @Override 
    public void onComplete(Bundle values) { 
     Log.d("TAG", "LoginONComplete"); 
     token =facebook.getAccessToken(); 
     token_expires = facebook.getAccessExpires(); 
     Log.d("TAG", "AccessToken: " + token); 
     Log.d("TAG", "AccessExpires: " + token_expires); 

     savePrefs3(EXPIRES,token_expires); 
     savePrefs(TOKEN,token); 
     mAsyncRunner.request("me", new IDRequestListener()); 
    } 

    @Override 
    public void onFacebookError(FacebookError e) { 
     Log.d("TAG", "FacebookError: " + e.getMessage()); 
    } 

    @Override 
    public void onError(DialogError e) { 
     Log.d("TAG", "Error: " + e.getMessage()); 
    } 

    @Override 
    public void onCancel() { 
     Log.d("TAG", "OnCancel"); 
    } 
} 

private class IDRequestListener implements RequestListener { 
    @Override 
    public void onComplete(String response, Object state) { 
     try { 
      Log.d("TAG", "IDRequestONComplete"); 
      Log.d("TAG", "Response: " + response.toString()); 
      JSONObject json = Util.parseJson(response); 

      Uid = json.getString("id"); 
      savePrefs("UID", Uid); 
      final String name = json.getString("name"); 
     } catch (JSONException e) { 
      Log.d("TAG", "JSONException: " + e.getMessage()); 
     } catch (FacebookError e) { 
      Log.d("TAG", "FacebookError: " + e.getMessage()); 
     } 
    } 

    @Override 
    public void onIOException(IOException e, Object state) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onFileNotFoundException(FileNotFoundException e, Object state) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onMalformedURLException(MalformedURLException e, Object state) { 
     // TODO Auto-generated method stub 
    } 

    @Override 
    public void onFacebookError(FacebookError e, Object state) { 
     // TODO Auto-generated method stub 
    } 
} 

public void postToWall(String message){ 
    Bundle parameters = new Bundle(); 
    parameters.putString("message", message); 
    parameters.putString("description", "topic share"); 
    try { 
     facebook.request("me"); 
     String response = facebook.request("me/feed", parameters, "POST"); 
     Log.d("Tests", "got response: " + response); 
     if (response == null || response.equals("") || 
      response.equals("false")) { 
      showToast("Blank response."); 
     } else { 
     showToast("Message posted to your facebook wall!"); 
     } 
     finish(); 
    } catch (Exception e) { 
     howToast("Failed to post to wall!"); 
     e.printStackTrace(); 
     finish(); 
    } 
} 

private void showToast(String message) { 
    Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT).show(); 
} 

내가 잘못하고있는 곳을 알려주십시오. 토스트 앱을 표시 한 후 닫힙니다. 화면을 터치하면 fb 대화 상자를로드하는 중 앱 창이 다시로드되거나 다시 전환됩니다. 즉각적인 답장을 보내주세요.

답변

4

과 함께 Session 객체를 사용해야합니다.

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 



    requestWindowFeature(Window.FEATURE_NO_TITLE); 

// setContentView(R.layout.facebook_dialog); 
    Session.openActiveSession(this, true, new Session.StatusCallback() { 

     // callback when session changes state 
     @Override 
     public void call(Session session, SessionState state, Exception  exception) { 
      if (session.isOpened()) { 
       // make request to the /me API 
       Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 

        // callback after Graph API response with user object 
        @Override 
        public void onCompleted(GraphUser user, Response response) { 
         if (user == null) { 



     Toast.makeText(LoginFacebook.this.getApplicationContext(), 
            "Facebook Error", 

Toast.LENGTH_LONG).show(); 

finish(); 
         } 
         else 
         { 

     Toast.makeText(LoginFacebook.this.getApplicationContext(), 
            user.getName()+" Logged in Successfully.", 
            T  
    Toast.LENGTH_LONG).show(); 
          finish(); 
         } 
         //login_fb.setEnabled(true); 
         //progress.setVisibility(View.INVISIBLE); 
        } 

       }); 


      } 
     } 
    }); 


} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
    finish(); 
} 

응용 프로그램 태그 아래 Manifest.xml 파일에서 다음 코드를 사용합니다.

<meta-data 
     android:name="com.facebook.sdk.ApplicationId" 
     android:value="@string/app_id" /> 

    <activity 
     android:name="com.facebook.LoginActivity" 
     android:label="@string/app_name" > 
    </activity> 

에서 Loging는이 메서드를 호출 할 필요가 벽에 게시 한 ...

 private void publishStory(String user) { 
    try { 
     Session session = Session.getActiveSession(); 

     if (session != null){ 

      // Check for publish permissions  
      List<String> permissions = session.getPermissions(); 
      if (!isSubsetOf(PERMISSIONS, permissions)) { 
       pendingPublishReauthorization = true; 
       Session.NewPermissionsRequest newPermissionsRequest = new Session 
         .NewPermissionsRequest(this, PERMISSIONS); 
       session.requestNewPublishPermissions(newPermissionsRequest); 
       return; 
      } 

      Bundle postParams = new Bundle(); 
      postParams.putString("message", messageToPost); 

      Request.Callback callback= new Request.Callback() { 
       public void onCompleted(Response response) { 
        JSONObject graphResponse = response 
          .getGraphObject() 
          .getInnerJSONObject(); 
        String postId = null; 
        try { 
         postId = graphResponse.getString("id"); 
        } catch (Exception e) { 
         Log.i("Test", 
           "JSON error "+ e.getMessage()); 
        } 
        FacebookRequestError error = response.getError(); 
        if (error != null) { 
         Toast.makeText(ShareOnFacebook.this 
           .getApplicationContext(), 
           error.getErrorMessage(), 
           Toast.LENGTH_SHORT).show(); 
        } else { 

         progress.setVisibility(View.INVISIBLE); 
         toastmessage="Posted Successfully"; 
         Toast.makeText(ShareOnFacebook.this 
           .getApplicationContext(), 
           toastmessage, 
           Toast.LENGTH_SHORT).show(); 

        } 
       } 
      }; 

      Request request = new Request(session, user+"/feed", postParams, 
        HttpMethod.POST, callback); 

      RequestAsyncTask task = new RequestAsyncTask(request); 
      task.execute(); 
     } 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     Toast.makeText(ShareOnFacebook.this 
       .getApplicationContext(), 
       "Facebook Error", 
       Toast.LENGTH_SHORT).show(); 
    } 

} 
private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) { 
    for (String string : subset) { 
     if (!superset.contains(string)) { 
      return false; 
     } 
    } 
    return true; 
} 

변수를 선언 등 ..

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions","manage_pages","publish_stream"); 
private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization"; 
private boolean pendingPublishReauthorization = false; 
+0

세션을 사용하여 facebook wall pls help에 메시지를 올리는 방법. 세션을 사용하여 로그인하지만, 나는 세션을 사용하여 메시지를 게시하는 방법을 모른다. – Deepu

+0

수정 된 답변을 확인하십시오. 그것이 도움이된다면 투표하십시오 ... –

+0

@AbhishekAgarwal 해당 사용자가 로그인했는지 여부를 확인하는 방법 btn을 클릭하십시오. – Singhak

0

질문에 대한 답변이 정확하지 않지만 앱을 개발하기 시작한 경우 : 3.x API에서 Facebook 개체 사용이 권장되지 않습니다. 새로운 API에서는 페이스 북의 객체가 depreciated.You가에서 OnCreate() 방법 활동 에 다음 코드를 사용할 수있다 UiLifecycleHelper

+0

는 U에게 그것을 감사 나를 위해 일했다. 나는 세션을 사용했다. – Deepu

관련 문제