Я хочу реализовать Linkedin в новом знаке в Api v2, поэтому я хотел сделать для него отдельное действие, чтобы запускать его из любого места, где с помощью startActiivtyForResult () это действие является LinkedActivity, затем, когда LinkedActivity запускается, я вызываю представление действия Intent для создания Oauth2.для linkedin v2 api, поэтому, когда он возвращается и заканчивает получать запрошенные данные, я завершаю эту операцию и возвращаюсь туда, где я был в первый раз, когда я получал данные в onActivityResult, мой результат всегда отменяется, а обратное намерение равно NULL!Я искал некоторые подобные случаи или пытался отладить свой код в операции с активами, у returnintent есть дополнения, и все, что мне нужно, это мой код для завершения операции с кодами для результата
class LinkedActivity : AppCompatActivity() {
private lateinit var linkedInAuth: LinkedInAuth
private var email = ""
private var firstname = ""
private var lastname = ""
private var userId = ""
private var accessToken = ""
private val linkedInAuthUrl =
"$authorizationUrl?response_type=code&client_id=$clinetId&redirect_uri=$redirectLink&scope=r_liteprofile,r_emailaddress"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_linked)
if (intent.action == null) {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(linkedInAuthUrl))
startActivity(intent)
}
}
override fun onResume() {
super.onResume()
if (intent.data != null) {
val uri = intent.data
if (uri != null && uri.toString().startsWith(redirectLink)) {
val code = uri.getQueryParameter("code")!!
linkedInAuth = getRetrofitInstanse(LinkedInAuth.AUTH_URL).create(LinkedInAuth::class.java)
val authTokenReq =
linkedInAuth.getAccessToken(LinkedInAuth.GRANT_TYPE, code, redirectLink, clinetId, clinetSecrect)
authTokenReq.enqueue(object : Callback<LinkedinAccessTokenResponse> {
override fun onResponse(
call: Call<LinkedinAccessTokenResponse>, response: Response<LinkedinAccessTokenResponse>
) {
if (response.isSuccessful) {
val result: LinkedinAccessTokenResponse? = response.body()
if (result != null) {
accessToken = result.accessToken
fetchBasicProfileData(accessToken)
}
}
}
override fun onFailure(call: Call<LinkedinAccessTokenResponse>, t: Throwable) {
t.printStackTrace()
}
})
}
}
}
/**
* method to fetch basic profile data
*/
private fun fetchBasicProfileData(accessToken: String) {
linkedInAuth = getRetrofitInstanse(LinkedInAuth.BASE_URL).create(LinkedInAuth::class.java)
val profileLiteRequest = linkedInAuth.getProfileData(LinkedInAuth.PROJECTION, "Bearer $accessToken")
profileLiteRequest.enqueue(object : Callback<LinkedInLiteProfileResponse> {
override fun onResponse(
call: Call<LinkedInLiteProfileResponse>, response: Response<LinkedInLiteProfileResponse>
) {
if (response.isSuccessful) {
val result: LinkedInLiteProfileResponse? = response.body()
if (result != null) {
firstname = result.firstName?.localized?.enUS!!
lastname = result.lastName?.localized?.enUS!!
userId = result.id!!
Log.d(TAG, "$firstname $lastname $userId")
getEmail()
}
}
}
override fun onFailure(call: Call<LinkedInLiteProfileResponse>, t: Throwable) {
t.printStackTrace()
}
})
}
fun getEmail() {
val emailRequest = linkedInAuth.getEmaillAddress("members", "(elements*(handle~))", "Bearer $accessToken")
emailRequest.enqueue(object : Callback<EmailResponse> {
override fun onResponse(call: Call<EmailResponse>, response: Response<EmailResponse>) {
if (response.isSuccessful) {
val result: EmailResponse? = response.body()
if (result != null) {
email = result.elements[0].emailHandle?.email!!
Log.d(TAG, email)
val returnIntent = Intent()
returnIntent.putExtra("user_id", userId)
returnIntent.putExtra("first_name", firstname)
returnIntent.putExtra("last_name", lastname)
returnIntent.putExtra("user_email", email)
setResult(Activity.RESULT_OK, returnIntent)
finish()
}
}
}
override fun onFailure(call: Call<EmailResponse>, t: Throwable) {
t.printStackTrace()
}
})
}
companion object {
private val TAG = LinkedActivity::class.java.simpleName
private val clinetId = ""
private val clinetSecrect = ""
private val redirectLink = "https://signin-linkedin.com/auth/callback"
private val authorizationUrl = "https://www.linkedin.com/oauth/v2/authorization"
}
}
, и это моя модернизацияинтерфейс
interface LinkedInAuth {
@FormUrlEncoded
@POST("accessToken")
fun getAccessToken(
@Field("grant_type") grantType: String,
@Field("code") code: String,
@Field("redirect_uri") redirectUrl: String,
@Field("client_id") clientId: String,
@Field("client_secret") clientSecret: String
): Call<LinkedinAccessTokenResponse>
@GET("me")
fun getProfileData(
@Query("projection") projection: String, @Header("Authorization") authorization: String
): Call<LinkedInLiteProfileResponse>
@GET("emailAddress")
fun getEmaillAddress(
@Query("q") query: String, @Query("projection") projection: String,
@Header("Authorization") authorization: String
): Call<EmailResponse>
companion object {
const val AUTH_URL = "https://www.linkedin.com/oauth/v2/"
const val BASE_URL = "https://api.linkedin.com/v2/"
const val GRANT_TYPE = "authorization_code"
const val PROJECTION = "(id,firstName,lastName,profilePicture(displayImage~:playableStreams))"
}
}
fun getRetrofitInstanse(baseUrl: String): Retrofit {
val httpLoggingInterceptor = HttpLoggingInterceptor()
httpLoggingInterceptor.level = HttpLoggingInterceptor.Level.BODY
val okhttpClient = OkHttpClient.Builder()
.addInterceptor(httpLoggingInterceptor)
.readTimeout(120, TimeUnit.SECONDS)
.connectTimeout(120, TimeUnit.SECONDS)
.writeTimeout(120, TimeUnit.SECONDS)
.build()
return Retrofit.Builder()
.client(okhttpClient)
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build()
}
data class LinkedinAccessTokenResponse(
@SerializedName("access_token") val accessToken: String,
@SerializedName("expires_in") val expiresIn: String
)
, и именно здесь я получаю свой результат, когда он возвращается с нулевым значением и результат отменяется
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_CANCELED && requestCode != PICK_FILE)
dialog.showErrorDialog(getString(R.string.fetch_data_error))
if (requestCode == RC_FB_SIGN_IN)
if (resultCode == RESULT_OK) {
socialProvider = "facebook"
updateUiFromSocial(data)
}
if (requestCode == RC_GPLUS_SIGN_IN)
if (resultCode == RESULT_OK) {
socialProvider = "google"
updateUiFromSocial(data)
}
if (requestCode == RC_LNKD_SIGN_IN)
if (resultCode == RESULT_OK) {
socialProvider = "linkedin"
updateUiFromSocial(data)
}
}
ОБНОВЛЕНИЕ
приизменение onResume () на onNewIntent () и превращение режима запуска LinkedActivity в одну вершину каждый раз работает просто отлично