Twitter4j 在模拟器上运行良好,但发布后崩溃ClassNotFoundException

问题描述

我正在使用 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)

我不知道为什么会发生此错误。 非常感谢您的帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)