2011-05-11 3 views
4

this 구현 (승인 된 답변 참조)을 사용하여 사용자의 페이스 북 벽에 상태 업데이트를 게시하는 활동을 구축했습니다.페이스 북 앱이 기기/에뮬레이터에 설치되었을 때 페이스 북 앱이 사용자에게 게시되지 않습니다.

에뮬레이터/전화에 페이스 북 앱이 설치되어 있지 않아도 문제없이 작동합니다.

에뮬레이터/전화에 페이스 북 앱이 설치되어있는 경우 페이스 북 앱이 로그인 화면을로드하지만 로그인을 시도하면 페이스 북 앱이 사라져서 내 앱으로 다시 연결됩니다.

페이스 북 앱을 설치할 때 경험이있는 사람이 있습니까?

내 코드 : 지난 한 해 동안 여러 시스템에 안드로이드 개발 플랫폼을 설치할 필요하고 항상 한 후 :

05-11 13:03:34.076: INFO/ActivityManager(98): Starting activity: Intent { cmp=com.facebook.katana/.ProxyAuth (has extras) } 
05-11 13:03:34.246: INFO/ActivityManager(98): Displayed activity com.facebook.katana/.ProxyAuth: 158 ms (total 158 ms) 
05-11 13:03:35.166: DEBUG/dalvikvm(12390): GC_FOR_MALLOC freed 6729 objects/418424 bytes in 44ms 
05-11 13:03:35.166: DEBUG/webviewglue(12390): nativeDestroy view: 0x527e20 
05-11 13:03:35.166: DEBUG/NativeCrypto(12390): Freeing OpenSSL session 

편집 :

public class AchievementActivity extends Activity implements DialogListener, OnClickListener{ 


private Facebook facebook; 
Button facebookPostButton; 
String defaultFacebookPost; 

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

    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); 
    setContentView(R.layout.achievements); 
    getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_layout); 

    View achievementDivider = (View)findViewById(R.id.achievementDivider); 
    int[] colors = {0, 0xff00ffff, 0}; 
    achievementDivider.setBackgroundDrawable(new GradientDrawable(Orientation.RIGHT_LEFT, colors)); 

    //get the title of the achievement from the intent that started this activity from the activity StatisticsActivity 
    String achievementTitleString = getIntent().getStringExtra("title"); 

    String achievementTextToDisplay = getAchievementTextToDisplay(achievementTitleString); 

    defaultFacebookPost = getDefaultPost(achievementTitleString); 

    //ImageView achievementActivityAchievementBadgeImageView = (ImageView)findViewById(R.id.achievementActivityAchievementBadgeImageView); 
    TextView achievementActivityBadgeTitleTextView = (TextView)findViewById(R.id.achievementActivityBadgeTitleTextView); 
     achievementActivityBadgeTitleTextView.setText(achievementTitleString); 

    TextView achievementActivityAchievementText = (TextView)findViewById(R.id.achievementActivityAchievementText); 
     achievementActivityAchievementText.setText(achievementTextToDisplay); 

    facebookPostButton = (Button)findViewById(R.id.facebookPostButton); 
    facebookPostButton.setOnClickListener(this); 


} 

