カテゴリー : Facebook

[Android] Facebook SDK でエラー : Failure delivering result ResultInfo{who=null, request=64206, result=0, data=null} to activity {com.example/com.facebook.LoginActivity}: java.lang.NullPointerException

Facebook SDK for Android v3.0 でログイン処理時に NullPointerException エラーが発生しました。

Stack Trace
0	java.lang.RuntimeException: 
Failure delivering result ResultInfo{who=null, request=64206, result=0, data=null}
to activity {com.example/com.facebook.LoginActivity}: java.lang.NullPointerException
1		at android.app.ActivityThread.deliverResults(ActivityThread.java:2980)
2		at android.app.ActivityThread.handleSendResult(ActivityThread.java:3023)
3		at android.app.ActivityThread.access$1100(ActivityThread.java:123)
4		at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1177)
5		at android.os.Handler.dispatchMessage(Handler.java:99)
6		at android.os.Looper.loop(Looper.java:137)
7		at android.app.ActivityThread.main(ActivityThread.java:4424)
8		at java.lang.reflect.Method.invokeNative(Native Method)
9		at java.lang.reflect.Method.invoke(Method.java:511)
10		at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11		at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12		at dalvik.system.NativeStart.main(Native Method)
13	Caused by: java.lang.NullPointerException
14		at com.facebook.AuthorizationClient$KatanaProxyAuthHandler.onActivityResult(SourceFile:645)
15		at com.facebook.AuthorizationClient.onActivityResult(SourceFile:142)
16		at com.facebook.LoginActivity.onActivityResult(SourceFile:134)
17		at android.app.Activity.dispatchActivityResult(Activity.java:4676)
18		at android.app.ActivityThread.deliverResults(ActivityThread.java:2976)
19		... 11 more
20	java.lang.NullPointerException
21		at com.facebook.AuthorizationClient$KatanaProxyAuthHandler.onActivityResult(SourceFile:645)
22		at com.facebook.AuthorizationClient.onActivityResult(SourceFile:142)
23		at com.facebook.LoginActivity.onActivityResult(SourceFile:134)
24		at android.app.Activity.dispatchActivityResult(Activity.java:4676)
25		at android.app.ActivityThread.deliverResults(ActivityThread.java:2976)
26		at android.app.ActivityThread.handleSendResult(ActivityThread.java:3023)
27		at android.app.ActivityThread.access$1100(ActivityThread.java:123)
28		at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1177)
29		at android.os.Handler.dispatchMessage(Handler.java:99)
30		at android.os.Looper.loop(Looper.java:137)
31		at android.app.ActivityThread.main(ActivityThread.java:4424)
32		at java.lang.reflect.Method.invokeNative(Native Method)
33		at java.lang.reflect.Method.invoke(Method.java:511)
34		at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
35		at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
36		at dalvik.system.NativeStart.main(Native Method)

Facebook SDK for Android v3.0 のバグらしいので、v3.0.1 にアップデートすることで解決します。

[参考情報]

NullPointerException on pressing back on native facebook login- Facebook Developers

Exception on pressing back at facebook login – Stack Overflow

[Android] Facebook 認証できないエラー : com.facebook.FacebookOperationCanceledException: remote_app_id does not match stored id

Android アプリ開発で、Facebook 認証できないというエラーが発生しました。

com.facebook.FacebookOperationCanceledException: remote_app_id does not match stored id

Facebook アプリの設定画面に登録している Key Hashes が間違っている場合、このようなエラーが発生するようです。

下記のコードを onCreate に記載して、key hash をログに出力して確認します。

try {
    PackageInfo info = getPackageManager().getPackageInfo("com.example.packagename",
            PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        Log.d("YOURHASH KEY:",
                Base64.encodeToString(md.digest(), Base64.DEFAULT));
    }
} catch (NameNotFoundException e) {
 
} catch (NoSuchAlgorithmException e) {
 
}

key hash をコマンドラインで確認する方法もありますが、Windows用の OpenSSL を使わないといけないらしく、Mac用の OpenSSL だと正しい key hash が取得できないみたいです。

例えば、コマンドラインで keytool を使って debug.keystore の key hash を確認すると、 bvfSSDnrryuK8cbfekyHTs59l/A= です。

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64
キーストアのパスワードを入力してください:  android
bvfSSDnrryuK8cbfekyHTs59l/A=

しかし、冒頭の方法で、アプリ実行時のログから key hash を出力させると dkgthMwGADFQ7/9fkMn4MUzpSWo= であり、こちらが正しい値です。

ややこしい話ですが、解決方法が分かって良かったです。

[参考]

Issue with Facebook Key Hashes for the Android Application – Scriptico

