根据https://developers.facebook.com/docs/android/getting-started/facebook-sdk-for-android/发布的教程
,我无法在Android应用中打开有效的facebook会话我一直在苦苦挣扎这段时间,现在没有任何运气!如果你们中的一个人能指出我正确的方向,我将很高兴! (我打赌错误是我身边的一些设置,但我无法发现它)
这是我在调用Session.openActiveSession后看到的错误(在我的活动的onCreate中这是真的,新的Session.StatusCallback()(我几乎遵循facevook开发人员教程中给出的步骤)
编辑: 首先记录以下警告消息,然后在随后的屏幕快照中显示错误消息
09-03 19:26:22.726:W / Bundle(17458):关键 com.facebook.platform.protocol.PROTOCOL_VERSION期望String但是 value是一个java.lang.Integer。返回了默认值。 09-03 19:26:22.736:W / Bundle(17458):尝试投射生成的 内部例外:09-03 19:26:22.736:W / Bundle(17458): java.lang.ClassCastException:java.lang.Integer无法强制转换为 java.lang.String 09-03 19:26:22.736:W / Bundle(17458):at android.os.Bundle.getString(Bundle.java:1061)09-03 19:26:22.736: W / Bundle(17458):at android.content.Intent.getStringExtra(Intent.java:4466)09-03 19:26:22.736:W / Bundle(17458):at com.facebook.AuthorizationClient $ KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient.java:821) 09-03 19:26:22.736:W / Bundle(17458):at com.facebook.AuthorizationClient.tryCurrentHandler(AuthorizationClient.java:272)
09-02 22:55:04.110:E / AndroidRuntime(13287):致命异常:主要 09-02 22:55:04.110:E / AndroidRuntime(13287): java.lang.RuntimeException:无法恢复活动 {com.good.amrfbintegration /的 com.facebook.LoginActivity }: java.lang.NullPointerException 09-02 22:55:04.110: E / AndroidRuntime(13287):at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3036) 09-02 22:55:04.110:E / AndroidRuntime(13287):at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3077) 09-02 22:55:04.110:E / AndroidRuntime(13287):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2373)
这是我到目前为止所做的事情
使用以下信息在Facebook上更新了应用程序(我使用了使用我机器的调试密钥库生成的哈希键)
以下是我的清单文件中的相关信息(@ string / app_id是来自facebook开发门户网站的App Id)
我以这种方式向我的项目添加了对Facebook SDK的引用
以下是我在主要活动的OnCreate方法中的代码
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
activity = this;
Session.openActiveSession(this, true, new Session.StatusCallback()
{
@Override
public void call(Session session, SessionState state, Exception exception)
{
if (session.isOpened())
{
Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
}
}});
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
在执行Session.openActiveSession时,logcat会显示我的第一个屏幕截图中显示的错误。
Session.StatusCallback()的调用方法执行一次(会话状态为'opening')但应用程序崩溃了后续时间。这是我在App崩溃之前看到的内容
非常感谢任何帮助!
答案 0 :(得分:7)
由于Facebook SDK的问题,请从此下载并使用Facebook SDK 3.5.2 网址: - https://developers.facebook.com/docs/android/
答案 1 :(得分:3)
是。检查你的代码,
确保你在Manifest.xml上有这些东西
<activity android:name="com.facebook.LoginActivity"/>
<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/app_id"/>
@ string / app_id应包含您从facebook应用配置详细信息中获得的app_id。你也应该把正确的keyhash。
所以确保 -
答案 2 :(得分:2)
今天也发生在我身上。
我的问题是Facebook应用程序处于沙盒模式。所以只有开发人员和测试人员才能使用它。
从应用的Facebook Developer属性页面更改它: https://developers.facebook.com/apps
我的答案也在这里找到: Can not access Facebook session - UnknownError: Invalid application
答案 3 :(得分:0)
// Just write your code in onResume() rather than onCreate().
@Override
public void onResume() {
super.onResume();
if(Session.getActiveSession()==null){
session = new Session(this);
Session.setActiveSession(session);
}
if (Session.getActiveSession().isOpened())
{
Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
}else{
Session.openActiveSession(this, true, new Session.StatusCallback()
{
@Override
public void call(Session session, SessionState state, Exception exception)
{
if (session.isOpened())
{
Toast.makeText(activity, "Connected to Fb", Toast.LENGTH_SHORT).show();
}
}});
}
}
}
答案 4 :(得分:0)
我挖了一下SDK(3.5),似乎EXTRA_PROTOCOL_VERSION总是存储为Integer而不是String。即在NativeProtocol.java中:
public static Intent createPlatformActivityIntent(Context context, String action, int version, Bundle extras) {
Intent intent = new Intent()
.setAction(INTENT_ACTION_PLATFORM_ACTIVITY)
.setPackage(FACEBOOK_PACKAGE)
.addCategory(Intent.CATEGORY_DEFAULT)
.putExtras(extras)
.putExtra(EXTRA_PROTOCOL_VERSION, version) //version --> int
.putExtra(EXTRA_PROTOCOL_ACTION, action);
return validateKatanaActivityIntent(context, intent);
}
public static Intent createPlatformServiceIntent(Context context) {
Intent intent = new Intent(INTENT_ACTION_PLATFORM_SERVICE)
.setPackage(FACEBOOK_PACKAGE)
.addCategory(Intent.CATEGORY_DEFAULT);
return validateKatanaServiceIntent(context, intent);
}
public static Intent createLoginDialog20121101Intent(Context context, String applicationId, ArrayList<String> permissions,
String audience) {
Intent intent = new Intent()
.setAction(INTENT_ACTION_PLATFORM_ACTIVITY)
.setPackage(FACEBOOK_PACKAGE)
.addCategory(Intent.CATEGORY_DEFAULT)
.putExtra(EXTRA_PROTOCOL_VERSION, PROTOCOL_VERSION_20121101) // PROTOCOL_VERSION_20121101 --> int
.putExtra(EXTRA_PROTOCOL_ACTION, ACTION_LOGIN_DIALOG)
.putExtra(EXTRA_APPLICATION_ID, applicationId)
.putStringArrayListExtra(EXTRA_PERMISSIONS, ensureDefaultPermissions(permissions))
.putExtra(EXTRA_PROTOCOL_CALL_ID, generateCallId())
.putExtra(EXTRA_WRITE_PRIVACY, ensureDefaultAudience(audience));
return validateKatanaActivityIntent(context, intent);
}
在devs通常得到此错误的地方被读取为String(AuthorizationCLient.java l:820):
addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION,
intent.getStringExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION));
这在任何情况下都无效,所以它仍然是SDK中的一个错误。只是在某些情况下,该段才会被执行。
有任何意见吗?
答案 5 :(得分:0)
我得到了同样的错误,google很多东西,最后这就是我为逃避错误所做的工作
private void getHashKey()
{
PackageInfo info;
try {
info = getPackageManager().getPackageInfo("Your_Package_Name", PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {MessageDigest md;
md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
//String something = new String(Base64.encode(md.digest(), 0));
String something = new String(Base64.encode(md.digest(),0));
Log.e("** Hash Key", something);
}
}
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());
}
}
所以,我使用了这段代码生成的Hash_Key,并在我的facebook开发者控制台中更新了它。这解决了我的问题。可能是windows key_gen或android key_store
的一些问题另外,请在第820行检查来自Facebook Sdk的AuthorizationClient.java文件
addLoggingExtra(EVENT_EXTRAS_PROTOCOL_VERSION,"" +
intent.getIntExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION, 0));
我将其设为“ getIntExtra ”,将其设为“ getStringExtra ”。做出这些改变,对我有用。 希望它也适合你。