Я использую функцию входа в систему через 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()
находится в SignInFragment
.И SignInFragment
принадлежит MainActivity
.Итак, я подумал, что activity!!
должно работать.Но это не так.Я пробовал с applicationContext
и baseContext
, но они тоже не работают.
Если я удаляю activity!!.isFinishing
.Я получаю эту ошибку:
Parameter specified as non-null is null: method kotlin.jvm.internal.Intrinsics.checkParameterIsNotNull, parameter savedInstanceState
Как я могу ее решить?