targetSdkVersion 設定成 API 28 之後噴出的兩個 RuntimeException 處理

小蛙在更新「我的股票精算師」的時候沒辦法上傳 apk 到 Play 商店,錯誤提示 targetSdkVersion 要從 26 提高到 28,小蛙照做之後,卻又得到這個錯誤「java.lang.RuntimeException: Stub!」及「android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?」,記錄一下解決方法。

java.lang.RuntimeException: Stub!

看 stacktrace 裡面是用到 HttpGet 這個 function,可能在 Android 9 之後拿掉了,因此報這個錯誤。解決的方法參考這篇:Behavior changes: apps targeting API level 28+

qzh2CSts4UVD7pKzwgin Byo5nLWGaGSjbh7YMgh jD1Xl5botiL rXcwFBD5aosLyB8me9Nhg2kx92ntv5pdYdOlYcYUzbcyYKNwLz8iSOukoRSksHvQANWfNCyZEhbiEX7nMOt2O1TIqIy1pcp4rGTCpGpBBb4N AA XaHGL3b4aQuiaUD9Nbqj wyRGiPUkvrCNWc5UaltBcLf8VI4xPIy61dq 5gPLdLGm71ACsEiuhjcH RDGlEowEEu 2wIDQkcW9usCIlTxibwGmZvz7XEEEukUvV8FvFfbZc3oOR2AASzFIakscArvqQ VLprovUv9os1hGTqKKM9PGu4iBrqFc5ndmVacxqqAyGRH0HjmCUeWNDy8S4W0HxuZ81LEteQwxELQsnY5ADJ1i xzUHvXZU9 dBqadrCjEA3g720rWsz JgtUsWFn2QBijSOK2Di9HMH6r7gEWanqKUR3EYz0lRg5 H77Auol0Udncl8jYMfCJff1GC8k0LO1AWn M CvIoMSaL9OERGMfSmOdbXfHj07EtmZjdrJx8Gibcp z yU8AfMH 698DjyoxiVcH zZQhLvvdF7mgsWJMmmYYkgCmn6FIjnRhqMwqUG 4Y672n48nrgCipHRhgDiMtQ s8U21rj2bCDDqQ jShcxicQSsKNl9 Olag42C0cW5EaBT6m9UkjvxRIKu QxmbEPJaYmI0x8AqYt j iY1oroBCpFN8rRQ46ETZReyNcuTL=w884 h488 no targetSdkVersion 設定成 API 28 之後噴出的兩個 RuntimeException 處理

根據官方文件,只要在 AndroidManifest.xml 裡面加入

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

要加在哪裡呢?加在 <application> 的標籤下面就可以了

<application>
  ...
  <uses-library android:name="org.apache.http.legacy" android:required="false"/>
  ...
</application>

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

這個問題呢是小蛙加入了 CustomTabsIntent 如果在 API 26 的時候編譯跟執行都沒有任何問題,更新到 API 28 之後一點就噴上面的錯誤,Google 了一下發現只要加入錯誤提示裡面的 flag 就可以了,修改的方式如下

CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder();
CustomTabsIntent customTabsIntent = builder.build();        
// 只要加入這行就可以了
customTabsIntent.intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
customTabsIntent.launchUrl(getApplicationContext(), Uri.parse(url));

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

    這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料