Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如果未安装应用程序,则从webview调用facebook sdk不起作用?_Android_Facebook_Facebook Android Sdk - Fatal编程技术网

Android 如果未安装应用程序,则从webview调用facebook sdk不起作用?

Android 如果未安装应用程序,则从webview调用facebook sdk不起作用?,android,facebook,facebook-android-sdk,Android,Facebook,Facebook Android Sdk,以下是我想要的安卓应用程序 我希望webview中的按钮在java中调用方法。此方法应调用facebook sdk的authorize()函数,并以SSO/Dialog方式进行身份验证。当我在webview中调用javascript方法时,访问令牌和过期令牌返回webview mFB = new Facebook(APP_ID); wv = (WebView) findViewById(R.id.web_view); wv.getSettings().setJavaScriptEnabled(t

以下是我想要的安卓应用程序

我希望webview中的按钮在java中调用方法。此方法应调用facebook sdk的authorize()函数,并以SSO/Dialog方式进行身份验证。当我在webview中调用javascript方法时,访问令牌和过期令牌返回webview

mFB = new Facebook(APP_ID);
wv = (WebView) findViewById(R.id.web_view);
wv.getSettings().setJavaScriptEnabled(true);
wv.addJavascriptInterface(new JSInterface(this), "JAVA");
wv.loadUrl("file:///android_asset/test.html");
这是我已经创造的

在我的onCreate()活动中,我正在初始化webview

mFB = new Facebook(APP_ID);
wv = (WebView) findViewById(R.id.web_view);
wv.getSettings().setJavaScriptEnabled(true);
wv.addJavascriptInterface(new JSInterface(this), "JAVA");
wv.loadUrl("file:///android_asset/test.html");
“我的资产”文件夹中的test.html如下所示-

<script type="text/javascript">
        function authorizeFacebook() {
           JAVA.authorizeFacebook();    
        }

        function showData(token, expire) {
            document.getElementById('result').innerHTML = token + " >>>> " + expire;
        }
</script>

public void authorizeFacebookSSO() {
    mFB.authorize(FBCMTestActivity.this, new DialogListener() {

    @Override
    public void onFacebookError(FacebookError e) {
        Log.e("FBAUTH", "FB failed + " + e.getErrorCode());
        Toast.makeText(getApplicationContext(), "FBFAIL:" + e.getMessage(), Toast.LENGTH_LONG).show();
    }

    @Override
    public void onError(DialogError e) {
        Log.e("FBAUTH", "FB failed + " + e.getMessage());
        Toast.makeText(getApplicationContext(), "FBFAIL:" + e.getMessage(), Toast.LENGTH_LONG).show();
    }

    @Override
    public void onComplete(Bundle values) {
        Log.e("FBAUTH", "SUCCESS");
        Log.e("FBAUTH:", mFB.getAccessToken() + " " + mFB.getAccessExpires());
        wv.loadUrl("javascript:showData( '" + mFB.getAccessToken() + "' , '" + mFB.getAccessExpires()  + "');");
    }

    @Override
    public void onCancel() {
    }
});
}
当我使用facebook应用程序时,这非常有效

但当没有facebook应用程序时,理想情况下应该显示一个与webview的对话。但它失败并停止在“加载…”屏幕上

它只是停留在那里,甚至没有崩溃。没有日志。过了一会儿,我要么强制关闭它,要么等待它。以前有人遇到过这个问题吗

更新

My onActivityResultCode()-


这是我自己想出来的

当我从WebView的javascript调用Java函数时,该函数在WebView的线程中运行。因此,让它在UI线程上运行为我修复了一切:)

希望这能帮助别人

这是我在上述代码中所做的唯一更改

public class JSInterface {
    public Context mContext;

    JSInterface(Context c) {
        mContext = c;
    }

    public void authorizeFacebook() {   

       runOnUiThread(new Runnable() {

           @Override
           public void run() {
                try {
                        authorizeFacebookSSO();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });           
    }
}

您是否在活动中实现了onActivityResult方法?你能发布活动代码吗?我已经添加了onActivityResultCode()。但我的SSO运行良好。该对话框不可用。onActivityResultCode()是否重要?您是否使用网络嗅探器查看来自facebook的请求和响应?这不是必需的。我想出来了。我已经发布了答案。
public class JSInterface {
    public Context mContext;

    JSInterface(Context c) {
        mContext = c;
    }

    public void authorizeFacebook() {   

       runOnUiThread(new Runnable() {

           @Override
           public void run() {
                try {
                        authorizeFacebookSSO();
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            });           
    }
}