簡體   English   中英

com.facebook.FacebookException:嘗試使用未打開的Session

[英]com.facebook.FacebookException: Attempted to use a Session that was not open

我整合了facebook分享,它在過去幾天工作得很好,但是今天在問這個問題之前的2個小時我正面臨着這個問題。

我正在使用此代碼登錄:

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

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

    // make request to the /me API
    Request.newMeRequest(session, new Request.GraphUserCallback() {

      // callback after Graph API response with user object
      @Override
      public void onCompleted(GraphUser user, Response response) {
        if (user != null) {

          Toast.makeText(ImagePagerActivity.this, user.getName()+" Logged In...", Toast.LENGTH_LONG).show();
        }
      }
    }).executeAsync();
  }
}
});
publishFeedDialog();

問題是if()條件總是假的,我也使用session.isOpened()也返回false,我很困惑為什么會發生這種情況。

我已經在清單中聲明了INTERNET,ACCESSNETWORKSTATE,權限

 <application>
 ..........
 ..........
 <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
 </application>

請幫忙...

編輯

這是我實現的代碼,你可以看到onCreateOptionsMenuonOptionsItemSelectedonActivityResultpublishFeedDialog

@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.action_bar_share_menu, menu);
        MenuItem item = menu.findItem(R.id.menu_item_share1);


        return true;
    }
@Override

public boolean      onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_share1: // facebook item selected
Toast.makeText(this, "Menu Item 1 selected", Toast.LENGTH_SHORT).show();
//start Facebook Login


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

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

    // make request to the /me API
    Request.newMeRequest(session, new Request.GraphUserCallback() {

      // callback after Graph API response with user object
      @Override
      public void onCompleted(GraphUser user, Response response) {
        if (user != null) {

          Toast.makeText(ImagePagerActivity.this, user.getName()+" Logged In...", Toast.LENGTH_LONG).show();
        }
      }
    }).executeAsync();
  }
}
});
publishFeedDialog();

}
return true;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    uiHelper.onActivityResult(requestCode, resultCode, data, new FacebookDialog.Callback() {
        @Override
        public void onError(FacebookDialog.PendingCall pendingCall, Exception error, Bundle data) {
            Log.e("Activity", String.format("Error: %s", error.toString()));
        }

        @Override
        public void onComplete(FacebookDialog.PendingCall pendingCall, Bundle data) {
            Log.i("Activity", "Success!");
        }
    });

}
@Override
protected void onResume() {
    super.onResume();
    uiHelper.onResume();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putInt(STATE_POSITION, pager.getCurrentItem());
    super.onSaveInstanceState(outState);
    uiHelper.onSaveInstanceState(outState);
}

@Override
public void onPause() {
    super.onPause();
    uiHelper.onPause();
}

@Override
public void onDestroy() {
    super.onDestroy();
    uiHelper.onDestroy();
}

private void publishFeedDialog() {

    Log.v("pos",""+pos);
    Bundle params = new Bundle();
    params.putString("name", ItemListApplication.names.get(pos).getItem());
    params.putString("caption", "Irrational beliefs");
    params.putString("description",ItemListApplication.names.get(pos).getDesc() );
    params.putString("link", "https://www.facebook.com/vivek.warde.3?ref=tn_tnmn");

    if(pos==0) params.putString("picture","http://i.imgur.com/lOIUcW2.jpg");
    else params.putString("picture",imageUrls[pos]);
    WebDialog feedDialog = (
        new WebDialog.FeedDialogBuilder(this,
            Session.getActiveSession(),
            params))
        .setOnCompleteListener(new OnCompleteListener() {

            @Override
            public void onComplete(Bundle values,
                FacebookException error) {
                if (error == null) {
                    // When the story is posted, echo the success
                    // and the post Id.
                    final String postId = values.getString("post_id");
                    if (postId != null) {
                        Toast.makeText(ImagePagerActivity.this,
                            "Posted story, id: "+postId,
                            Toast.LENGTH_SHORT).show();
                    } else {
                        // User clicked the Cancel button
                        Toast.makeText(ImagePagerActivity.this, 
                            "Publish cancelled", 
                            Toast.LENGTH_SHORT).show();
                    }
                } else if (error instanceof FacebookOperationCanceledException) {
                    // User clicked the "x" button
                    Toast.makeText(ImagePagerActivity.this, 
                        "Publish cancelled", 
                        Toast.LENGTH_SHORT).show();
                } else {
                    // Generic, ex: network error
                    Toast.makeText(ImagePagerActivity.this, 
                        "Error posting story", 
                        Toast.LENGTH_SHORT).show();
                }
            }

        })
        .build();
    feedDialog.show();
}

處理這個問題可能有很多原因。 你應該檢查一下:

我正在使用此代碼通過Facebook登錄:

class MyFragment extends Fragment {
   //... some code

   SessionStatusCallback statusCallback = new SessionStatusCallback();

   public void login() {
       Session session = Session.getActiveSession();
       if (!session.isOpened() && !session.isClosed()) {
           session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
       } else {
           Session.openActiveSession(getActivity(), this, true, statusCallback);
       }
   }

