намерение действия вид внутри начального действия для результата для реализации входа Linkedin в API v2 с Oauth - PullRequest
0 голосов
/ 13 февраля 2019

Я хочу реализовать 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 в одну вершину каждый раз работает просто отлично

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...