数日前にFB LoginをAPPに実装しましたが、今日、実装したもののほとんどが非推奨になっていることがわかりました。
以前は、Session
を使用して、ユーザーがログインしているかどうかを確認していました。ただし、それは新しいSDKでは機能しません。
彼らのドキュメントによると、AccessToken.getCurrentAccessToken()
とProfile.getCurrentProfile()
を使用して、ユーザーが既にログインしているかどうかを確認できますが、それらを利用できませんでした。
私はこのようなものを試しました:
if(AccessToken.getCurrentAccessToken() == null)
この内部で使用できればそれが機能するのだろうか(FBからも提供されています):
LoginManager.getInstance().registerCallback(callbackManager, new LoginManager.Callback() {...});
ただし、"シンボル 'Callback'を解決できません。"が表示されます。
編集!!!!!!
さて、次を使用してユーザーがログインしているかどうかを確認できました。
onCreateで:
accessTokenTracker = new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
updateWithToken(newAccessToken);
}
};
次に、それは私のupdateWithToken
メソッドを呼び出します:
private void updateWithToken(AccessToken currentAccessToken) {
if (currentAccessToken != null) {
LOAD ACTIVITY A!
} else {
LOAD ACTIVITY B!
}
}
現在、問題は次のとおりです。ユーザーがアプリケーションを使用したことがあり、以前にログインしたことがない場合は、確認できますただし、ユーザーがアプリを初めて使用する場合、updateWithToken
がAccessTokenTrackerによって呼び出されることはありません。
誰か助けてもらえたら本当にありがたいです。
ありがとう!
わかった!
まず、FB SDKを初期化したことを確認してください。次に、次を追加します。
accessTokenTracker = new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
updateWithToken(newAccessToken);
}
};
これは、Current Access Tokesに変更があるときに呼び出されます。つまり、これはユーザーが既にログインしている場合にのみ役立ちます。
次に、これをonCreate()
メソッドに追加します。
updateWithToken(AccessToken.getCurrentAccessToken());
それからもちろん、updateWithToken()
メソッド:
private void updateWithToken(AccessToken currentAccessToken) {
if (currentAccessToken != null) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent i = new Intent(SplashScreen.this, GeekTrivia.class);
startActivity(i);
finish();
}
}, SPLASH_TIME_OUT);
} else {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent i = new Intent(SplashScreen.this, Login.class);
startActivity(i);
finish();
}
}, SPLASH_TIME_OUT);
}
}
それは私のためにそれをしました! =]
私の場合、はるかに簡単な解決策がうまくいきました(しかし、これがよりエレガントな方法かどうかはわかりません):
public boolean isLoggedIn() {
AccessToken accessToken = AccessToken.getCurrentAccessToken();
return accessToken != null;
}
ログインステータスを確認するためにAccessTokenとAccessTokenTrackerを使用する私のジレンマは、AccessTokenの準備ができ、トラッカーのコールバック関数が呼び出されたが、プロファイルがまだ準備されていない可能性があるため、その時点でFacebookerの名前を取得または表示できないことです。
私の解決策は、現在のプロファイル!= nullをチェックし、トラッカーを使用してFacebookerの名前を同時に持つことです:
ProfileTracker fbProfileTracker = new ProfileTracker() {
@Override
protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
// User logged in or changed profile
}
};
ログインステータスを確認し、ユーザー名を取得します。
Profile profile = Profile.getCurrentProfile();
if (profile != null) {
Log.v(TAG, "Logged, user name=" + profile.getFirstName() + " " + profile.getLastName());
}
フェリペが答えで言及したのと同じ方法を使用するか、他の2つの方法を使用できます。しかし、AccessTokenTrackerはアクセストークンを追跡するのに役立つため、便利な方法のようです(ProfileTrackerクラスで使用)
例えば
レイアウトxmlで
<Button
Android:id="@+id/my_facebook_button"
Android:background="@drawable/btnfacebook"
Android:onClick="facebookLogin"/>
あなたの活動で
//Custom Button
Button myFacebookButton = (Button) findViewById(R.id.my_facebook_button);
ボタンonclickリスナー
public void facebookLogin(View view) {
LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("public_profile", "user_friends"));
}
最後にLoginManagerコールバック
//Create callback manager to handle login response
CallbackManager callbackManager = CallbackManager.Factory.create();
LoginManager.getInstance().registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
Log.i(TAG, "LoginManager FacebookCallback onSuccess");
if(loginResult.getAccessToken() != null) {
Log.i(TAG, "Access Token:: " + loginResult.getAccessToken());
facebookSuccess();
}
}
@Override
public void onCancel() {
Log.i(TAG, "LoginManager FacebookCallback onCancel");
}
@Override
public void onError(FacebookException e) {
Log.i(TAG, "LoginManager FacebookCallback onError");
}
});
例えば
レイアウトxmlで
<com.facebook.login.widget.LoginButton
Android:id="@+id/login_button"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"/>
あなたの活動で
//Facebook SDK provided LoginButton
LoginButton loginButton = (LoginButton) findViewById(R.id.login_button);
loginButton.setReadPermissions("user_friends");
//Callback registration
loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
// App code
Log.i(TAG, "LoginButton FacebookCallback onSuccess");
if(loginResult.getAccessToken() != null){
Log.i(TAG, "Access Token:: "+loginResult.getAccessToken());
facebookSuccess();
}
}
@Override
public void onCancel() {
// App code
Log.i(TAG, "LoginButton FacebookCallback onCancel");
}
@Override
public void onError(FacebookException exception) {
// App code
Log.i(TAG, "LoginButton FacebookCallback onError:: "+exception.getMessage());
Log.i(TAG,"Exception:: "+exception.getStackTrace());
}
});
アクティビティonActivityResult()でcallbackManager.onActivityResult(requestCode, resultCode, data);
を呼び出すことを忘れないでください
facebook documentation によると、これを行うには:
AccessToken accessToken = AccessToken.getCurrentAccessToken();
boolean isLoggedIn = accessToken != null && !accessToken.isExpired();
返信が遅くなりましたが、現在はバージョン4.25.0
Facebook SDK
にメソッドがあります:
public void retrieveLoginStatus(Context context,
LoginStatusCallback responseCallback)
どの州:
ユーザーのログインステータスを取得します。ユーザーが同じデバイスでAndroidアプリのFacebookにログインしており、そのユーザーが以前にアプリにログインしていた場合、これはアプリのアクセストークンを返します。アクセストークンが取得された場合、トーストが表示され、ログインしたことがユーザーに通知されます。
そして次のように使用できます:
LoginManager.getInstance().retrieveLoginStatus( this, new LoginStatusCallback()
{
@Override
public void onCompleted( AccessToken accessToken )
{
GraphRequest request = GraphRequest.newMeRequest( accessToken, new GraphRequest.GraphJSONObjectCallback()
{
@Override
public void onCompleted( JSONObject object, GraphResponse response )
{
Log.e( TAG, object.toString() );
Log.e( TAG, response.toString() );
try
{
userId = object.getString( "id" );
profilePicture = new URL( "https://graph.facebook.com/" + userId + "/picture?width=500&height=500" );
Log.d( "PROFILE_URL", "url: " + profilePicture.toString() );
if ( object.has( "first_name" ) )
{
firstName = object.getString( "first_name" );
}
if ( object.has( "last_name" ) )
{
lastName = object.getString( "last_name" );
}
if ( object.has( "email" ) )
{
email = object.getString( "email" );
}
if ( object.has( "birthday" ) )
{
birthday = object.getString( "birthday" );
}
if ( object.has( "gender" ) )
{
gender = object.getString( "gender" );
}
Intent main = new Intent( LoginActivity.this, MainActivity.class );
main.putExtra( "name", firstName );
main.putExtra( "surname", lastName );
main.putExtra( "imageUrl", profilePicture.toString() );
startActivity( main );
finish();
}
catch ( JSONException e )
{
e.printStackTrace();
}
catch ( MalformedURLException e )
{
e.printStackTrace();
}
}
} );
//Here we put the requested fields to be returned from the JSONObject
Bundle parameters = new Bundle();
parameters.putString( "fields", "id, first_name, last_name, email, birthday, gender" );
request.setParameters( parameters );
request.executeAsync();
}
@Override
public void onFailure()
{
Toast.makeText( LoginActivity.this, "Could not log in.", Toast.LENGTH_SHORT ).show();
}
@Override
public void onError( Exception exception )
{
Toast.makeText( LoginActivity.this, "Could not log in.", Toast.LENGTH_SHORT ).show();
}
} );