Facebook的连接工程模拟器/设备上的不同,而不是在谷歌播放 [英] Facebook Connect works different on emulator/device, but not on Google Play

查看:383
本文介绍了Facebook的连接工程模拟器/设备上的不同,而不是在谷歌播放的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到一个奇怪的Facebook Connect在我的应用程序的行为。如果我在模拟器使用,用于facebook.request调用(检索用户数据)和facebook.dialog(张贴在墙上)的facebook.authorize>的onComplete制成。但是,如果我使用的设备进行调试,这些调用必须在onActivityResult()的工作。

和我已上载设备测试的apk到谷歌的发挥,但它不工作!同样的code,如果从安装Eclipse,它的工作原理......如果从游戏下载,不!

由不工作,我的意思是facebook.request和facebook.dialog不叫用户被授权后,和应用程序获得stucked在空白屏幕。

我的Facebook Connect活动:

 公共类FacebookConnectActivity延伸活动{
私有静态最后弦乐TAG_JSON =JSON;
静态商标=新的Facebook(111111111111111);
AsyncFacebookRunner mAsyncRunner;
私人共享preferences米preFS;
的JSONObject JSON;
上下文CTX =这一点;

@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    的setContentView(R.layout.resgatar_produto_layout);
    Log.w(FacebookConnect,活动已启动);

    米preFS = GET preferences(MODE_PRIVATE);
    字符串access_token = M prefs.getString(access_token,NULL);
    长过期= M prefs.getLong(access_expires,0);
    若(access_token!= NULL){
        facebook.setAccessToken(access_token);

    }
    如果(到期!= 0){
        facebook.setAccessExpires(到期);
    }

    如果(!facebook.isSessionValid()){

    facebook.authorize(这一点,新的String [] {电子邮件,user_photos,user_birthday,user_hometown,user_relationships,user_location,user_work_history,publish_actions},新DialogListener(){
        @覆盖
        公共无效的onComplete(束值){
            Log.w(FacebookConnect,用户授权);
            / * mAsyncRunner =新AsyncFacebookRunner(脸谱);
            mAsyncRunner.request(我,新SampleRequestListener());
            捆绑PARAMS =新包();
            params.putString(链接,www.qranio.com);
            facebook.dialog(CTX,饲料,PARAMS,新SampleDialogListener()); * /
        }

        @覆盖
        公共无效onFacebookError(FacebookError错误){
            Log.w(FacebookConnect,错误授权:+ error.toString());
        }

        @覆盖
        公共无效onerror的(DialogError E){}

        @覆盖
        公共无效OnCancel的(){}
    });

    }

}

公共静态无效logoutFB(){
    如果(facebook.isSessionValid()){
        facebook.setAccessToken(空);
    }
}

公共无效startDataProcess(){
    而(JSON == NULL){

    }
    意图=新的意图(FacebookConnectActivity.this,FacebookDataProcess.class);
    a.putExtra(TAG_JSON,json.toString());
    startActivity(一);
    完();
}





公共类SampleDialogListener扩展BaseDialogListener {

    公共无效的onComplete(束值){
        最终的字符串postid = values​​.getString(的post_id);
        如果(postId!= NULL){
            Log.d(脸谱 - 示例,对话成功的post_id =!+ postId);
            mAsyncRunner.request(postId,新WallPostRequestListener());
        } 其他 {
            Log.d(脸谱 - 示例,无墙后发);
            startDataProcess();
        }
    }

    公共无效OnCancel的(){
        Log.w(FacebookConnect,张贴到墙上取消);
        startDataProcess();
    }
}

公共类WallPostRequestListener扩展BaseRequestListener {

    公共无效的onComplete(最后弦乐的反应,最终目标状态){

        Log.d(WallPostRequestListener,得到了回应:+响应);
        字符串消息=<空>中;
        尝试 {
            JSONObject的JSON = Util.parseJson(响应);
            消息= json.getString(信息);
        }赶上(JSONException E){
            Log.w(脸谱 - 示例,在JSON的错误反应);
        }赶上(FacebookError E){
            Log.w(脸谱 - 示例,Facebook的错误:+ e.getMessage());
            //Toast.makeText(ctx,埃罗鳌postar没有Facebook的,Toast.LENGTH_LONG).show();
        }
        startDataProcess();
    }
}


公共类SampleRequestListener扩展BaseRequestListener {

    公共无效的onComplete(最后弦乐的反应,最终目标状态){
        尝试 {

            //过程中,这里的响应:在后台线程中执行
            Log.d(SampleRequestListener,回应:+ response.toString());
            JSON = Util.parseJson(响应);
            Log.e(FacebookConnect,JSON+ json.toString());

            startDataProcess();

            //然后发布处理结果回UI线程
            //如果我们不这样做,一个运行时异常将会产生
            // 例如。 CalledFromWrongThreadException:只有原始
            创建一个视图层次可以触摸自己的看法//线程。

        }赶上(JSONException E){
            Log.w(脸谱 - 示例,在JSON的错误反应);
        }赶上(FacebookError E){
            Log.w(脸谱 - 示例,Facebook的错误:+ e.getMessage());
        }

    }
}