@Override 
public void onComplete(Bundle values) { 

    if (values.isEmpty()) 
    { 
     Toast.makeText(getApplicationContext(), "Empty", Toast.LENGTH_SHORT); 

     return; 
    } 

    if (!values.containsKey("post_id")) 
    { 
     try 
     { 
      Bundle parameters = new Bundle(); 
      parameters.putString("message", defaultFacebookPost);// the message to post to the wall 
      facebook.dialog(AchievementActivity.this, "stream.publish", parameters, this);// "stream.publish" is an API call 
     } 
     catch (Exception e) 
     { 
      // TODO: handle exception 
       System.out.println(e.getMessage()); 
     } 
    } 

    try 
    { 
     facebook.logout(getApplicationContext()); 
    } 
    catch (MalformedURLException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    catch (IOException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

@Override 
public void onFacebookError(FacebookError error) 
{ 
    Toast.makeText(AchievementActivity.this, "onFacebookError", Toast.LENGTH_LONG); 
} 

@Override 
public void onError(DialogError e) 
{ 
    Toast.makeText(AchievementActivity.this, "onError", Toast.LENGTH_LONG); 
} 

@Override 
public void onCancel() 
{ 
    Toast.makeText(AchievementActivity.this, "onCancel", Toast.LENGTH_LONG); 
} 

@Override 
public void onClick(View v) 
{ 
    if (v == facebookPostButton) 
    { 
     facebook = new Facebook("my_facebook_api"); 
     // replace APP_API_ID with your own 
     facebook.authorize(this, new String[] {"publish_stream", "read_stream", "offline_access"}, this); 
    } 
} 

private String getDefaultPost(String defaultTitleString) 
{ 
    //do some stuff here to get a string to post to wall 

    return defaultPost; 
} 

private String getAchievementTextToDisplay(String achievementTitleString) { 
    String achievementTextToDisplay = "DEFAULT"; 

    //do some stuff here to get text to display in the activity 
      //this has nothing to do with the facebook post... 

    return achievementTextToDisplay; 
} 

} 

로그 캣은 저에게이 말하고있다 새로운 개발 환경을 만든 후 Facebook에 대한 문제로이 간단한 대답이 Facebook 구현이 하나의 기기에서 작동하고 다른 기기에서 작동하지 않을 수 있음을 발견했습니다. ....

다른 비밀 번호로 패키지하는 앱의 각 버전에 대한 비밀 Facebook API 키 (developer.facebook.com에 나열한 것)가 다릅니다. 예를 들어 두 대의 개발 기계가 있다고 가정 해보십시오. 이 두 시스템 모두 다른 인증서로 응용 프로그램을 빌드하므로 각 시스템에 Facebook API 비밀 키를 생성하고 developer.facebook.com에 나열해야합니다.

+0

최신 FB 앱 업데이트가 설치되어 있습니까? 과거에 FB SDK를 사용했을 때 FB 앱이 최신 버전으로 업데이트되지 않았기 때문에 문제가 발생했습니다. (마켓 앱, 내 앱을 확인한 후 FB 앱에서 보류중인 업데이트가 없는지 확인하십시오.) –

+0

@Mathias Lin - Faceboook SKD와 함께 제공되는 동일한 버전의 Facebook을 사용하고 있습니다. 그들은 당신이 gitHub에서 얻을 때 응용 프로그램의 컴파일 된 사본을 제공합니다. – dell116

답변

1

페이스 북 계정에 로그인하면 장치에 로그인 세션이 만들어지기 때문입니다. 당신은 작업을 마친 후 페이스 북에서 로그 아웃해야합니다.

+0

답장을 보내 주셔서 감사합니다.하지만 페이스 북 앱을 계속 사용하지 못하는 것 같습니다. 그냥 사라집니다. 내 활동에 대한 코드를 포함하도록 내 질문을 편집했습니다. – dell116

+0

자세한 답변을 제공해주십시오. – tobias

0
private static final String[] PERMISSIONS = 
     new String[] {"publish_stream", "read_stream", "offline_access"}; 




@Override 
public void onClick(View v) 
{ 
    if (v == facebookPostButton) 
    { 
     mAsyncRunner = new AsyncFacebookRunner(mFacebook); 
            mAsyncRunner.request(mFacebook.logout(getApplicationContext()), new LogoutListener()); 
         mFacebook.authorize(FacebookImplement.this, PERMISSIONS, new AuthorizeListener()); 
    } 
} 



public class AuthorizeListener extends BaseDialogListener { 

     public void onComplete(Bundle values) { 

      Bundle params = new Bundle(); 
      params.putString("message"," Message"); 
     params.putString("description", "Wall Posting Description");   
     mAsyncRunner.request("me/feed", params, "POST", 
       new UploadListener());   

     } 

}

public class UploadListener extends BaseRequestListener { 

     public void onComplete(final String response) { 
       mAsyncRunner.request(mFacebook.logout(getApplicationContext()), new LogoutListener()); 
} 

}

public class LogoutListener extends BaseRequestListener { 


     public void onComplete(final String response) {   



     } 
    } 

이 코드가 도움이 될 수 있습니다. 문제가 있으면 아무 문제없이 질문하십시오.

+0

코드를 제공해 주셔서 감사합니다.하지만 여전히 동일한 결과를 얻습니다. 페이 스북 응용 프로그램이 열리지 만 곧 닫히고 내 응용 프로그램의 주요 활동으로 돌아갑니다. 게다가 새로운 프로젝트를 만들었고 새로운 프로젝트에서 www.facebook/developers의 페이스 북 코드를 사용했다가 다시 한 번 페이스 북 앱이 열리고 곧 닫힙니다. 이것은 기기에 페이스 북이 설치되어있을 때만 발생하며 webview를 사용할 때 모든 것이 잘 작동합니다. 나는 완전한 손실에 여기있다. – dell116

+0

당신은 저를 올바른 길로 가꿔 놓았습니다. 세션에 올바르게 로그인하거나 로그 아웃하지 않았다고 본래의 답이 맞습니다. 위의 코드를보고 github의 예제를보고 마침내 작동하게 만들 수있었습니다. – dell116

+0

비슷한 문제가 있습니다. 세션에 제대로 로그인하고 로그 아웃하는 것에 대한 의견을 따르지는 않습니다 ... 조금 확장 할 수 있습니까? –

3

해결 방법을 찾았지만 지금까지는 좋지 않습니다.

facebook.authorize(activity, PERMISSIONS, Facebook.FORCE_DIALOG_AUTH, 
       new LoginDialogListener()); 

이렇게하면 공식 페이스 북 앱이 장치에 설치된 경우 앱이 SSO를 사용하지 않게됩니다. 하지만 공식적인 페이스 북 앱과 sso를 사용하는 앱이 있기 때문에 더 나은 솔루션이 있어야합니다.