2015-11-04 85 views
0

所以我的问题很简单,我创建了一个Facebook登录按钮,它的工作完美无瑕。 我改变了活动onSuccess(),但如果我关闭软件并再次打开它,它仍然在MainActivity(Loginpage)上。我希望它检查是否已经登录,如果是,请更改为我的LandingActivity。如果已经登录,跳过第一个活动(AndroidStudio/FacebookSDK)

有人可以帮我解决这个问题吗?我认为这是关于LoginResult和if语句,但我不确定。

谢谢。

- 代码供参考 -

MainActivity.java: 
package com.example.frederik.snapsule; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.widget.TextView; 

import com.facebook.CallbackManager; 
import com.facebook.FacebookCallback; 
import com.facebook.FacebookException; 
import com.facebook.FacebookSdk; 
import com.facebook.login.LoginResult; 
import com.facebook.login.widget.LoginButton; 

public class MainActivity extends Activity { 

    LoginButton login; 
    TextView info; 
    CallbackManager callbackManager; 

    //Creating and initializing the feature(Code from Facebook install guide) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FacebookSdk.sdkInitialize(getApplicationContext()); //Calls for the facebook feature 
     callbackManager = CallbackManager.Factory.create(); 
     setContentView(R.layout.content_main); 

     login = (LoginButton) findViewById(R.id.login_button); 
     login.setReadPermissions("public_profile","email"); 

     // Callback registration 
     login.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
      @Override 
      public void onSuccess(LoginResult loginResult) { 
       Intent i = new Intent(MainActivity.this, LandingActivity.class); 
       startActivity(i); 
      } 

      @Override 
      public void onCancel() { 
       // App code 
      } 

      @Override 
      public void onError(FacebookException exception) { 
       // App code 
      } 
     }); 

    } 

    //Facebook code 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     callbackManager.onActivityResult(requestCode, resultCode, data); 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

} 

的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.frederik.snapsule" > 

    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.INTERNET"/> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name="com.facebook.FacebookActivity" 
      android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" 
      android:label="@string/app_name" 
      android:theme="@android:style/Theme.Translucent.NoTitleBar" /> 

     <activity 
      android:name=".LandingActivity" 
      android:label="@string/app_name" 
      android:theme="@style/AppTheme.NoActionBar"> 
     </activity> 

     <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/fbid" /> 

    </application> 


</manifest> 

LandingActivity.java:

package com.example.frederik.snapsule; 

import android.app.Activity; 
import android.os.Bundle; 

public class LandingActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.landing_content); 
    } 
} 

编辑MainActivity:

package com.example.frederik.snapsule; 

//Importing 
import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import com.facebook.CallbackManager; 
import com.facebook.FacebookCallback; 
import com.facebook.FacebookException; 
import com.facebook.FacebookSdk; 
import com.facebook.login.LoginResult; 
import com.facebook.login.widget.LoginButton; 

public class MainActivity extends Activity { 

    LoginButton login; 
    CallbackManager callbackManager; 

    SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE); 
    SharedPreferences.Editor loginStateEditor = sharedPref.edit(); 

    //Creating and initializing the feature(Code from Facebook install guide) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     FacebookSdk.sdkInitialize(getApplicationContext()); //Calls for the facebook feature 
     callbackManager = CallbackManager.Factory.create(); 
     setContentView(R.layout.content_main); 

     login = (LoginButton) findViewById(R.id.login_button); 
     login.setReadPermissions("public_profile", "email"); 

     if (sharedPref.getBoolean("success_login", false)) { 
      Intent i = new Intent(MainActivity.this, LandingActivity.class); 
      startActivity(i); 
     } 

     // Callback registration 
     login.registerCallback(callbackManager, new FacebookCallback<LoginResult>() { 
      @Override 
      public void onSuccess(LoginResult loginResult) { 
       Intent i = new Intent(MainActivity.this, LandingActivity.class); 

       loginStateEditor.putBoolean("success_login", true); 
       loginStateEditor.commit(); 

       startActivity(i); 

      } 

      @Override 
      public void onCancel() { 

      } 

      @Override 
      public void onError(FacebookException exception) { 

      } 
     }); 

    } 

    //Facebook code 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     callbackManager.onActivityResult(requestCode, resultCode, data); 
     super.onActivityResult(requestCode, resultCode, data); 
    } 

} 

logcat的错误日志:

11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime: FATAL EXCEPTION: main 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime: Process: com.example.frederik.snapsule, PID: 18421 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.frederik.snapsule/com.example.frederik.snapsule.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.ActivityThread.-wrap11(ActivityThread.java) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:102) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:148) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5417) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.content.ContextWrapper.getPackageName(ContextWrapper.java:133) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.Activity.getLocalClassName(Activity.java:5205) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.Activity.getPreferences(Activity.java:5239) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at com.example.frederik.snapsule.MainActivity.<init>(MainActivity.java:21) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at java.lang.Class.newInstance(Native Method) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.Instrumentation.newActivity(Instrumentation.java:1067) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)  
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.ActivityThread.-wrap11(ActivityThread.java)  
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)  
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.os.Handler.dispatchMessage(Handler.java:102)  
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.os.Looper.loop(Looper.java:148)  
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at android.app.ActivityThread.main(ActivityThread.java:5417)  
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at java.lang.reflect.Method.invoke(Native Method)  
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
+0

就快到了回来检查,如果用户在登录,如果真的做了必需的事情。 –

+0

@VibhorChopra请详细说明:-) – KrownScripter

+0

为什么你确定你可以检查以前的登录是否仍然有效,如果会话过期或什么的话会怎么样? – Nanoc

回答

1

由于@Nanoc评论说,如果Facebook与你想要的同意,您可以使用SharedPreferences如下:

public class MainActivity extends Activity { 
    ... 
    // Create SharedPreferences and Editor 
    SharedPreferences sharedPref; 
    SharedPreferences.Editor; 
    ... 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     ... 
     sharedPref= getSharedPreferences("myPref", Context.MODE_PRIVATE); 
     loginStateEditor=sharedPref.edit(); 

     if (sharedPref.getBoolean("success_login", false)) { 
      // Start Your LandingActivity 
      Intent i = new Intent(MainActivity.this, LandingActivity.class); 
      startActivity(i); 
     } 

     ... 

     @Override 
     public void onSuccess(LoginResult loginResult) { 
      Intent i = new Intent(MainActivity.this, LandingActivity.class); 
      // Save login state on shared pref. 
      loginStateEditor.putBoolean("success_login", true); 
      loginStateEditor.commit(); 
      ... 
     } 
    ... 
} 
+0

得到一个错误无法解析方法“equals(boolean)” – KrownScripter

+0

对不起,我的错误。 :(edited.please再次看到 – Seyyed

+0

似乎崩溃我的应用程序,添加我编辑的MainActivity,以防我输入错误 – KrownScripter

相关问题