2012-07-27 4 views
1

내 앱에서 이상한 facebook 연결 동작이 발생합니다. 에뮬레이터에서 사용하는 경우 facebook.request (사용자 데이터 검색) 및 facebook.dialog (벽에 게시)에 대한 호출은 facebook.authorize> onComplete에서 수행됩니다. 하지만 디버깅을 위해 장치를 사용하는 경우이 호출은 onActivityResult()에서 작동해야합니다.Facebook Connect는 에뮬레이터/기기에서 작동하지만 Google Play에서는 작동하지 않습니다.

그리고 Google에서 장치 검사를 거친 apk를 업로드했지만 작동하지 않습니다! 이클립스에서 설치 한 경우 SAME 코드가 작동합니다 ... Play에서 다운로드하면 작동하지 않습니다!

"does not works"는 사용자가 권한을 부여한 후 facebook.request 및 facebook.dialog가 호출되지 않고 빈 화면에 멈추는 것을 의미합니다.

내 페이스 북에 연결 활동

public class FacebookConnectActivity extends Activity { 
private static final String TAG_JSON = "json"; 
static Facebook facebook = new Facebook("111111111111111"); 
AsyncFacebookRunner mAsyncRunner; 
private SharedPreferences mPrefs; 
JSONObject json; 
Context ctx = this; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.resgatar_produto_layout); 
    Log.w("FacebookConnect", "Activity Started"); 

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

    if(!facebook.isSessionValid()) { 

    facebook.authorize(this, new String[] {"email", "user_photos",  "user_birthday", "user_hometown", "user_relationships","user_location", "user_work_history",  "publish_actions"}, new DialogListener() { 
     @Override 
     public void onComplete(Bundle values) { 
      Log.w("FacebookConnect", "User authorized"); 
      /*mAsyncRunner = new AsyncFacebookRunner(facebook); 
      mAsyncRunner.request("me", new SampleRequestListener()); 
      Bundle params = new Bundle(); 
      params.putString("link", "www.qranio.com"); 
      facebook.dialog(ctx, "feed", params, new SampleDialogListener());*/ 
     } 

     @Override 
     public void onFacebookError(FacebookError error) { 
      Log.w("FacebookConnect", "Error authorizing: "+error.toString()); 
     } 

     @Override 
     public void onError(DialogError e) {} 

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

    } 

} 

public static void logoutFB(){ 
    if(facebook.isSessionValid()){ 
     facebook.setAccessToken(null); 
    } 
} 

public void startDataProcess(){ 
    while (json==null){ 

    } 
    Intent a = new Intent(FacebookConnectActivity.this,  FacebookDataProcess.class); 
    a.putExtra(TAG_JSON, json.toString()); 
    startActivity(a); 
    finish(); 
} 





public class SampleDialogListener extends BaseDialogListener { 

    public void onComplete(Bundle values) { 
     final String postId = values.getString("post_id"); 
     if (postId != null) { 
      Log.d("Facebook-Example", "Dialog Success! post_id=" + postId); 
      mAsyncRunner.request(postId, new WallPostRequestListener()); 
     } else { 
      Log.d("Facebook-Example", "No wall post made"); 
      startDataProcess(); 
     } 
    } 

    public void onCancel(){ 
     Log.w("FacebookConnect", "Post to Wall Canceled"); 
     startDataProcess(); 
    } 
} 

public class WallPostRequestListener extends BaseRequestListener { 

    public void onComplete(final String response, final Object state) { 

     Log.d("WallPostRequestListener", "Got response: " + response); 
     String message = "<empty>"; 
     try { 
      JSONObject json = Util.parseJson(response); 
      message = json.getString("message"); 
     } catch (JSONException e) { 
      Log.w("Facebook-Example", "JSON Error in response"); 
     } catch (FacebookError e) { 
      Log.w("Facebook-Example", "Facebook Error: " + e.getMessage()); 
      //Toast.makeText(ctx, "Erro ao postar no Facebook.",  Toast.LENGTH_LONG).show(); 
     } 
     startDataProcess(); 
    } 
} 


public class SampleRequestListener extends BaseRequestListener { 

    public void onComplete(final String response, final Object state) { 
     try { 

      // process the response here: executed in background thread 
      Log.d("SampleRequestListener", "Response: " + response.toString()); 
      json = Util.parseJson(response); 
      Log.e("FacebookConnect", "JSON " + json.toString()); 

      startDataProcess(); 

      // then post the processed result back to the UI thread 
      // if we do not do this, an runtime exception will be generated 
      // e.g. "CalledFromWrongThreadException: Only the original 
      // thread that created a view hierarchy can touch its views." 

     } catch (JSONException e) { 
      Log.w("Facebook-Example", "JSON Error in response"); 
     } catch (FacebookError e) { 
      Log.w("Facebook-Example", "Facebook Error: " + e.getMessage()); 
     } 

    } 
} 


@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    facebook.authorizeCallback(requestCode, resultCode, data); 
    try{ 
     mAsyncRunner = new AsyncFacebookRunner(facebook); 
     mAsyncRunner.request("me", new SampleRequestListener()); 
     /*Bundle params = new Bundle(); 
     params.putString("link", "www.qranio.com"); 
     //params.putString("display", "touch"); 
     facebook.dialog(ctx, "feed", params, new SampleDialogListener());*/ 
     Log.e("FacebookConnect", "Authentication authorizeCallback called"); 
     Log.e("FacebookConnect", "Access Token:  "+facebook.getAccessToken().toString()); 
     //facebook. 
     //if (facebook.isSessionValid()){ 

     //}else{ 
      //Log.e("FacebookConnect", "Invalid facebook session while trying to  fetch user data"); 
     //}*/ 

    }catch(FacebookError fbe){ 
     Log.e("FacebookConnect", "onActivityResult FacebookError " + fbe.toString()); 
    }catch (Exception e){ 
     Log.e("FacebookConnect", "onActivityResult Exception " + e.toString()); 
    } 

} 



} 

