1

アプリで奇妙な Facebook 接続動作が発生しています。エミュレーターで使用する場合、facebook.request (ユーザー データを取得するため) と facebook.dialog (ウォールに投稿するため) の呼び出しは、facebook.authorize > onComplete で行われます。しかし、デバイスをデバッグに使用する場合、これらの呼び出しは onActivityResult() で機能する必要があります。

デバイステスト済みの apk を Google Play にアップロードしましたが、機能しません。同じコードは、Eclipse からインストールした場合は機能しますが、Play からダウンロードした場合は機能しません!

「機能しない」とは、ユーザーが承認された後に facebook.request と facebook.dialog が呼び出されず、アプリが空白の画面で動かなくなることを意味します。

私の Facebook 接続アクティビティ:

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>
4

1 に答える 1

0

Facebook Connect は 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
                     }
      }
}

一方、両方のオプションを実装する 2 つのオプション (フォールバックとして sso と oauth) をお勧めします。Facebook SSO と OAuth の両方の実装例を次に示します。 https://github.com/wareninja/generic-oauth2-login-for-android

于 2012-07-27T14:30:25.770 に答える