android – remote_app_id does not match stored id – exception – Stack Overflow

[iOS] Facebook エラー:The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time.

Facebook iOS SDK version 3.5.1 で Facebook 認証を実装したらエラーが発生しました。

エラーログ

error:Error Domain=com.facebook.sdk Code=2
“The operation couldn’t be completed. (com.facebook.sdk error 2.)”
UserInfo=0x1e8b2740 {com.facebook.sdk:ErrorLoginFailedReason=com.facebook.sdk:SystemLoginCancelled, com.facebook.sdk:ErrorInnerErrorKey=Error Domain=com.apple.accounts
Code=7 “The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time.”
UserInfo=0x1ddf1eb0 {NSLocalizedDescription=
The Facebook server could not fulfill this access request: The app must ask for a basic read permission at install time.
}, com.facebook.sdk:ErrorSessionKey=, expirationDate: (null), refreshDate: (null), attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(null)>}

最初、以下のように openActiveSessionWithPublishPermissions で、publish_actions だけ取得しようとしていたのですが「The app must ask for a basic read permission at install time.」というエラーメッセージの通り、まず basic profile information を取得する必要があるそうです。

+ (void)connectWithCompletionHandler:(void(^)(FBSession *session, FBSessionState status, NSError *error))handler {
    NSLog(@"Connection");
    if ([[FBSession activeSession] isOpen]) {
        NSLog(@"Logout");
        [[FBSession activeSession] closeAndClearTokenInformation];
    }
 
    // Request publish permissions
    NSArray *publishPermissions = [NSArray arrayWithObjects:@"publish_actions", nil];
    [FBSession openActiveSessionWithPublishPermissions:publishPermissions
                                       defaultAudience:FBSessionDefaultAudienceFriends
                                          allowLoginUI:YES
                                     completionHandler:handler];
}

なので、下記のように先に openActiveSessionWithReadPermissions を呼び出せばOKです。

+ (void)connectWithCompletionHandler:(void(^)(FBSession *session, FBSessionState status, NSError *error))handler {
    NSLog(@"Connection");
    if ([[FBSession activeSession] isOpen]) {
        NSLog(@"Logout");
        [[FBSession activeSession] closeAndClearTokenInformation];
    }
 
    // Request basic profile information
    // 基本情報で必要なものがある場合、指定する
    // NSArray *readPermissions = [NSArray arrayWithObjects:@"email", @"user_birthday", nil];
    NSArray *readPermissions = nil;
    [FBSession openActiveSessionWithReadPermissions:readPermissions
                                       allowLoginUI:NO
                                  completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
                                      /* handle success + failure in block */
                                  }];
 
    // Request publish permissions
    NSArray *publishPermissions = [NSArray arrayWithObjects:@"publish_actions", nil];
    [FBSession openActiveSessionWithPublishPermissions:publishPermissions
                                       defaultAudience:FBSessionDefaultAudienceFriends
                                          allowLoginUI:YES
                                     completionHandler:handler];
}

[参考]

Facebook iOS SDK3.5で投稿処理を行う際の流れ(その2) – assaulter's diary

[Facebook] Handling Revoked Permissions – 失効権限の取り扱い

Handling Revoked Permissions – Facebook Developers はてなブックマーク - Handling Revoked Permissions - Facebook Developers

Handling Revoked Permissions
失効権限の取り扱い

The Permissions that are requested from a User by an App may not be fully granted, or may not remain constant – a user can choose to not grant some Permissions and can revoke these Permissions afterwards through their Facebook account settings. In order to provide a positive user experience, Apps should be built to handle these situations.
アプリケーションによるユーザーから要求された権限は完全に付与されていないか、一定のままでないかもしれません – ユーザはいくつかの権限を付与しないように選択することができ、自分のFacebookのアカウント設定を介して、その後、これらの権限を取り消すことができます。肯定的なユーザーエクスペリエンスを提供するために、アプリはこれらの状況を処理するために構築されるべきである。

[Facebook] ページタブ(Page Tab)アプリのサイズは 810px*800px

Facebook のページタブ(Page Tab)アプリのサイズは 810px*800px です。

■ Page Tab アプリ

810px*800px

【参考】

タイムライン変更によって仕様が変わったFacebookのiframeページの移行ガイド :: Creatorish はてなブックマーク - タイムライン変更によって仕様が変わったFacebookのiframeページの移行ガイド :: Creatorish

新Facebookページをデザインする際のサイズとアプリページのサイズ変更方法 | memocarilog はてなブックマーク - 新Facebookページをデザインする際のサイズとアプリページのサイズ変更方法 | memocarilog