2013-04-25 2 views
4

Я следую учебнику для входа в приложение для Android с помощью facebook.проблемы с Request.executeMeRequestAsync (session, Request.GraphUserCallback()) function

У меня было много проблем с ключами хэша и всего остального, и я думаю, что я решил их все, потому что моя сессия уже получила состояние OPENED.

Проблема, с которой я столкнулся сейчас, заключается в том, что после входа в facebook, когда сеанс уже открыт, код выполняет Request.executeMeRquestAsync(), и он никогда не входит в часть onComplete() ... любая идея?

Вот код ...

package com.example.firstandroidapp; 

import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.PackageInfo; 
import android.content.pm.PackageManager; 
import android.content.pm.PackageManager.NameNotFoundException; 
import android.content.pm.Signature; 
import android.os.Bundle; 
import android.util.Base64; 
import android.util.Log; 
import android.widget.TextView; 


import com.facebook.Request; 
import com.facebook.Response; 
import com.facebook.Session; 
import com.facebook.SessionState; 
import com.facebook.model.GraphUser; 

public class MainActivity extends Activity { 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // start Facebook Login 
    Session.openActiveSession(this, true, new Session.StatusCallback() { 

     // callback when session changes state 
     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
      try { 
       PackageInfo info = getPackageManager().getPackageInfo("com.example.firstandroidapp", 
              PackageManager.GET_SIGNATURES); 
       for (Signature signature : info.signatures) { 
        MessageDigest md = MessageDigest.getInstance("SHA"); 
        md.update(signature.toByteArray()); 
        Log.i("Digest: ", Base64.encodeToString(md.digest(), 0)); 
       } 
      } catch (NameNotFoundException e) { 
       Log.e("Test", e.getMessage()); 
      } catch (NoSuchAlgorithmException e) { 
       Log.e("Test", e.getMessage()); 
      } 

      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) { 
       // it never gets here... 
        if (user != null) { 
       TextView welcome = (TextView) findViewById(R.id.welcome); 
       welcome.setText("Hello " + user.getName() + "!"); 
       } 
      } 
      }); 
     } 
     } 
    }); 
    } 

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

} 

Thanx очень много заранее. Дэвид.

+0

отправьте код, который вы используете, чтобы мы могли помочь. – hardartcore

+0

Код тот же самый, что и в учебнике ... Я буду reedit вопрос ... thanx –

+0

см. Этот пример: https://developers.facebook.com/docs/howtos/androidsdk/3.0/login-with -facebook /, поскольку я вижу, что вы пропустили много вещей из кода. – hardartcore

ответ

1

Session.openActiveSession возвращает сеанс напрямую, если он уже открыт. Это может быть вашей проблемой. В этом случае вызов нельзя вызвать. (Тем не менее, в процессе реализации этого сам.)

Создать экземпляр SessionCallback перед вызовом и - если сессия возвращается непосредственно - называйте:

StatusCallback cb = new StatusCallback() {/* implement */}; 
Session fbSession = Session.openActiveSession(this, true, cb); 
if (fbSession != null) { 
    cb.call(fbSession, fbSession.getState(), null); 
} 

Проверка для состояния сеанса внутри обратный вызов, поэтому вам не нужно дважды обрабатывать разные состояния.

2

У меня была та же проблема.

В этом учебном пособии мы можем изменить AndroidManifest.xml. В модификации я помещал теги ниже в неправильные места (я не использовал Eclipse для изменения файла манифеста), и это предотвратило обратный вызов.

<manifest ...> 
    ... 
    <application ...> 
    ... 
    <activity android:name="com.facebook.LoginActivity"/> 
    ... 
    <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/> 
    ... 
    </application> 
    ... 
    <uses-permission android:name="android.permission.INTERNET"/> 
    ... 
</manifest> 

Попробуйте выполнить двойную проверку AndroidManifest.xml. The official document будет полезен.

Смежные вопросы