Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中,如何在Receiver(SDK 3.0)中处理facebook会话过期_Android_Facebook Android Sdk - Fatal编程技术网

在Android中,如何在Receiver(SDK 3.0)中处理facebook会话过期

在Android中,如何在Receiver(SDK 3.0)中处理facebook会话过期,android,facebook-android-sdk,Android,Facebook Android Sdk,我正在使用facebook sdk 3.0 我想在接收器中使用Facebook会话。 但是,如果会话已过期,我该怎么办?您是否在上尝试过该代码 这将验证会话是否处于活动状态,如果未处于活动状态,则创建一个新会话。我发现facebook开发者网站说: 可以为Facebook应用生成应用访问令牌。生成具有不同于其他令牌的登录流的应用程序访问令牌;这可以在代码中完成 此类令牌可用于修改应用程序设置、创建和管理测试用户或读取应用程序洞察数据。您可以使用应用令牌代表授予您应用权限的用户发布或删除内容。例如

我正在使用facebook sdk 3.0

我想在接收器中使用Facebook会话。
但是,如果会话已过期,我该怎么办?

您是否在上尝试过该代码


这将验证会话是否处于活动状态,如果未处于活动状态,则创建一个新会话。

我发现facebook开发者网站说:

可以为Facebook应用生成应用访问令牌。生成具有不同于其他令牌的登录流的应用程序访问令牌;这可以在代码中完成

此类令牌可用于修改应用程序设置、创建和管理测试用户或读取应用程序洞察数据。您可以使用应用令牌代表授予您应用权限的用户发布或删除内容。例如,如果用户授予你的应用程序发布流权限,你的应用程序可以使用应用程序访问令牌代表他们发布状态更新

除非重置应用程序密钥,否则应用程序令牌不会过期。应用程序访问令牌对于每个应用程序都是唯一的

所以,看来我们不必处理这个问题。
如果您愿意,当令牌由于某些问题而过期时,您可以在通知栏上显示消息。

在facebook android sdk 3.0中,如果会话过期,则需要使用现有令牌重新打开会话。您也可以从其他活动(ui线程上下文)执行此操作

用于重新打开过期的会话

public void openSession(Context context)
{
    Looper.prepare()
    Session session = new Session(context, APP_ID, null, true);
    session.openWithImportedAccessToken(accessToken, new Date(tokenExpiryTime), new Date(tokenExpiryTime), AccessTokenSource.FACEBOOK_APPLICATION, Arrays.asList(APP_PERMISSIONS), null);
    Looper.loop()
}

在实现此功能之前,请阅读looper.prepare&loop机制。

SDK的设计用途与您在这里尝试的有所不同。您根本不需要自己处理
会话
对象状态。看一看这张照片

在它的身份验证部分,它清楚地展示了如何处理会话状态更改

基本上,facebook为您提供了一系列UI lifecycle helper类,您需要将这些类包含在应用程序中任何需要facebook功能的地方。这些帮助程序将确定会话是否处于活动状态、是否已过期等,并在会话状态发生更改时调用方法
onSessionStateChanged()

您只需在此方法中执行简单的检查,并适当地重定向用户。例如,如果会话已过期,您可以将用户重定向到一个登录页面,其中将显示一个facebook登录按钮(此按钮由facebook在SDK中提供,它为您处理身份验证流。它将向用户请求权限、验证会话等,而无需您执行任何操作)


完成一次教程,我相信你会有更好的理解。希望这能有所帮助。

来扩展这个问题:当我们使用
会话时会发生什么情况,但它会过期?API文档说Android SDK将自动更新会话,但是,如果用户更改密码或撤销应用程序,会话将过期。如何将过期时间返回给开发人员?如果它在一个
接收器中,那么就没有用户界面-我们如何生成登录?另外,为了清楚起见,我正在寻找一个用户登录,而不是一个应用程序登录。(我之前不知道有应用程序登录。)谢谢。我将在我的开发机器上验证这一点。仔细想想,接收器可能会工作,因为它是在UI线程上运行的。在原始线程或异步任务上运行可能会有问题?不。我不认为在非UI线程中运行会有问题。如果从任何后台线程运行,肯定会有问题。嗯。。。注意到Session.Builder(this):(在本例中,此
的意思是传递
活动
。在接收器中,
BroadcastReceiver.onReceive()
将在可能使用的上下文中传递。让我看看我是否理解正确:我可以使用您在此声明的
openWithImportedAccessToken
使用现有令牌重新打开会话。由于此示例不是UI线程上下文,因此我需要
Looper.prepare()
Looper.loop()
。(与UI线程中的线程相比,不需要这些线程。)这是否正确?是的,openWithImportedAccessToken应该从ui线程调用,因为它在内部使用异步任务。如果您从ui线程或活动调用它,则肯定不需要使用looper,否则必须使用。抱歉,不,我不找应用程序登录。广播接收器没有ui lifecycle helper类(由原海报分享)-这是否意味着不应该在这里进行检查?您可以检查。但身份验证流不是设计为在接收器内完成的。开发人员在接收器中处理身份验证的用例非常低。我相信您可以浏览SDK,找到lifecycle helpers使用的方法,并使用这些方法在重新设计中自己处理所有事情ceiver。但这将是一个巨大的黑客攻击,而且会非常不稳定。你最好按照预期使用它,因为facebook已经对其进行了预期用途的测试。一个想法是检查会话是否已过期,然后再次启动登录活动,让facebook登录按钮处理身份验证流。谢谢。所以这是正确的做法(即使它没有回答上述问题。)
public void openSession(Context context)
{
    Looper.prepare()
    Session session = new Session(context, APP_ID, null, true);
    session.openWithImportedAccessToken(accessToken, new Date(tokenExpiryTime), new Date(tokenExpiryTime), AccessTokenSource.FACEBOOK_APPLICATION, Arrays.asList(APP_PERMISSIONS), null);
    Looper.loop()
}