我正在使用 twitter4j 将我的应用链接到 twitter 功能。 我写了如下代码。
private const val CONSUMER_KEY = <my consumer key>
private const val CONSUMER_SECRET = <my consumer secret>
private const val CALLBACK_URL = "callback://"
class Twitter : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_twitter, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
view.findViewById<Button>(R.id.twitter).setOnClickListener {
if (PreferenceAccess.getTwitterAccessToken().first == "") {
getRequestToken()
} else {
// Do Something using access token
}
}
}
lateinit var twitter: Twitter
private fun getRequestToken(){
viewLifecycleOwner.lifecycleScope.launch(Default){
val builder = ConfigurationBuilder()
.setDebugEnabled(true)
.setOAuthConsumerKey(CONSUMER_KEY)
.setOAuthConsumerSecret(CONSUMER_SECRET)
val config = builder.build()
val factory = TwitterFactory(config)
twitter = factory.instance
try{
val requestToken = twitter.oAuthRequestToken
withContext(Main){
setupTwitterWebviewDialog(requestToken.authorizationURL)
}
} catch (e: IllegalStateException) {
Log.e("ERROR: ", e.toString())
}
}
}
lateinit var twitterDialog: Dialog
@SuppressLint("SetJavaScriptEnabled")
private fun setupTwitterWebviewDialog(url: String){
twitterDialog = Dialog(requireContext())
val webView = WebView(requireContext())
webView.isVerticalScrollBarEnabled = false
webView.isHorizontalScrollBarEnabled = false
webView.webViewClient = TwitterWebViewClient()
webView.settings.javaScriptEnabled = true
webView.loadUrl(url)
twitterDialog.setContentView(webView)
twitterDialog.show()
}
inner class TwitterWebViewClient : WebViewClient() {
override fun shouldOverrideUrlLoading(
view: WebView?,
request: WebResourceRequest?
): Boolean {
if (request?.url.toString().startsWith(CALLBACK_URL)) {
Log.d("Authorization URL: ", request?.url.toString())
handleUrl(request?.url.toString())
if (request?.url.toString().contains(CALLBACK_URL)) {
twitterDialog.dismiss()
}
return true
}
return false
}
private fun handleUrl(url: String) {
val uri = Uri.parse(url)
val oauthVerifier = uri.getQueryParameter("oauth_verifier") ?: ""
viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Default) {
val accToken = withContext(Dispatchers.IO) {
twitter.getOAuthAccessToken(oauthVerifier)
}
PreferenceAccess.saveTwitterAccessToken(accToken.token, accToken.tokenSecret)
Log.i("token----------", accToken.token)
Log.i("token secret---", accToken.tokenSecret)
getUserProfile()
}
}
private suspend fun getUserProfile(){
val usr = withContext(Dispatchers.IO){ twitter.verifyCredentials() }
Log.i("twitter", usr.name)
Log.i("twitter", usr.screenName)
}
}
}
当我在模拟器上运行时,上述编码工作得很好,但在我将应用发布到 google play 商店后,我发现在 google play 控制台上发生了以下崩溃。
java.lang.AssertionError:
at twitter4j.conf.ConfigurationContext.<clinit> (ConfigurationContext.java:38)
at twitter4j.conf.ConfigurationContext.getInstance (ConfigurationContext.java)
at twitter4j.TwitterFactory.<clinit> (TwitterFactory.java)
at com.xxxx.xxxx.Twitter$getRequestToken$1.invokeSuspend (Twitter.java)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (BaseContinuationImpl.java)
at kotlinx.coroutines.DispatchedTask.run (DispatchedTask.java)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely (CoroutineScheduler.java)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask (CoroutineScheduler.java)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker (CoroutineScheduler.java)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run (CoroutineScheduler.java)
Caused by: java.lang.ClassNotFoundException:
at java.lang.Class.classForName (Native Method)
at java.lang.Class.forName (Class.java:454)
at java.lang.Class.forName (Class.java:379)
at twitter4j.conf.ConfigurationContext.<clinit> (ConfigurationContext.java:8)
at twitter4j.conf.ConfigurationContext.getInstance (ConfigurationContext.java)
at twitter4j.TwitterFactory.<clinit> (TwitterFactory.java)
at com.xxxxx.xxxxx.Twitter$getRequestToken$1.invokeSuspend (Twitter.java)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (BaseContinuationImpl.java)
at kotlinx.coroutines.DispatchedTask.run (DispatchedTask.java)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely (CoroutineScheduler.java)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask (CoroutineScheduler.java)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker (CoroutineScheduler.java)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run (CoroutineScheduler.java)
我不知道为什么会发生此错误。 非常感谢您的帮助。