[업데이트] 내 AndroidManifest.xml을

<?xml version="1.0" encoding="UTF-8"?> 
<manifest android:versionCode="9" android:versionName="1.1.3" 
package="androidhive.dashboard" xmlns:android="http://schemas.android.com/apk/res/android"> 
<uses-sdk android:minSdkVersion="8"/> 
<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<application android:icon="@drawable/icone" 
    android:label="@string/app_name" android:theme="@android:style/Theme.NoTitleBar.Fullscreen"> 
    <activity android:label="@string/app_name" 
     android:name="com.androidhive.dashboard.SplashScreen" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN"/> 
      <category android:name="android.intent.category.LAUNCHER"/> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.androidhive.dashboard.AndroidDashboardDesignActivity" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/> 
    <activity android:name="com.androidhive.dashboard.LoginActivity" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/> 
    <activity 
     android:name="com.androidhive.dashboard.RegisterActivity" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/> 
    <activity 
     android:name="com.androidhive.dashboard.LoginWithUsernameActivity" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateAlwaysVisible"/> 
    <activity android:name="com.androidhive.dashboard.FacebookConnectActivity" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/> 
    <activity android:name="com.androidhive.dashboard.FacebookDataProcess" 
     android:screenOrientation="portrait" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" android:windowSoftInputMode="stateHidden|adjustResize"/> 
...other activities... 
</application> 
</manifest> 
+0

몇 가지 테스트를 마친 후 사용자가 페이스 북 앱을 설치하면 onActivityResult가 호출된다고 생각하기 시작합니다. 그렇지 않은 경우 facebook.authorize> onComplete 내의 코드가 대신 실행됩니다. 그것은 의미가 있습니까? –

+0

당신의 문제와 관련이 있다면 모르겠지만 매니 페스트는 오류가 적습니다 ... package = "androidhive.dashboard"는 package = "com.androidhive.dashboard"이어야합니다 – guleryuz

+0

oops! 나는 그것을 고치고, 많은 활동들이 androidhive.dashboard.R ...을 가져오고 있음을 알아 차렸다. 고마워! –

답변

0

페이스 북 연결은 SSO 흐름이며,이 완료되면 onActivityResult를 다시 호출된다. 당신이 반면에이

간단한 예를

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

if (requestCode == AppContext.FACEBOOK_SSO_ACTIVITY_CODE) { 

      // Successfully redirected. 
      if (resultCode == Activity.RESULT_OK) { 

        // Check OAuth 2.0/2.10 error code. 
        String error = data.getStringExtra("error"); 
        if (error == null) { 
         error = data.getStringExtra("error_type"); 
        } 
        else {// SSO successful 
         String access_token = data.getStringExtra("access_token"); 
         // from here on, you can do whatever you need 
        } 
     } 
} 

의 응답을 처리해야한다, 나는이 두 옵션 (대체 등의 SSO와의 OAuth)를 구현하는 것이 좋습니다. 여기 은 Facebook SSO와 OAuth 모두에 대한 구현 예입니다. https://github.com/wareninja/generic-oauth2-login-for-android

+0

fb 앱을 설치하지 않고 코드를 시도 했습니까? 그것이 발생하면 내 onActivityResult 코드가 단순히 실행되지 않습니다. –

+0

예, 두 가지 인증을 모두 구현했습니다. 자세한 내용으로 답변을 업데이트하겠습니다. – guleryuz

+0

하지만 Eclipse에서 설치할 때 Play에서 다운로드 할 때 내 앱이 다르게 작동하는 이유를 알아낼 수 없었습니다. 내 선언문? –

관련 문제