2013-02-25 11 views
8

Ich habe eine native Android-App, die eine Verbindung zu einer anderen Facebook-App (unterschiedliche Application ID) basierend auf einer App-Einstellung, die zur Laufzeit geändert werden kann.Facebook SDK für Android - Anwendungs-ID programmgesteuert festlegen

Stellen Sie sich vor, die App kann so eingestellt werden, dass sie auf DEV, TEST oder PROD zeigt. Wenn auf DEV verwiesen wird, sollte die FB Application ID "1" sein. Wenn auf TEST verwiesen wird, sollte die FB-Anwendungs-ID "2" sein. etc.

Das Problem ist, dass der UiLifecycleHelper vom Facebook SDK während der onCreate-Phase automatisch die "com.facebook.sdk.ApplicationId" aus der AndroidManifest.xml liest. Es scheint keine Möglichkeit zu geben, dies programmatisch festzulegen.

Ist es möglich, UiLifecycleHelper zu verwenden und zur Laufzeit auf eine andere Anwendungs-ID zu zeigen, oder muss ich auf die manuelle Verwaltung der Sitzung zurückgreifen?

+0

Sie können der Idee von Ravi Kumar folgen. Aber es wird für keine FacebookDialogs funktionieren. Für Dialoge können Sie einen eigenen Konstruktor für die DialogBuilder im SDK schreiben. – Sripathi

Antwort

0

Können Sie nicht einfach das SDK forkieren und diese Änderungen selbst hinzufügen?

+0

Ja, das ist, was ich tun werde, wenn ich muss, aber es ist bedauerlich, wenn es keine unterstützte Möglichkeit gibt, dies in der API zu tun. –

3

Ja, Sie können es programmgesteuert festlegen. Verwenden Sie die Sessions $ Builder-Klasse, mit der Sie eine Sitzung erstellen können, ohne einen der privaten Konstruktoren verwenden zu müssen.

Session session = new Session.Builder(context).setApplicationId(applicationId).build(); 
+0

Wie verwenden Sie dies in Verbindung mit UIHelper? –

+0

Ich überprüfe, ob ich eine gültige Sitzung habe, bevor ich den UiLifecycleHelper per Callback aufruft. Ich kann mir vorstellen, dass es nicht so elegant ist wie eine benutzerdefinierte Version mit Gabeln, aber es hält unsere Wartung niedrig. – mhradek

13

Hier ist, was ich die Anwendungs-ID programatcally

private Session.StatusCallback statusCallback = new SessionStatusCallback(); 

protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    String s=""+R.string.app_id; 

    Session session = new Session.Builder(getBaseContext()).setApplicationId(s).build(); 

    Session.setActiveSession(session); 

    if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
     session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
    } 
} 

private class SessionStatusCallback implements Session.StatusCallback { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     // TODO Auto-generated method stub 
     if(session.isOpened()){ 
      //Do your task 
     } 
    } 
} 
+2

+1 für das Finden einer Lösung mit vorhandenem Code. – greg7gkb

+0

Ich kann das nicht zur Arbeit bringen. Die if session.getState(). equals (SessionState.CREATED_TOKEN_LOADED) wird übersprungen – user1634451

+1

Wie wird dies in Verbindung mit UIHelper verwendet? –

2

Ich denke, setzen verwendet es einen einfacheren Weg, dies zu tun, rufen Sie einfach die statische Methode setApplicationId com.facebook.Settings.setApplicationId(facebookID);

Und du bist gut zu gehen. Keine Notwendigkeit, eine Sitzung manuell mit dem Builder zu erstellen und als aktive Sitzung festzulegen!

Einzelheiten zum Flaw:

Die facebookID Sie in den Einstellungen Klasse festgelegt wird durch getMetadataApplicationId Methode der com.facebook.internal.Utility

public static String getMetadataApplicationId(Context context) { 
     Validate.notNull(context, "context"); 

     Settings.loadDefaultsFromMetadata(context); 

     return Settings.getApplicationId(); 
    } 

Was wiederum verwendet werden, werden von allen Anrufen verwendet werden erstellen eine Sitzung:

Session(Context context, String applicationId, TokenCachingStrategy tokenCachingStrategy, 
      boolean loadTokenFromCache) { 
     // if the application ID passed in is null, try to get it from the 
     // meta-data in the manifest. 
     if ((context != null) && (applicationId == null)) { 
      applicationId = Utility.getMetadataApplicationId(context); 
     } 

     Validate.notNull(applicationId, "applicationId"); 
. 
. 
. 
} 

Prost.

+0

Gute Suche, aber "getMetadataApplicationId" wird nur aufgerufen, wenn App ID = null, dh Sie können Ihre App ID nicht aktualisieren, wenn Sie bereits eine haben. – Wayne

23

Hallo alles, was ich oben Antwort wissen, ist die richtige für older sdk version, aber in facebook sdk 4 gibt es keine Session Klasse

Sie können es einfach tun, indem diese einzige Zeile Code verwendet:

FacebookSdk.setApplicationId(APP_ID); 

Dank!

+2

Können wir es jederzeit machen oder muss es vor FacebookSdk.sdkInitialize() sein? – Sagar

Verwandte Themen