2014-02-07 48 views
3

我是facebook开发的新手。我想要loginfacebook,并允许用户允许我的应用发布照片和内容。但是,当用户login成功他显示授权对话框twice.here是我的代码授权对话框登录Facebook时出现两次android

Session.openActiveSession(this, true, new Session.StatusCallback() { 

      // callback when session changes state 
      @Override 
      public void call(Session session, SessionState state, 
        Exception exception) { 

       if (session.isOpened()) { 
        Log.d("", "usman: session is opened"); 
        // make request to the /me API 

        Request.executeMeRequestAsync(session, 
          new Request.GraphUserCallback() { 

           // callback after Graph API response with 
           // user 
           // object 
           @Override 
           public void onCompleted(GraphUser user, 
             Response response) { 
            Log.d("", "onCompleted called"); 
            if (user != null) { 
             // TextView welcome = (TextView) 
             // findViewById(R.id.welcome); 
             Log.d(MyConstants.TAG, 
               "facebook Hello : " 
                 + user.getName() + "!"); 

             publishStory(); 
             //isShared = true; 

            } else { 
             Toast.makeText(
               getApplicationContext(), 
               "Unable to Post,Try Again later", 
               Toast.LENGTH_LONG).show(); 
            } 
           } 
          }); 

       } else { 
        Log.d("", "usman: Session is not open"); 
       } 
      } 
     }); 

private void publishStory() { 
     Log.d("", "usman: in publishStory"); 
     Session session = Session.getActiveSession(); 

     if (session != null) { 

      // Check for publish permissions 
      List<String> permissions = session.getPermissions(); 
      if (!isSubsetOf(PERMISSIONS, permissions)) { 
       pendingPublishReauthorization = true; 
       Session.NewPermissionsRequest newPermissionsRequest = new Session.NewPermissionsRequest(
         this, PERMISSIONS); 
       session.requestNewPublishPermissions(newPermissionsRequest); 
       return; 
      } 

      FileInputStream fis = null; 
      try { 
       fis = new FileInputStream(fileImage); 
      } catch (FileNotFoundException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 
      Bitmap bi = BitmapFactory.decodeStream(fis); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      bi.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
      byte[] data = baos.toByteArray(); 

      Bundle postParams = new Bundle(); 

      postParams.putString("name", "London For Less Postcard"); 
      postParams.putString("caption", 
        "Build great social apps and get more installs."); 
      postParams 
        .putString(
          "description", 
          "The Facebook SDK for Android makes it easier and faster to develop Facebook integrated Android apps."); 

      postParams.putByteArray("picture", data); 

      Request.Callback callback = new Request.Callback() { 
       public void onCompleted(Response response) { 
        JSONObject graphResponse = response.getGraphObject() 
          .getInnerJSONObject(); 
        String postId = null; 
        try { 
         postId = graphResponse.getString("id"); 
        } catch (JSONException e) { 
         Log.i("FB", "JSON error " + e.getMessage()); 
        } 
        FacebookRequestError error = response.getError(); 
        if (error != null) { 
         Toast.makeText(
           SendPostCardActivity.this 
             .getApplicationContext(), 
           error.getErrorMessage(), Toast.LENGTH_SHORT) 
           .show(); 
         Log.d("", "usman: Error"); 
        } else { 
         Toast.makeText(
           SendPostCardActivity.this 
             .getApplicationContext(), 
           "Posted on facebook wall successfully", 
           Toast.LENGTH_LONG).show(); 
         Log.d("", "usman: Finish"); 
         finish(); 
        } 
       } 
      }; 

      Request request = new Request(session, "me/photos", postParams, 
        HttpMethod.POST, callback); 

      RequestAsyncTask task = new RequestAsyncTask(request); 
      task.execute(); 
     } 

    } 
+0

从您的代码,这似乎是预期的结果。首先调用openActiveSession,它将显示auth对话框。然后,获得初始权限后,您调用publishStory,它将请求新的发布权限,并且它将再次显示auth对话框。 –

回答

0

我解决了它这样的:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    callbackManager.onActivityResult(requestCode, resultCode, data); 
    if (AccessToken.getCurrentAccessToken() != null){ 
     if (!AccessToken.getCurrentAccessToken().getPermissions().contains("publish_actions")){ 
      LoginManager.getInstance().logInWithPublishPermissions(MainActivity.this, Arrays.asList("publish_actions")); 
     } 
    } 
} 
+0

但它第一次会显示两个登录权限,一个具有普通权限,另一个具有发布权限 – Hanuman

1

对我来说也是Facebook登录对话框中显示两次,当我点击“登录“Facebook按钮。

我刚刚更改了Facebook的默认按钮,并使用了正常按钮,并带有Facebook按钮背景,现在登录页面只显示一次。

Facebook默认按钮显示正常和发布权限的登录页面。我不知道细节,但这对我有用。