2015-07-21 38 views
3

我是新来的android和我正在建立一个需要登录的应用程序。到目前为止,谷歌+和基本的电子邮件登录已经奏效,但我在登录Facebook时遇到了麻烦。我使用的大部分代码都来自Facebook开发者文档,我试图以不同的方式使用地址解决问题,但没有取得任何成功。Android LoginActivity,与图形API的Facebook CallbackManager请求:executeAndWait()方法不起作用

这是我设置callbackManager和loginButton的onCreate方法。 loginButton注册回调。如果成功,它会启动一个图形请求。但是,executeAndWait()方法从不起作用。

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    FacebookSdk.sdkInitialize(getApplicationContext()); 
    setContentView(R.layout.activity_login); 

    mFacebookCallbackManager = CallbackManager.Factory.create(); 

    // Set up facebook login button 
    LoginButton facebookLoginButton = (LoginButton) findViewById(R.id.facebook_sign_in_button); 
    facebookLoginButton.setReadPermissions("public_profile", "email"); 

    facebookLoginButton.registerCallback(mFacebookCallbackManager, new FacebookCallback<LoginResult>() { 
     @Override 
     public void onSuccess(LoginResult loginResult) { 
      Log.e("callback", "success"); 
      new GraphRequest(AccessToken.getCurrentAccessToken(), "/me", null, HttpMethod.GET, new GraphRequest.Callback() { 
       public void onCompleted(GraphResponse response) { 
        /* handle the result */ 
        try { 
         getFacebookUserData(response.getJSONObject()); 
        } catch (JSONException e) { 
         Log.e("graph request", "json exception"); 
         e.printStackTrace(); 
        } 
       } 
      } 
      ).executeAndWait(); //<<<<----- problem is here!!! :(
      Log.e("graph request", "executed"); 
      uploadUserToServer(); 
      startLaunchActivity(); 
     } 

     @Override 
     public void onCancel() { } 

     @Override 
     public void onError(FacebookException exception) { 
      Log.e("callback", "error"); 
      exception.printStackTrace();} 

    }); 

} 

这是我为回调管理器的onActivityResult()方法。

@Override 
protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Log.d(TAG, "onActivityResult:" + requestCode + ":" + resultCode + ":" + data); 
    mFacebookCallbackManager.onActivityResult(requestCode, resultCode, data); 

} 

有在我的代码的其他方法,我还没有显示,但他们做其他的事情,是不相关的。此代码也不包括其中的onConnectedMethod()增加了一层难度的google +登录。我只想要执行GraphRequest!

这里是日志

07-22 11:01:54.784 14078-14078/com.deepomatic.dream E/callback﹕ success 
07-22 11:01:54.847 14078-14078/com.deepomatic.dream D/dalvikvm﹕ GC_FOR_ALLOC freed 378K, 4% free 9993K/10408K, paused 46ms, total 48ms 
07-22 11:01:54.870 14078-14078/com.deepomatic.dream D/AndroidRuntime﹕ Shutting down VM 
07-22 11:01:54.870 14078-14078/com.deepomatic.dream W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x416b7700) 
07-22 11:01:54.901 14078-14078/com.deepomatic.dream E/AndroidRuntime﹕ FATAL EXCEPTION: main 
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=64206, result=-1, data=Intent { (has extras) }} to activity {com.deepomatic.dream/com.deepomatic.dream.LoginActivity2}: android.os.NetworkOnMainThreadException 
     at android.app.ActivityThread.deliverResults(ActivityThread.java:3367) 
     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3410) 
     at android.app.ActivityThread.access$1100(ActivityThread.java:141) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1304) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.app.ActivityThread.main(ActivityThread.java:5103) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:525) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
     at dalvik.system.NativeStart.main(Native Method) 