@覆盖
公共无效onActivityResult(INT申请code,INT结果code,意图数据){
    super.onActivityResult(要求code,因此code,数据);
    facebook.authorizeCallback(要求code,因此code,数据);
    尝试{
        mAsyncRunner =新AsyncFacebookRunner(脸谱);
        mAsyncRunner.request(我,新SampleRequestListener());
        / *捆绑PARAMS =新包();
        params.putString(链接,www.qranio.com);
        //params.putString("display,触摸);
        facebook.dialog(CTX,饲料,PARAMS,新SampleDialogListener()); * /
        Log.e(FacebookConnect,认证authorizeCallback称为);
        Log.e(FacebookConnect,访问令牌。+ facebook.getAccessToken()的toString());
        // Facebook上。
        //如果(facebook.isSessionValid()){

        //}其他{
            //Log.e("FacebookConnect,试图获取用户数据)无效Facebook的会议;
        //} * /

    }赶上(FacebookError FBE){
        Log.e(FacebookConnect,onActivityResult FacebookError+ fbe.toString());
    }赶上(例外五){
        Log.e(FacebookConnect,onActivityResult异常+ e.toString());
    }

}



}
 

[更新] 我的Andr​​oidManifest.xml

 < XML版本=1.0编码=UTF-8&GT?;
<舱单安卓版code =9的Andr​​oid版本:VERSIONNAME =1.1.3
包=androidhive.dashboard的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android>
<使用-SDK安卓的minSdkVersion =8/>
<使用-权限的Andr​​oid:名称=android.permission.INTERNET对/>
<使用-权限的Andr​​oid:名称=android.permission.ACCESS_NETWORK_STATE/>
<使用-权限的Andr​​oid:名称=android.permission.WRITE_EXTERNAL_STORAG​​E/>
<应用机器人:图标=@可绘制/ ICONE
    机器人:标签=@字符串/ APP_NAME安卓主题=@安卓风格/ Theme.NoTitleBar.Fullscreen>
    <活动机器人:标签=@字符串/ APP_NAME
        机器人:名称=com.androidhive.dashboard.SplashScreen
        机器人:screenOrientation =画像
        机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize>
        <意向滤光器>
            <作用机器人:名称=android.intent.action.MAIN/>
            <类机器人:名称=android.intent.category.LAUNCHER/>
        &所述; /意图滤光器>
    < /活性GT;
    <活动
        机器人:名称=com.androidhive.dashboard.AndroidDashboardDesignActivity
        机器人:screenOrientation =画像
        机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize/>
    <活动机器人:名称=com.androidhive.dashboard.LoginActivity
        机器人:screenOrientation =画像
        机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize/>
    <活动
        机器人:名称=com.androidhive.dashboard.RegisterActivity
        机器人:screenOrientation =画像
        机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize/>
    <活动
        机器人:名称=com.androidhive.dashboard.LoginWithUsernameActivity
        机器人:screenOrientation =画像
        机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateAlwaysVisible/>
    <活动机器人:名称=com.androidhive.dashboard.FacebookConnectActivity
        机器人:screenOrientation =画像
        机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize/>
    <活动机器人:名称=com.androidhive.dashboard.FacebookDataProcess
        机器人:screenOrientation =画像
        机器人:主题=@安卓风格/ Theme.NoTitleBar.Fullscreen机器人:windowSoftInputMode =stateHidden | adjustResize/>
...其他活动...
< /用途>
< /舱单>
 

解决方案

Facebook连接是SSO流动,而当它完成onActivityResult叫回来。 你应该处理在那里的响应

简单的例子

  @覆盖
    保护无效onActivityResult(INT申请code,INT结果code,意图数据){
        super.onActivityResult(要求code,因此code,数据);

如果(要求code == AppContext.FACEBOOK_SSO_ACTIVITY_ code){

            //成功重定向。
            如果(结果code == Activity.RESULT_OK){

                    //检查的OAuth 2.0 / 2.10错误code。
                    字符串错误= data.getStringExtra(错误);
                    如果(错误== NULL){
                        错误= data.getStringExtra(ERROR_TYPE);
                    }
                    其他{// SSO成功
                        串access_token = data.getStringExtra(access_token);
                        //从这里开始,你可以做任何你需要
                     }
      }
}
 

在另一方面,我提出两种实现两个选项(SSO和OAuth的为备用)。 这里是一个示例实现为Facebook的SSO和OAuth的; https://github.com/wareninja/generic-oauth2-login-for-android

I'm getting a weird facebook connect behavior in my app. If I use it in emulator, the calls for facebook.request (to retrieve user data) and facebook.dialog (to post on wall) are made at facebook.authorize > onComplete. But if I use a device for debugging, these calls need to be at onActivityResult() to work.

And I've uploaded the device-tested apk into google play, but it doesn't works! The SAME code, if installed from eclipse, it works... if downloaded from Play, doesn't!

by "doesn't works", I mean that facebook.request and facebook.dialog aren't called after user is authorized, and the app get stucked in a blank screen.

my facebook connect activity:

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

}



}

[UPDATE] My 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>

解决方案

Facebook Connect is SSO flow, and when it is done onActivityResult is called back. you should handle the response in there

simple example

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

on the other hand, I suggest two implement both options (sso and oauth as fallback). here is an example implementation for both Facebook SSO and OAuth; https://github.com/wareninja/generic-oauth2-login-for-android

这篇关于Facebook的连接工程模拟器/设备上的不同,而不是在谷歌播放的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