使用脸书登录和电子邮箱登录

问题描述:

嘿,我想整合Facebook登录到我的登录页面,但我得到低于给定的错误。使用脸书登录和电子邮箱登录

显示java.lang.NullPointerException:尝试在上一个com.startingandroid.registrationandlogin空对象引用调用虚拟方法 '无效 android.widget.Button.setOnClickListener(android.view.View $ OnClickListener)' 。 LoginActivity.onCreate(LoginActivity.java:78)

以下是我的代码。

android.animation.Animator; 
import android.animation.AnimatorListenerAdapter; 
import android.annotation.TargetApi; 
import android.app.ProgressDialog; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.support.annotation.NonNull; 
import android.support.design.widget.Snackbar; 
import android.support.design.widget.TextInputLayout; 
import android.support.v7.app.AppCompatActivity; 
import android.app.LoaderManager.LoaderCallbacks; 

import android.content.CursorLoader; 
import android.content.Loader; 
import android.database.Cursor; 
import android.net.Uri; 
import android.os.AsyncTask; 

import android.os.Build; 
import android.os.Bundle; 
import android.provider.ContactsContract; 
import android.support.v7.widget.Toolbar; 
import android.text.TextUtils; 
import android.view.KeyEvent; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.inputmethod.EditorInfo; 
import android.widget.ArrayAdapter; 
import android.widget.AutoCompleteTextView; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.StringRequest; 

import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

import static android.Manifest.permission.READ_CONTACTS; 


public class LoginActivity extends AppCompatActivity { 

private Button registrationButton, loginButton; 
private EditText email_to_login, password_to_login; 

private ProgressDialog progressDialog; 
private Session session; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toolbar toolBar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolBar); 
    session = new Session(LoginActivity.this); 
    progressDialog = new ProgressDialog(this); 
    progressDialog.setCancelable(false); 
    registrationButton = (Button) findViewById(R.id.registration_button); 
    loginButton = (Button) findViewById(R.id.signin_button); 
    email_to_login = (EditText) findViewById(R.id.email_to_login); 
    password_to_login = (EditText) findViewById(R.id.password_to_login); 


    registrationButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Intent intent = new Intent(getApplicationContext(), 
        RegistrationActivity.class); 
      startActivity(intent); 
      finish(); 
     } 
    }); 

    loginButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String email = email_to_login.getText().toString(); 
      String password = password_to_login.getText().toString(); 

      if (email.trim().length() > 0 && password.trim().length() > 0) { 
       checkLogin(email, password); 
      } else { 
       Snackbar.make(v, "Please enter the credentials!", Snackbar.LENGTH_LONG) 
         .show(); 
      } 
     } 
    }); 
} 

private void checkLogin(final String email, final String password) { 
    String tag_string_req = "req_login"; 

    progressDialog.setMessage("Logging in ..."); 
    showDialog(); 

    StringRequest strReq = new StringRequest(Request.Method.POST, 
      AppURLs.URL, new Response.Listener<String>() { 

     @Override 
     public void onResponse(String response) { 
      hideDialog(); 

      try { 
       JSONObject jObj = new JSONObject(response); 
       String userId = jObj.getString("user_id"); 

       if (userId != null) { 
        session.setLogin(true); 
        Intent intent = new Intent(LoginActivity.this, 
          MainActivity.class); 
        startActivity(intent); 
        finish(); 
       } else { 
        String errorMsg = jObj.getString("error_msg"); 
        Toast.makeText(getApplicationContext(), 
          errorMsg, Toast.LENGTH_LONG).show(); 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

     } 
    }, new Response.ErrorListener() { 

     @Override 
     public void onErrorResponse(VolleyError error) { 
      Toast.makeText(getApplicationContext(), 
        error.getMessage(), Toast.LENGTH_LONG).show(); 
      hideDialog(); 
     } 
    }) { 

     @Override 
     protected Map<String, String> getParams() { 
      // Post params to login url 
      Map<String, String> params = new HashMap<String, String>(); 
      params.put("tag", "login"); 
      params.put("email", email); 
      params.put("password", password); 

      return params; 
     } 

    }; 

    // Adding request to queue 
    AppController.getInstance().addToRequestQueue(strReq, tag_string_req); 
} 

private void showDialog() { 
    if (!progressDialog.isShowing()) 
     progressDialog.show(); 
} 

private void hideDialog() { 
    if (progressDialog.isShowing()) 
     progressDialog.dismiss(); 
} 
} 
+0

也发布你的'activity_main.xml'文件。 –

+0

什么是您的Facebook sdk版本? –

+0

compile'c​​om.facebook.android:facebook-android-sdk:4.10.0' –

这里是Facebook登录的完整代码:

XML文件:

<com.facebook.login.widget.LoginButton 
       android:id="@+id/login_button" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       /> 

的java文件:

private CallbackManager callbackManager; 
private LoginButton loginButton; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 



     FacebookSdk.sdkInitialize(this.getApplicationContext()); 

     callbackManager = CallbackManager.Factory.create(); 

    setContentView(R.layout.youractivity); 

    loginButton = (LoginButton) findViewById(R.id.login_button); 

     loginButton.setReadPermissions(Arrays 
       .asList("public_profile, email, user_birthday, user_friends")); 


    loginButton.registerCallback(callbackManager, 
       new FacebookCallback<LoginResult>() { 
        @Override 
        public void onSuccess(LoginResult loginResult) { 


         Log.wtf("FB Login", "Success!"); 

         new fblogin().execute(loginResult.getAccessToken()); 

        } 

        @Override 
        public void onCancel() { 

         Log.wtf("FB Login", "Cancel!"); 

        } 

        @Override 
        public void onError(FacebookException e) { 

         Log.wtf("FB Login", e.getMessage()); 

        } 
       }); 

} 


    class fblogin extends AsyncTask<AccessToken, String, String> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(Login.this); 
      pDialog.setMessage("Please Wait.."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     protected String doInBackground(AccessToken... params) { 
      // TODO Auto-generated method stub 

      // App code 
      GraphRequest request = GraphRequest.newMeRequest(params[0], 
        new GraphRequest.GraphJSONObjectCallback() { 
         @Override 
         public void onCompleted(JSONObject object, 
               GraphResponse response) { 
          // Application code 
          Log.v("LoginActivity", response.toString()); 

          try { 

           username = object.getString("first_name"); 


           emailid = object.getString("email"); 

           facebook_id = object.getString("id"); 
           /* 
           * profilePictureView .setProfileId(object 
           * .getString("id")); 
           */ 

           gender = object.getString("gender"); 

           bday = object.getString("birthday"); 

          } catch (JSONException e) { 
           // TODO Auto-generated catch 
           // block 
           e.printStackTrace(); 
          } 
         } 
        }); 
      Bundle parameters = new Bundle(); 
      parameters.putString("fields", 
        "id,first_name,email,gender,birthday"); 
      request.setParameters(parameters); 
      request.executeAndWait(); 

      return null; 
     } 

     protected void onPostExecute(String yourvalue) { 
      // dismiss the dialog once done 
      pDialog.dismiss(); 


       new checkLogin().execute(); // your custom function. 

     } 

    } 

在manifest文件中添加以下内容:

<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"/> 

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