   private class SessionStatusCallback implements Session.StatusCallback {
       @Override
       public void call(Session session, SessionState state, Exception exception) {
           if (exception != null) {
               handleException(exception);
           }
           if (state.isOpened()) {
               afterLogin();
           } else if (state.isClosed()) {
               afterLogout();
           }
        }
    }

}

如果未打開會話,則應將其打開以供閱讀(或者如果需要,可以發布 )。


檢查AndroidManifest文件中的meta-data標記,是否有正確的應用程序ID?


經常發生錯誤不在Android應用程序內,但在Facebook應用程序設置。 在facebook應用程序的設置頁面中應該是正確的軟件包名稱,您應該為您的應用程序添加密鑰哈希值(每種版本類型都不同,在大多數情況下是調試和發布)。

facebook android設置

要獲取哈希鍵,您可以運行腳本

keytool -exportcert -alias YOUR_ALIAS -keystore PATH_TO_KEYSTORE_FILE | openssl sha1 -binary | openssl base64

或者你可以在代碼中獲取它:

PackageInfo info;
try {
    info = getPackageManager().getPackageInfo("YOUR_APP_PACKAGE", PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md;
        md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        String keyhash = new String(Base64.encode(md.digest(), 0));
        //string something is what you should paste as key hash
        Log.e("hash key", keyhash);
    }
} catch (NameNotFoundException e1) {
    Log.e("name not found", e1.toString());
} catch (NoSuchAlgorithmException e) {
    Log.e("no such an algorithm", e.toString());
} catch (Exception e) {
    Log.e("exception", e.toString());
} 

在狀態和評論選項卡中的Facebook應用程序的設置頁面中,您應該公開應用程序。 或者,如果您仍然不想將其公開,則應為可以使用您的Android應用程序的所有用戶添加角色(在“角色”選項卡中)。


此外,如果它沒有幫助,嘗試調試方法
public void call(Session session, SessionState state, Exception exception)
通常有正常的消息,為什么授權不成功

 **generate keyhash from facebook api and then** 

 running this in to commandprompt/ terminal 

 keytool -exportcert -alias YOUR_ALIAS_NAME -keystore PATH_TO_KEYSTORE_FILE | openssl sha1 -binary | openssl base64

在Android.Manifest文件中

<meta-data
        android:name="com.facebook.sdk.ApplicationId"
        android:value="@string/app_id" />

在demofacebookLogin(活動文件)

private Facebook facebook;
private AsyncFacebookRunner mAsyncRunner;


@Override
 protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);

    facebook = new Facebook(APP_ID);

    mAsyncRunner = new AsyncFacebookRunner(facebook);

 }

 public void loginToFacebook() {
    mPrefs = getPreferences(MODE_PRIVATE);
    if (!facebook.isSessionValid()) {
        facebook.authorize(this,
                new String[] { "email", "publish_stream" },
                new DialogListener() {

                    @Override
                    public void onCancel() {
                        // Function to handle cancel event
                    }

                    @Override
                    public void onComplete(Bundle values) {
                        // Function to handle complete event
                        // Edit Preferences and update facebook acess_token
                        SharedPreferences.Editor editor = mPrefs.edit();
                        editor.putString("access_token",
                                facebook.getAccessToken());
                        editor.putLong("access_expires",
                                facebook.getAccessExpires());
                        editor.commit();
                        getProfileInformation();
                    }

                    @Override
                    public void onError(DialogError error) {
                        // Function to handle error

                    }

                    @Override
                    public void onFacebookError(FacebookError fberror) {
                        // Function to handle Facebook errors

                    }

                });
    }
}



    public void getProfileInformation() {
    mAsyncRunner.request("me", new RequestListener() {
        @Override
        public void onComplete(String response, Object state) {
            Log.d("Profile", response);
            String json = response;
            try {
                JSONObject profile = new JSONObject(json);
                // getting name of the user
                facebook_FB_Id = profile.getString("id");
                facebook_username = profile.getString("name");
                // getting email of the user
                facebook_email = profile.getString("email");
                facebook_firstname = profile.getString("first_name");
                facebook_lastname = profile.getString("last_name");
                facebook_FbLink = profile.getString("link");

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {

                        Log.i("", facebook_FB_Id + " == "
                                + facebook_username + " =="
                                + facebook_FbLink);

                        Intent startRegistrationTypeActivity = new Intent(
                                getContext(),
                                RegistrationTypeActivity.class);
                        startRegistrationTypeActivity.putExtra(
                                "facebook_FB_Id", facebook_FB_Id);
                        startRegistrationTypeActivity.putExtra(
                                "facebook_username", facebook_username);
                        startRegistrationTypeActivity.putExtra(
                                "facebook_email", facebook_email);
                        startRegistrationTypeActivity.putExtra(
                                "facebook_firstname", facebook_firstname);
                        startRegistrationTypeActivity.putExtra(
                                "facebook_lastname", facebook_lastname);
                        startRegistrationTypeActivity.putExtra(
                                "facebook_FbLink", facebook_FbLink);
                        startActivity(startRegistrationTypeActivity);

                    }

                });

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onIOException(IOException e, Object state) {
        }

        @Override
        public void onFileNotFoundException(FileNotFoundException e,
                Object state) {
        }

        @Override
        public void onMalformedURLException(MalformedURLException e,
                Object state) {
        }

        @Override
        public void onFacebookError(FacebookError e, Object state) {
        }
    });

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM