Android com.facebook.facebook异常:试图使用未打开的会话
我集成了facebook共享,从过去几天开始,它工作得很好,但今天,在提出这个问题的前两个小时,我面临着这个问题 我正在使用此代码登录:Android com.facebook.facebook异常:试图使用未打开的会话,android,facebook,Android,Facebook,我集成了facebook共享,从过去几天开始,它工作得很好,但今天,在提出这个问题的前两个小时,我面临着这个问题 我正在使用此代码登录: Session.openActiveSession(this, true, new Session.StatusCallback() { // callback when session changes state @Override public void call(Session session, SessionState state, Except
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()条件下,它总是false,而且我使用了session.isOpened()
,它也返回false,我不明白为什么会发生这种情况
我已经在清单中声明了INTERNET、ACCESSNETWORKSTATE和权限
<application>
..........
..........
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
</application>
处理这个问题可能有很多原因。您应该检查以下内容: 我使用以下代码通过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文件中的元数据标记,是否有正确的应用程序id
这种错误经常发生在facebook应用程序设置中,而不是android应用程序中。在facebook应用程序的设置页面中,应该有正确的包名,并且应该为应用程序添加密钥哈希(每个版本类型都不同,在大多数情况下是debug和release) 要获取哈希键,可以运行脚本
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应用程序的用户添加角色(在“角色”选项卡内)
此外,如果没有帮助,请尝试调试方法
公共无效调用(会话、会话状态、异常)
授权失败的原因通常是正常的消息
**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" />
您在哪一行得到错误?你试过从缓存中打开会话吗?@Pr38y不,我不知道,顺便说一下,我使用了
openActiveSession
,正如你在代码中看到的,请在创建会话的地方发布代码。我编辑了我的问题,您可以查看我的代码。您是否已将共享指定为facebook开发仪表板中的权限之一?我将通过您的两种不同方法获得两个不同的密钥哈希,请告诉我“您希望facebook启动的主要活动”中应该写些什么?我在每个片段中都添加了fb共享按钮。我将该字段留空,只写了包名。关于散列,每种发布类型的散列都是不同的。这意味着每一个新的签名都是不同的。IDE使用调试密钥对apk进行签名。但是,如果你有用于签署apk的发布密钥库,你可以提前添加哈希。我不想获取个人资料信息,我想在facebook上发布图片/文本
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/app_id" />
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) {
}
});
}