2012-03-30 3 views
1

SSO를 허용하기 위해 Facebook Android SDK를 사용하고 있습니다. 나는 Hackbook의 가이드와 튜토리얼을 따라 갔지만, 10 초 후에 진행 화면이 나타나고 프로세스가 예상대로 계속 진행되면서 전화가 흰색 화면에 낀 것처럼 보입니다.Facebook android SDK 및 흰색 화면

나는 (비동기 작업, 투명 레이아웃) 문제를 해결하기 위해 열심히 노력했지만 아무것도 작동하지 않는 것 같습니다.

페이스 북 활동 코드입니다 :

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.facebook_activity); 
    /* 
    * Get existing access_token if any 
    */ 
    mPrefs = getPreferences(MODE_PRIVATE); 
    String access_token = mPrefs.getString("access_token", null); 
    long expires = mPrefs.getLong("access_expires", 0); 
    if (access_token != null) { 
     facebook.setAccessToken(access_token); 
    } 
    if (expires != 0) { 
     facebook.setAccessExpires(expires); 
    } 

    /* 
    * Only call authorize if the access_token has expired. 
    */ 
    // showProgress(); 
    if (!facebook.isSessionValid()) { 

     authorizeFacebook(); 
    } else { 
     signalResult(); 
    } 
} 


private void authorizeFacebook() { 
    facebook.authorize(this, new String[] { "email", "offline_access", 
      "publish_stream", "user_about_me" }, new DialogListener() { 
     @Override 
     public void onComplete(Bundle values) { 
      // SharedPreferences.Editor editor = mPrefs.edit(); 
      // editor.putString("access_token", 
      // facebook.getAccessToken()); 
      // editor.putLong("access_expires", 
      // facebook.getAccessExpires()); 
      // editor.commit(); 
      signalResult(); 
      // retrieve call obtain information and register 

     } 

     @Override 
     public void onFacebookError(FacebookError error) { 
     } 

     @Override 
     public void onError(DialogError e) { 
     } 

     @Override 
     public void onCancel() { 
     } 
    }); 
} 

private void signalResult() { 
    // retrieve user info 
    new AsyncFacebookRunner(facebook).request("me", 
      new AsyncFacebookRunner.RequestListener() { 

       @Override 
       public void onMalformedURLException(
         MalformedURLException e, Object state) { 
        authorizeFacebook(); 
       } 

       @Override 
       public void onIOException(IOException e, Object state) { 
        authorizeFacebook(); 
       } 

       @Override 
       public void onFileNotFoundException(
         FileNotFoundException e, Object state) { 
        authorizeFacebook(); 
       } 

       @Override 
       public void onFacebookError(FacebookError e, Object state) { 
        authorizeFacebook(); 
       } 

       @Override 
       public void onComplete(String response, Object state) { 
        Intent intent = new Intent(); 
        String accessToken = facebook.getAccessToken(); 
        String id = null; 
        JSONObject json; 
        try { 
         json = new JSONObject(response); 
         id = json.getString("id"); 
         intent.putExtra(WeOrderApplication.FACEBOOK_USER, id); 
         intent.putExtra(WeOrderApplication.FACEBOOK, 
           accessToken); 
         // hideProgress(); 
         setResult(RESULT_OK, intent); 
         finish(); 
        } catch (JSONException e) { 
         authorizeFacebook(); 
         e.printStackTrace(); 
        } 

       } 
      }); 

} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    facebook.authorizeCallback(requestCode, resultCode, data); 
} 

과 간단한 startActivity를 통해 호출된다. facebook_activity는 아무것도없는 linearLayout입니다. FacebookActivity에 반투명 테마 (android : theme = "@ android : style/Theme.Translucent.NoTitleBar")를 설정하여 투명하게 만들었지 만 작동하지 않았습니다.

이 문제를 해결하는 데 도움을 주신 모든 분들께 감사드립니다.

답변

0

facebook.authorize()signalResult()이 모두 비동기 적으로 실행되고 있기 때문일 수 있습니다. 코드는 먼저 권한 부여를 호출해야하지만 인 쇄를 시작하기 전에 해당 호출이 완료 될 때까지 네트워크에서 대기해야합니다. 이로 인해 애플리케이션이 일시 중지 될 수 있습니다.

모든 오류 상태가 authorizeFacebook()이므로이 요청의 각각은 비동기 적이기 때문에 한 번에 여러 개의 스레드가 스핀 될 가능성이 있습니까?

0

authorizeFacebook() 함수의 아래 코드를 업데이트하면 문제가 해결됩니다.

facebook.authorize(mActivity, mPermissions, Facebook.FORCE_DIALOG_AUTH, 
      new LoginDialogListener()); 

자세한 내용은 아래 링크를 참조하십시오.

Facebook Login Issue