#java #android #facebook #kotlin #authentication
Вопрос:
у меня есть обычная регистрация,которая запрашивает у пользователя имя пользователя,адрес электронной почты, пол и пароль, и эта информация хранится в Firebase
таким образом, обычная регистрация работает нормально, и данные сохраняются в Firebase после регистрации
вот кнопка onclick для регистрации:
if ( !validateName() || !validateUsername() || !validatePassword()) {
return@setOnClickListener
} else {
progressBar.visibility = View.VISIBLE
val name = mUsername.editableText.toString().trim()
val email = mEmail.editableText.toString().trim()
val password = mPassword.editableText.toString().trim()
val gender = mGender.editableText.toString().trim()
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener(object : OnCompleteListener<AuthResult> {
override fun onComplete(p0: Task<AuthResult>) {
Log.e("zzzzz",p0.isSuccessful.toString())
if (p0.isSuccessful) {
FirebaseInstallations.getInstance().getToken(true).addOnCompleteListener {
var fbToken = it.result!!.token
val sharedPreference2 = getSharedPreferences("isLogin", Context.MODE_PRIVATE)
var editor2 = sharedPreference2.edit()
editor2.putBoolean("isLogin", true)
editor2.putString("UserToken", fbToken)
editor2.commit()
Log.e("ggg",fbToken)
// DO your thing with your firebase token
}
val signupdata = Signupdata(name, email, password, gender)
var okHttpClient = OkHttpClient.Builder().apply {
addInterceptor(
Interceptor { chain ->
val builder = chain.request().newBuilder()
builder.header("X-App-Version", "0")
builder.header("X-Platform", "0")
builder.header("X-Auth-Token", "0")
return@Interceptor chain.proceed(builder.build())
}
)
}.build()
val apiInterface2 = ApiInterface2.create().getMovies()
//apiInterface.enqueue( Callback<List<Movie>>())
apiInterface2.enqueue(object : Callback<MutableList<Duadata>> {
override fun onResponse(
call: Call<MutableList<Duadata>>?,
response: Response<MutableList<Duadata>>?
) {
// Log.e("res", response!!.body().toString())
if (response?.body() != null)
response.body()!!
}
override fun onFailure(call: Call<MutableList<Duadata>>?, t: Throwable?) {
}
})
val sharedPreference3 = getSharedPreferences("isLogin", Context.MODE_PRIVATE)
var editor3 = sharedPreference3.edit()
// editor2.putString("UserToken", it.token.toString())
val sharedPreference = getSharedPreferences("User_Data", Context.MODE_PRIVATE)
var editor = sharedPreference.edit()
editor.putString("user_id", FirebaseAuth.getInstance().currentUser!!.uid)
editor.putString("email_id", email)
editor.putString("username",name)
editor.putString("gender",gender)
editor.commit()
Toast.makeText(
applicationContext,
"Registered Successfully!",
Toast.LENGTH_SHORT
).show()
val intent =
Intent(this@SignupActivity, MainActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
intent.putExtra("user_id",
FirebaseAuth.getInstance().currentUser!!.uid
)
intent.putExtra("email_id", email)
startActivity(intent)
finish()
} else {
progressBar.visibility = View.GONE
Toast.makeText(
applicationContext,
p0.exception?.message,
Toast.LENGTH_LONG
).show()
Log.e("TAG_P", "failure!", p0.exception)
}
}
})
}
приведенный выше код работает нормально.
теперь я пытаюсь войти в систему facebook, как показано ниже:
@SuppressLint("LongLogTag")
fun getUserProfile(token: AccessToken?, userId: String?) {
val parameters = Bundle()
parameters.putString(
"fields",
"id, first_name, middle_name, last_name, name, picture, email"
)
GraphRequest(token,
"/$userId/",
parameters,
HttpMethod.GET,
GraphRequest.Callback { response ->
val jsonObject = response.jsonObject
// Facebook Access Token
// You can see Access Token only in Debug mode.
// You can't see it in Logcat using Log.d, Facebook did that to avoid leaking user's access token.
if (BuildConfig.DEBUG) {
FacebookSdk.setIsDebugEnabled(true)
FacebookSdk.addLoggingBehavior(LoggingBehavior.INCLUDE_ACCESS_TOKENS)
}
accessToken = token.toString()
// Facebook Id
if (jsonObject.has("id")) {
val facebookId = jsonObject.getString("id")
Log.i("Facebook Id: ", facebookId.toString())
id = facebookId.toString()
} else {
Log.i("Facebook Id: ", "Not exists")
id = "Not exists"
}
// Facebook First Name
if (jsonObject.has("first_name")) {
val facebookFirstName = jsonObject.getString("first_name")
Log.i("Facebook First Name: ", facebookFirstName)
firstName = facebookFirstName
} else {
Log.i("Facebook First Name: ", "Not exists")
firstName = "Not exists"
}
// Facebook Middle Name
if (jsonObject.has("middle_name")) {
val facebookMiddleName = jsonObject.getString("middle_name")
Log.i("Facebook Middle Name: ", facebookMiddleName)
middleName = facebookMiddleName
} else {
Log.i("Facebook Middle Name: ", "Not exists")
middleName = "Not exists"
}
// Facebook Last Name
if (jsonObject.has("last_name")) {
val facebookLastName = jsonObject.getString("last_name")
Log.i("Facebook Last Name: ", facebookLastName)
lastName = facebookLastName
} else {
Log.i("Facebook Last Name: ", "Not exists")
lastName = "Not exists"
}
// Facebook Name
if (jsonObject.has("name")) {
val facebookName = jsonObject.getString("name")
Log.i("Facebook Name: ", facebookName)
name = facebookName
} else {
Log.i("Facebook Name: ", "Not exists")
name = "Not exists"
}
// Facebook Profile Pic URL
if (jsonObject.has("picture")) {
val facebookPictureObject = jsonObject.getJSONObject("picture")
if (facebookPictureObject.has("data")) {
val facebookDataObject = facebookPictureObject.getJSONObject("data")
if (facebookDataObject.has("url")) {
val facebookProfilePicURL = facebookDataObject.getString("url")
Log.i("Facebook Profile Pic URL: ", facebookProfilePicURL)
picture = facebookProfilePicURL
}
}
} else {
Log.i("Facebook Profile Pic URL: ", "Not exists")
picture = "Not exists"
}
// Facebook Email
if (jsonObject.has("email")) {
val facebookEmail = jsonObject.getString("email")
Log.i("Facebook Email: ", facebookEmail)
email = facebookEmail
} else {
Log.i("Facebook Email: ", "Not exists")
email = "Not exists"
}
openDetailsActivity()
}).executeAsync()
}
private fun openDetailsActivity() {
FirebaseInstallations.getInstance().getToken(true).addOnCompleteListener {
}
val myIntent = Intent(this, DetailsActivity::class.java)
myIntent.putExtra("facebook_id", id)
myIntent.putExtra("facebook_first_name", firstName)
myIntent.putExtra("facebook_middle_name", middleName)
myIntent.putExtra("facebook_last_name", lastName)
myIntent.putExtra("facebook_name", name)
myIntent.putExtra("facebook_picture", picture)
myIntent.putExtra("facebook_email", email)
myIntent.putExtra("facebook_access_token", accessToken)
startActivity(myIntent)
}
вход в систему завершается таким образом, и я перехожу в раздел «Подробная информация», и я вижу информацию из входа в Facebook
вот что я пытаюсь сделать сейчас
Я пытаюсь сохранить эти данные из Facebook так же, как они были сохранены, если пользователь использовал обычную регистрацию, я пытался использовать общую ссылку и таким же образом со страницы обычной регистрации многими способами, но я не смог этого сделать
«Я все еще изучаю Котлин (новичок), поэтому, пожалуйста, будьте терпеливы со мной, и если вы знаете, как решить эту проблему, пожалуйста, следуйте за мной шаг за шагом».
Заранее спасибо
Комментарии:
1. Что происходит не так, когда вы пытаетесь сохранить его внутри
SharedPreferences
? Можете ли вы поделиться этим кодом ?2. в первом коде есть «val SharedPreference = getSharedPreferences(«User_Data», Context.MODE_PRIVATE) редактор var = SharedPreference.edit() редактор.putString(«идентификатор пользователя», FirebaseAuth.getInstance().текущий пользователь!!.uid) редактор.putString(«идентификатор электронной почты», электронная почта) редактор.putString(«имя пользователя»,имя) редактор.putString(«пол»,пол) редактор.commit()» я хочу, чтобы используйте это также для сохранения входа в данные facebook, я не могу этого добиться
Ответ №1:
В своем коде вы используете editor.commit()
val sharedPreference = getSharedPreferences("User_Data", Context.MODE_PRIVATE)
var editor = sharedPreference.edit()
editor.putString("user_id", FirebaseAuth.getInstance().currentUser!!.uid)
editor.putString("email_id", email)
editor.putString("username",name)
editor.putString("gender",gender)
editor.commit()
Согласно документам, его рекомендуется использовать editor.apply()
, так как он записывает обновления на диск асинхронно. Подробнее
Вот фрагмент кода, который я использую в своем проекте.
private val preference: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(requireContext())
preference.edit()
.putString("KEY", "VALUE")
.putString("KEY", "VALUE")
.apply()
Комментарии:
1. Таблица «User_Data» работает нормально, я имел в виду, что хочу использовать ту же таблицу для сохранения данных facebook(второй код в моем вопросе)