Caused by: android.os.NetworkOnMainThreadException 
     at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 
     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:708) 
     at java.io.OutputStream.write(OutputStream.java:82) 
     at libcore.net.http.HttpEngine.writeRequestHeaders(HttpEngine.java:665) 
     at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:814) 
     at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:283) 
     at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497) 
     at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134) 
     at com.facebook.GraphResponse.fromHttpConnection(GraphResponse.java:253) 
     at com.facebook.GraphRequest.executeConnectionAndWait(GraphRequest.java:1130) 
     at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:1032) 
     at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:999) 
     at com.facebook.GraphRequest.executeBatchAndWait(GraphRequest.java:983) 
     at com.facebook.GraphRequest.executeAndWait(GraphRequest.java:958) 
     at com.facebook.GraphRequest.executeAndWait(GraphRequest.java:854) 
     at com.deepomatic.dream.LoginActivity2$1.onSuccess(LoginActivity2.java:91) 
     at com.deepomatic.dream.LoginActivity2$1.onSuccess(LoginActivity2.java:76) 
     at com.facebook.login.LoginManager.finishLogin(LoginManager.java:508) 
     at com.facebook.login.LoginManager.onActivityResult(LoginManager.java:192) 
     at com.facebook.login.LoginManager$1.onActivityResult(LoginManager.java:140) 
     at com.facebook.internal.CallbackManagerImpl.onActivityResult(CallbackManagerImpl.java:82) 
     at com.deepomatic.dream.LoginActivity2.onActivityResult(LoginActivity2.java:114) 
     at android.app.Activity.dispatchActivityResult(Activity.java:5322) 
     at android.app.ActivityThread.deliverResults(ActivityThread.java:3363) 
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3410) 
at android.app.ActivityThread.access$1100(ActivityThread.java:141) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1304) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:5103) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
at dalvik.system.NativeStart.main(Native Method)    
+0

我有同样的问题,下面的答案为我工作,但现在我有一个问题,即任务完成时,我应该知道和应该得到的价值,请帮助我 – neena

回答

0

使用此代码的Facebook登录。这对我很有用。

callbackManager = CallbackManager.Factory.create(); 
 

 
loginButton = (LoginButton) findViewById(R.id.login_button); 
 

 
List <String> permissionNeeds = Arrays.asList("user_photos", "email", 
 
\t "user_birthday", "public_profile", "AccessToken"); 
 
loginButton.registerCallback(callbackManager, 
 
new FacebookCallback <LoginResult>() {@Override 
 
\t public void onSuccess(LoginResult loginResult) { 
 

 
\t \t System.out.println("onSuccess"); 
 

 
\t \t String accessToken = loginResult.getAccessToken() 
 
\t \t \t .getToken(); 
 
\t \t Log.i("accessToken", accessToken); 
 

 
\t \t GraphRequest request = GraphRequest.newMeRequest(
 
\t \t loginResult.getAccessToken(), 
 
\t \t new GraphRequest.GraphJSONObjectCallback() {@Override 
 
\t \t \t public void onCompleted(JSONObject object, 
 
\t \t \t GraphResponse response) { 
 

 
\t \t \t \t Log.i("LoginActivity", 
 
\t \t \t \t response.toString()); 
 
\t \t \t \t try { 
 
\t \t \t \t \t String id = object.getString("id"); 
 
\t \t \t \t \t try { 
 
\t \t \t \t \t \t URL profile_pic = new URL(
 
\t \t \t \t \t \t \t "http://graph.facebook.com/" + id + "/picture?type=large"); 
 
\t \t \t \t \t \t Log.i("profile_pic", 
 
\t \t \t \t \t \t profile_pic + ""); 
 

 
\t \t \t \t \t } catch (MalformedURLException e) { 
 
\t \t \t \t \t \t e.printStackTrace(); 
 
\t \t \t \t \t } 
 
\t \t \t \t \t String name = object.getString("name"); 
 
\t \t \t \t \t String email = object.getString("email"); 
 
\t \t \t \t \t String gender = object.getString("gender"); 
 
\t \t \t \t \t String birthday = object.getString("birthday"); 
 
\t \t \t \t } catch (JSONException e) { 
 
\t \t \t \t \t e.printStackTrace(); 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t }); 
 
\t \t Bundle parameters = new Bundle(); 
 
\t \t parameters.putString("fields", 
 
\t \t \t "id,name,email,gender, birthday"); 
 
\t \t request.setParameters(parameters); 
 
\t \t request.executeAsync(); 
 
\t } 
 

 
\t @Override 
 
\t public void onCancel() { 
 
\t \t System.out.println("onCancel"); 
 
\t } 
 

 
\t @Override 
 
\t public void onError(FacebookException exception) { 
 
\t \t System.out.println("onError"); 
 
\t \t Log.v("LoginActivity", exception.getCause().toString()); 
 
\t } 
 
});

@Override 
 
protected void onActivityResult(int requestCode, int responseCode, 
 
Intent data) { 
 
\t super.onActivityResult(requestCode, responseCode, data); 
 
\t callbackManager.onActivityResult(requestCode, responseCode, data); 
 
}

+1

这就像一个Asynctask任务,这意味着它需要时间,我需要知道这是完成,应该得到的价值,我将如何做到这一点? – neena