質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

Q&A

解決済

2回答

3167閲覧

facebookログインする際にCallbackされない

murapon

総合スコア22

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Facebook

Facebookは、実名登録制のSNS(ソーシャル・ネットワーキング・サービス)です。開発者用のデベロッパーサイトが存在し、一般ユーザーによるFacebook向けアプリケーション開発が可能です。

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

0グッド

0クリップ

投稿2016/02/15 13:03

frangmentにてログインボタンを表示し、
それをクリックすることでfacebookログインをしようとしているのですが、callbackされません。
最初、facebookから取得したfacebook_app_idを間違えており、エラー画面が表示されましたが、そこを修正したらエラーが表示されなくなったので、facebookとの最初の通信は正しく行われていると思います。

いろいろなサイトを見たのですが、解決策が見つかりませんでした。
最終的なソースが以下です。

java

1import java.util.Arrays; 2 3import android.app.Fragment; 4import android.content.Intent; 5import android.os.Bundle; 6import android.util.Log; 7import android.view.LayoutInflater; 8import android.view.View; 9import android.view.ViewGroup; 10import android.widget.Button; 11 12import com.facebook.CallbackManager; 13import com.facebook.FacebookCallback; 14import com.facebook.FacebookException; 15import com.facebook.FacebookSdk; 16import com.facebook.login.LoginManager; 17import com.facebook.login.LoginResult; 18 19public class TopFragment extends Fragment { 20 21 private View view; 22 private CallbackManager callbackManager; 23 24 @Override 25 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 26 Log.d("TEST", "onCreateView"); 27 view = inflater.inflate(R.layout.top_fragment, container, false); 28 29 FacebookSdk.sdkInitialize(getActivity()); 30 Button toLoginBtn = (Button) view.findViewById(R.id.to_login_button); 31 toLoginBtn.setOnClickListener(new View.OnClickListener() { 32 @Override 33 public void onClick(View v) { 34 Log.d("TEST", "LoginManager.getInstance() start"); 35 LoginManager.getInstance().logInWithReadPermissions(getActivity(), Arrays.asList("public_profile", "email")); //profileとemailの情報を取得 36 Log.d("TEST", "LoginManager.getInstance() end"); 37 } 38 }); 39 40 callbackManager = CallbackManager.Factory.create(); 41 LoginManager.getInstance().registerCallback(callbackManager, 42 new FacebookCallback<LoginResult>() { 43 @Override 44 public void onSuccess(LoginResult loginResult) { 45 //ログイン成功 46 Log.d("TEST", "success"); 47 } 48 @Override 49 public void onCancel() { 50 //キャンセル 51 Log.d("TEST", "cancel"); 52 } 53 54 @Override 55 public void onError(FacebookException exception) { 56 //ログイン失敗 57 Log.d("TEST", "error"); 58 Log.e("TEST", exception.toString()); 59 } 60 }); 61 return view; 62 } 63 64 @Override 65 public void startActivityForResult(Intent intent, int requestCode) { 66 Fragment parent = this.getParentFragment(); 67 if (parent != null) { 68 parent.startActivityForResult(intent, requestCode); 69 } else { 70 super.startActivityForResult(intent, requestCode); 71 } 72 } 73 74 @Override 75 public void onActivityResult(int requestCode, int resultCode, Intent data) { 76 77 Log.d("TEST", "onActivityResult ABC"); 78 super.onActivityResult(requestCode, resultCode, data); 79 callbackManager.onActivityResult(requestCode, resultCode, data); 80 } 81 82 @Override 83 public void onStart(){ 84 super.onStart(); 85 } 86 87 @Override 88 public void onDestroy() { 89 super.onDestroy(); 90 } 91}

実装方法等ご存知の方、参考になるサイト等ご存知の方教えて頂けませんでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hato_pato

2016/02/16 05:30

コンソール・エラーログの記載をお願いします。
murapon

2016/02/16 11:59

エラーログは以下になります。 02-16 20:57:09.213 24146-24146/? I/Timeline﹕ Timeline: Activity_launch_request id:sample.frema time:440684995 02-16 20:57:09.217 921-1901/? I/ActivityManager﹕ START u0 {act=NATIVE_WITH_FALLBACK cmp=sample.frema/com.facebook.FacebookActivity (has extras)} from uid 10499 on display 0 02-16 20:57:09.325 921-947/? I/ActivityManager﹕ Displayed sample.frema/com.facebook.FacebookActivity: +101ms 02-16 20:57:09.325 921-947/? I/Timeline﹕ Timeline: Activity_windows_visible id: ActivityRecord{2139e7a9 u0 sample.frema/com.facebook.FacebookActivity t4065} time:440685108 02-16 20:57:09.341 24146-24146/? I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@e2aba50 time:440685124 02-16 20:57:09.355 358-913/? E/NetlinkEvent﹕ NetlinkEvent::FindParam(): Parameter 'TIME_NS' not found 02-16 20:57:10.194 24146-24146/? I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@10038bb time:440685976 02-16 20:57:12.498 362-958/? W/audio_hw_primary﹕ disable_snd_device: device ref cnt is already 0 02-16 20:57:16.986 421-908/? E/CABL﹕ hist_preprocess: Incorrect histogram data!!! 02-16 20:57:16.988 421-908/? E/PPDaemon﹕ abl_calc_lut() failed with ret = 1 02-16 20:57:21.682 3393-3393/? I/GCoreUlr﹕ Starting service, intent=Intent { act=com.google.android.location.reporting.ACTION_UPDATE_ACTIVE_STATE cmp=com.google.android.gms/com.google.android.location.reporting.service.DispatchingService (has extras) }, extras=Bundle[{source=PowerModeReceiver}] 02-16 20:57:21.756 1381-1381/? I/wpa_supplicant﹕ wlan0: CTRL-EVENT-SCAN-STARTED 02-16 20:57:21.797 3393-3703/? I/GCoreUlr﹕ DispatchingService.updateActiveState+PowerModeReceiver: Ensuring that reporting is active for [account#9#] 02-16 20:57:21.815 3393-3703/? I/GCoreUlr﹕ GMS FLP location and AR updates requested: {"description":"stationary","newRequest":true,"samplePeriodMs":2160000,"sampleReason":"stationary","sampleSource":"internal","timestampMs":1455623841690} 02-16 20:57:21.818 3393-3703/? I/GCoreUlr﹕ GMS BLE scans enabled. 02-16 20:57:21.820 3393-3703/? I/GCoreUlr﹕ Place inference reporting - stopped よろしくお願いいたします。
hato_pato

2016/02/17 02:09

LoginManager.getInstance() start などのログは含められますか?
murapon

2016/02/19 11:05

遅くなりました。 LoginManager.getInstance() startからendまでのログを取得しました。 02-19 19:53:09.182 20970-20970/? D/TEST﹕ LoginManager.getInstance() start 02-19 19:53:09.184 20970-20970/? I/Timeline﹕ Timeline: Activity_launch_request id:murapon.frema time:594229965 02-19 19:53:09.185 921-938/? I/ActivityManager﹕ START u0 {act=NATIVE_WITH_FALLBACK cmp=murapon.frema/com.facebook.FacebookActivity (has extras)} from uid 10499 on display 0 02-19 19:53:09.187 362-958/? D/audio_hw_primary﹕ out_set_parameters: enter: usecase(1: low-latency-playback) kvpairs: routing=2 02-19 19:53:09.190 20970-20970/? D/TEST﹕ LoginManager.getInstance() end お願いいたします。
guest

回答2

0

自己解決

java

1LoginManager.getInstance().logInWithReadPermissions(getActivity(), Arrays.asList("public_profile", "email"));

の引数でgetActivity()を渡しているところが間違いでした。
この場合、コールバック先がActionになり、fragmentでは拾うことができていませんでした。
引数を

java

1LoginManager.getInstance().logInWithReadPermissions(topFragment, Arrays.asList("public_profile", "email"));

とfragmentに変えたところ、
うまくいきました。

以下、修正後のソース

java

1import java.util.Arrays; 2 3import android.app.Fragment; 4import android.content.Intent; 5import android.os.Bundle; 6import android.util.Log; 7import android.view.LayoutInflater; 8import android.view.View; 9import android.view.ViewGroup; 10import android.widget.Button; 11//import android.support.v4.app.Fragment; 12 13import com.facebook.CallbackManager; 14import com.facebook.FacebookCallback; 15import com.facebook.FacebookException; 16import com.facebook.FacebookSdk; 17import com.facebook.login.LoginManager; 18import com.facebook.login.LoginResult; 19 20public class TopFragment extends Fragment { 21 22 private View view; 23 private LoginManager mLoginMgr; 24 private CallbackManager callbackManager; 25 private TopFragment topFragment; 26 27 @Override 28 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 29 Log.d("TEST", "onCreateView"); 30 topFragment = this; 31 view = inflater.inflate(R.layout.top_fragment, container, false); 32 33 FacebookSdk.sdkInitialize(getActivity()); 34 callbackManager = CallbackManager.Factory.create(); 35 mLoginMgr = LoginManager.getInstance(); 36 37 Button toLoginBtn = (Button) view.findViewById(R.id.to_login_button); 38 toLoginBtn.setOnClickListener(new View.OnClickListener() { 39 @Override 40 public void onClick(View v) { 41 //1.onClick内にログインのパーミッションを設定(LoginButtonを使用しない場合) 42 Log.d("TEST", "LoginManager.getInstance() start"); 43 mLoginMgr = LoginManager.getInstance(); 44 mLoginMgr.logInWithReadPermissions(topFragment, Arrays.asList("public_profile", "email")); 45 46 Log.d("TEST", "LoginManager.getInstance() end"); 47 } 48 }); 49 50 FacebookSdk.sdkInitialize(getActivity()); 51 callbackManager = CallbackManager.Factory.create(); 52 LoginManager.getInstance().registerCallback(callbackManager, 53 new FacebookCallback<LoginResult>() { 54 @Override 55 public void onSuccess(LoginResult loginResult) { 56 //3.1 ログイン成功 57 Log.d("TEST", "success"); 58 } 59 60 @Override 61 public void onCancel() { 62 //3.2 ログインキャンセル 63 Log.d("TEST", "cancel"); 64 } 65 66 @Override 67 public void onError(FacebookException exception) { 68 //3.3 ログイン失敗 69 Log.d("TEST", "error"); 70 Log.e("TEST", exception.toString()); 71 } 72 } 73 ); 74 return view; 75 } 76 77 @Override 78 public void startActivityForResult(Intent intent, int requestCode) { 79 Fragment parent = this.getParentFragment(); 80 if (parent != null) { 81 parent.startActivityForResult(intent, requestCode); 82 } else { 83 super.startActivityForResult(intent, requestCode); 84 } 85 } 86 87 @Override 88 public void onActivityResult(int requestCode, int resultCode, Intent data) { 89 90 Log.d("TEST", "onActivityResult ABC"); 91 callbackManager.onActivityResult(requestCode, resultCode, data); 92 } 93 94 @Override 95 public void onStart(){ 96 super.onStart(); 97 } 98 99 @Override 100 public void onDestroy() { 101 super.onDestroy(); 102 } 103}

投稿2016/02/22 11:47

murapon

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

よくよくソース見てみると
onClick内のLoginManagerと
callbackManagerをセットしているLoginManagerで
インスタンスが違うのでcallbackされないのではないでしょうか?

LoginManagerのgetinstance()を変数にセットして、
その変数に対してcallbackManagerをセットすることで解決しませんでしょうか?

上記のイメージ

java

1 2loginManager = LoginManager.getInstance(); 3 4loginManager.registerCallback(callbackManager, 5 new FacebookCallback<LoginResult>() { 6 @Override 7 public void onSuccess(LoginResult loginResult) { 8 // App code 9 Toast.makeText(getApplicationContext(), loginResult.getAccessToken().toString(), Toast.LENGTH_SHORT).show(); 10 11 } 12 13 @Override 14 public void onCancel() { 15 // App code 16 } 17 18 @Override 19 public void onError(FacebookException exception) { 20 // App code 21 } 22 });

投稿2016/02/22 06:58

hato_pato

総合スコア215

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

murapon

2016/02/22 11:42

調査頂きましてありがとうございました。 おかげさまで自己解決できました。解決方法は別途記載します。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問