Пользовательский диалог имеет контекстную ошибку во фрагменте - PullRequest
0 голосов
/ 30 мая 2019

Я использую функцию входа в систему через Instagram.

Похоже, мне нужно открыть WebView и затем получить маркер доступа.

это документ Instagram

Я пытаюсь показать диалог, в котором есть WebView.И тогда, если пользователь войдет / авторизуется, URL содержит access-token.И я хочу вставить его в свое приложение и сохранить.

Вот что я реализовал.

SignInFragment.kt

    override fun signInInstagram() {
        Timber.d("signInInstagram()")
        if (activity!!.isFinishing) {
            authDialog = AuthenticationDialog(activity!!, this)
            authDialog.setCancelable(true)
            authDialog.show()
        } else {
            Timber.d("No Activity")
            Toast.makeText(activity, "No Activity", Toast.LENGTH_SHORT).show()
        }
    }
class AuthenticationDialog(context: Context, var listener: AuthenticationListener) : Dialog(context) {
    private var webView: WebView? = null

    //    private final String url = "https://naver.com";

    private val url = "${Constants.INSTAGRAM_URL}oauth/authorize/" +
                    "?client_id=${Constants.CLIENT_ID}" +
                    "&redirect_uri=${Constants.REDIRECT_URI}" +
                    "&response_type=token" +
                    "&display=touch&scope=public_content"

    init {
        if (BuildConfig.DEBUG) {
            Timber.plant(Timber.DebugTree())
            Timber.d("start")
        }
    }

    override fun onCreate(savedInstanceState: Bundle) {
        super.onCreate(savedInstanceState)
        this.setContentView(R.layout.dialog_insta_auth)
        Timber.d("url:${url}")

        initializeWebView()
    }

    private fun initializeWebView() {
        webView = findViewById(R.id.web_view)
        webView!!.loadUrl(url)
        webView!!.webViewClient = object : WebViewClient() {

            var authComplete = false
            var access_token: String? = null

            override fun onPageStarted(view: WebView, url: String, favicon: Bitmap) {
                super.onPageStarted(view, url, favicon)
            }

            override fun onPageFinished(view: WebView, url: String) {
                super.onPageFinished(view, url)

                if (url.contains("#access_token=") && !authComplete) {
                    val uri = Uri.parse(url)
                    access_token = uri.encodedFragment
                    Timber.d("access token: ${access_token}")
                    // get the whole token after the '=' sign
                    access_token = access_token!!.substring(access_token!!.lastIndexOf("=") + 1)
                    Log.i("", "CODE : " + access_token!!)
                    authComplete = true
                    listener.onCodeReceived(access_token!!)
                    dismiss()

                } else if (url.contains("?error")) {
                    Toast.makeText(context, "Error Occured", Toast.LENGTH_SHORT).show()
                    dismiss()
                }
            }
        }
    }
}

public class Constants {
    companion object {
        // Instagram
        const val INSTAGRAM_URL = "https://api.instagram.com/"
        const val CLIENT_ID = "xxxxxxxxxxxxxxxx"
        const val REDIRECT_URI = "https://www.instagram.com/"
    }
}

Однако,проблема в том, что я получаю ОШИБКУ, потому что контекст кажется неверным.signInInstagram() находится в SignInFragmentSignInFragment принадлежит MainActivity.Итак, я подумал, что activity!! должно работать.Но это не так.Я пробовал с applicationContext и baseContext, но они тоже не работают.

Если я удаляю activity!!.isFinishing.Я получаю эту ошибку:

Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState

Как я могу ее решить?

...