2012-06-26 40 views
2

這是我在我的Android應用程序中想要的。如果未安裝應用程序,從webview調用facebook sdk不起作用?

我想要一個按鈕在webview中調用我的java方法。此方法應調用Facebook sdk的authorize()函數並執行SSO/Dialog身份驗證方式。當我在webview中調用JavaScript方法時,訪問令牌和過期令牌將返回到webview。

這是我已經創建的。

在我的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> 

的JS和Java之間的接口工作正常。我確信。我JSInterface是 -

public class JSInterface { 
    public Context mContext; 

    JSInterface(Context c) { 
     mContext = c; 
    } 

    public void authorizeFacebook() { 
     Log.e("FB", "authorizeFacebook() interface called"); 
     authorizeFacebookSSO(); 
    } 
} 

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的對話框。但它失敗並停在 - 「加載...」屏幕。

enter image description here

它就停在那兒,不會甚至崩潰。沒有日誌。過了一段時間,我強迫關閉它或等待它。有沒有人遇到過這個問題?

UPDATE

我onActivityResultCode() -

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     mFB.authorizeCallback(requestCode, resultCode, data); 
    } 
+0

您是否在您的活動中實施了'onActivityResult'方法?你能發佈活動代碼嗎? –

+0

我已經添加了onActivityResultCode()。但是我的SSO工作正常。該對話框不是。那麼onActivityResultCode()很重要嗎? – Enigma

+0

您是否使用過網絡嗅探器來查看發送的請求以及來自Facebook的響應? –

回答

2

好吧,我想通了這一點自己。

當我從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(); 
        } 
       } 
      });   
    } 
} 
相關問題