2012-03-30 14 views
1

Ich benutze Facebook Android SDK, um SSO zu erlauben. Ich habe die Anleitung und das Tutorial in Hackbook gefolgt, aber es passiert, dass das Telefon scheint auf einem weißen Bildschirm stecken, nach 10 Sekunden erscheint ein Fortschritt Dialog und der Prozess läuft wie erwartet.Facebook android SDK und weißer Bildschirm

Ich habe versucht, das Problem (asynchrone Aufgaben, transparente Layouts) zu beheben, aber es scheint nichts funktioniert.

Dies ist der Code in Facebook Aktivität:

@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); 
} 

und es wird durch eine einfache StartActivity genannt. facebook_activity ist ein linearLayout ohne etwas darin. Ich habe ein transparentes Thema (Android: theme = "@ android: style/Theme.Translucent.NoTitleBar") auf FacebookActivity gesetzt, um es zumindest transparent zu machen, aber es hat auch nicht funktioniert.

Danke an alle, die helfen könnten, dies zu beheben.

Antwort

0

Ich denke, dass dies möglicherweise daran liegt, dass sowohl facebook.authorize() als auch signalResult() asynchron ausgeführt werden. Der Code muss zuerst zur Autorisierung aufrufen, muss dann jedoch im Netzwerk warten, damit dieser Aufruf beendet wird, bevor die Absicht gestartet wird. Dies könnte die Anwendung anhalten.

Alternativ, da all Ihre Fehlerzustände authorizeFacebook() aufrufen und jede dieser Anforderungen asynchron ist, ist es möglich, dass Sie mehrere Threads haben, die alle gleichzeitig gesponnen werden?

0

Bitte aktualisieren Sie unten Code Ihrer authorizeFacebook() -Funktion, es wird Ihr Problem lösen.

Und siehe unten Link für weitere Informationen.

Facebook Login Issue

Verwandte Themen