android開發錯誤記錄

使用google的ExoPlayer神器時,試圖使用加密程序UUID來構造一個MediaDrm對象時,該設備不支持而報出的錯誤。我在模擬器上會遇到這個問題,換到真機就沒有問題了。

 com.google.android.exoplayer2.drm.UnsupportedDrmException: android.media.UnsupportedSchemeException: Failed to instantiate drm object.
        at com.google.android.exoplayer2.drm.FrameworkMediaDrm.newInstance(FrameworkMediaDrm.java:57)
        at com.devbrackets.android.exomedia.core.exoplayer.ExoMediaPlayer.generateDrmSessionManager(ExoMediaPlayer.java:543)
        at com.devbrackets.android.exomedia.core.exoplayer.ExoMediaPlayer.<init>(ExoMediaPlayer.java:154)
        at com.devbrackets.android.exomedia.core.audio.ExoAudioPlayer.<init>(ExoAudioPlayer.java:62)

MediaPlayer調用prepareAsync報錯IllegalStateException。然而在C++源碼中MediaPlayer爲null,但是java中MediaPlayer卻不爲null,所以會報這個錯誤。在MediaPlayer.release(),MediaPlayernull之後,release生效了,但是null卻沒有生效,所以我們只能加try…catch…進行解決嘍!在catch裏==null,然後再調用prepareAsync並播放。

C++代碼:
sp<MediaPlayer> mp = getMediaPlayer(env, thiz);  
    if (mp == NULL ) {  
        jniThrowException(env, "java/lang/IllegalStateException", NULL);  
        return false;  
    }  
java.lang.IllegalStateException
	at android.media.MediaPlayer.prepareAsync(Native Method)

在UncaughtExceptionHandler中接收日誌信息,然後開啓線程去上傳日誌,這個錯誤的原因就是app即將異常退出時,剛開啓的線程start,進程就殺死了,所以會報錯。解決辦法,不要在UncaughtExceptionHandler中開啓線程上傳日誌,選擇app重啓的時候再去上傳。

java.lang.InternalError: Thread starting during runtime shutdown

開啓下載任務去執行下載操作,報出這個錯誤,原因是DownloadTask類中,我定義了一個任務監聽Map集合,當在多個監聽在多線程中執行了修改操作之後就彙報這個錯,解決辦法是,在暫停、錯誤和完成後及時unRegister監聽器,有多個頁面包含下載的模塊,在退出界面時暫停當前頁面的所有下載任務。

java.util.ConcurrentModificationException

微信支付之後報的錯誤,原因是action if中有異常,解決既可。

java.lang.RuntimeException: Error receiving broadcast Intent { act=WEIXI_PAY_ACTION flg=0x800010 (has extras) } 

這個異常是由於類加載過程中靜態塊初始化過程失敗所導致的,一般情況是初始化過程發生了異常,導致初始化失敗所致。

 java.lang.ExceptionInInitializerError

NoClassDefFoundError錯誤的發生,是因爲Java虛擬機在編譯時能找到合適的類,而在運行時不能找到合適的類導致的錯誤。例如在運行時我們想調用某個類的方法或者訪問這個類的靜態成員的時候,發現這個類不可用,此時Java虛擬機就會拋出NoClassDefFoundError錯誤。我的代碼中是由於混淆問題所致。

 java.lang.NoClassDefFoundError:

剛買了個vivox21,興高采烈的插了電腦上就想跑一下自己的項目,結果,安裝失敗,一臉的矇蔽。結果查到只要在gradle.properties中加入android.injected.testOnly=false就可以了。

Installation failed with message INSTALL_FAILED_TEST_ONLY;

一般都是解壓時候ZipFile會對數據做長度的校驗;如果不一致就會出現這個問題;這個原因一般有可能是壓縮包的問題;如果採用ZipInputStream會報IO異常, 可能在mac和iOS設備上解壓沒有這個問題;但是在android設備上會出現。一般重新生成一下壓縮包可以解決這個問題

 java.io.IOException: Size mismatch on inflated file: 524288 vs 983040

更新了最新的NDK與cmake,報出了一下的錯誤,解決辦法將gradle中cmake abiFilters配置改爲:abiFilters ‘x86’, ‘x86_64’,‘arm64-v8a’, ‘armeabi-v7a’
Google NDK r18解釋: Support for ARMv5 (armeabi), MIPS, and MIPS64 has been removed. Attempting to build any of these ABIs will result in an error.

abis [mips64, armeabi, mips] are not supported for platform. supported abis are [armeabi-v7a, arm64-v8a, x86, x86_64].

android8.0中,google將靜態註冊廣播的方式給刪除了,靜態註冊廣播不再生效。解決方式就是使用動態註冊廣播的方式去實現。

android8.0測試,靜態廣播沒有效果

fragment中添加:
@Override
public void onCreate(Bundle savedInstanceState) {
setRetainInstance(true);
super.onCreate(savedInstanceState);
}

FragmentManager fragmentManager = getChildFragmentManager();
FragmentTransaction beginTransaction = fragmentManager.beginTransaction();
beginTransaction.replace(R.id.fl_frame, casePlayBackFragment,fragmentTag);
beginTransaction.addToBackStack(fragmentTag);
beginTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
beginTransaction.commit();

java.lang.IllegalStateException: Failure saving state: active StatisticalQuestionFragment{126ad2c} has cleared index: -1

解決方案如下:
try { if (wakeLock != null&&wakeLock.isHeld()) wakeLock.release(); } catch (Exception ex) { ex.printStackTrace(); }

java.lang.RuntimeException: WakeLock under-locked

我把項目從mac上備份到Windows上,用AS打開就報出了這個錯誤。解決方法就是:File-Project Structure->選擇本地與mac上相同的jdk版本。重新clear一下工程,就OK了。

Intellij IDEA錯誤“CreateProcess error=2, 系統找不到指定的文件”完美解決

項目中有奔潰日誌傳回,報了android.os.TransactionTooLargeException異常,原因是fragment保存數據太多,並超過1M造成。解決方案:https://github.com/livefront/bridge/issues
還有這篇博客:https://medium.com/@mdmasudparvez/android-os-transactiontoolargeexception-on-nougat-solved-3b6e30597345

java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 540736 bytes
	at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4042)
	at android.os.Handler.handleCallback(Handler.java:761)
	at android.os.Handler.dispatchMessage(Handler.java:98)
	at android.os.Looper.loop(Looper.java:156)
	at android.app.ActivityThread.main(ActivityThread.java:6605)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:999)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:889)
Caused by: android.os.TransactionTooLargeException: data parcel size 540736 bytes
	at android.os.BinderProxy.transactNative(Native Method)
	at android.os.BinderProxy.transact(Binder.java:617)
	at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3632)
	at android.app.ActivityThread$StopInfo.run(ActivityThread.java:4034)
	... 7 more

項目中收到了一個crash信息,是後臺所傳的json有問題所致,爲了下次不至於奔潰,在Gson解析器中要判斷是否爲JsonObject,如下代碼所示:

public class BaseInfoDeserializer implements JsonDeserializer<BaseInfo> {
    @Override
    public BaseInfo deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        BaseInfo baseInfo = new BaseInfo();
        if (json != null && json instanceof JsonObject) {
            JsonObject jsonObject = json.getAsJsonObject();
            baseInfo.setCode(jsonObject.get("Code").getAsString());
            baseInfo.setMsg(jsonObject.get("Msg").getAsString());
            JsonElement data = jsonObject.get("Data");
            if (data != null && data.isJsonObject()) {
                baseInfo.setData(data.getAsJsonObject());
            } else {
                baseInfo.setData(null);
            }
        }
        return baseInfo;
    }
}
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Not a JSON Object: "<html>"
	at com.google.gson.Gson.fromJson(Gson.java:900)
	at com.google.gson.Gson.fromJson(Gson.java:853)
	at com.google.gson.Gson.fromJson(Gson.java:802)
	at com.google.gson.Gson.fromJson(Gson.java:774)
	at com.wanhe.eng100.listening.utils.GsonUtil.json2Bean(GsonUtil.java:27)
	at com.wanhe.eng100.listening.pro.question.presenter.SubmitRecordPresenter$8.onSuccess(SubmitRecordPresenter.java:324)
	at com.lzy.okgo.cache.policy.NoCachePolicy$1.run(NoCachePolicy.java:43)
	at android.os.Handler.handleCallback(Handler.java:808)
	at android.os.Handler.dispatchMessage(Handler.java:101)
	at android.os.Looper.loop(Looper.java:166)
	at android.app.ActivityThread.main(ActivityThread.java:7425)
	at java.lang.reflect.Method.invoke(Method.java)
	at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
Caused by: java.lang.IllegalStateException: Not a JSON Object: "<html>"
	at com.google.gson.JsonElement.getAsJsonObject(JsonElement.java:91)
	at com.wanhe.eng100.listening.bean.gson.BaseInfoDeserializer.deserialize(BaseInfoDeserializer.java:32)
	at com.wanhe.eng100.listening.bean.gson.BaseInfoDeserializer.deserialize(BaseInfoDeserializer.java:21)
	at com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:69)
	at com.google.gson.TypeAdapter$1.read(TypeAdapter.java:199)
	at com.google.gson.Gson.fromJson(Gson.java:888)
	... 13 more

RecyclerView在部分機型中遇到這個錯誤,解決版本就是重寫LinearLayoutManger 在onLayoutChildren方法中捕獲異常。

   @Override  
    public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {  
        try {  
            super.onLayoutChildren(recycler, state);  
        } catch (IndexOutOfBoundsException e) {  
            e.printStackTrace();  
        }  
    }  
    
java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid view holder adapter positionViewHolder{14a87e26 position=5 id=-1, oldPos=-1, pLpos:-1 no parent} 

發生這個錯誤時由於webview一直開啓着硬件加速的原因,加入以下代碼可以解決:

if (Build.VERSION.SDK_INT >= 19) // KITKAT
{
mWebView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}

java.util.concurrent.TimeoutException: android.view.ThreadedRenderer.finalize() timed out after 10 seconds
	at android.view.ThreadedRenderer.nDeleteProxy(Native Method)
	at android.view.ThreadedRenderer.finalize(ThreadedRenderer.java:959)
	at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:253)
	at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:240)
	at java.lang.Daemons$Daemon.run(Daemons.java:103)
	at java.lang.Thread.run(Thread.java:784)

使用kotlin的項目中加入glide,加上apply plugin: 'kotlin-kapt’時,就報錯了這個錯誤,經過嘗試,我刪掉apply plugin: ‘kotlin-kapt’,編譯,然後加上它,再次編譯,就不會有這個錯誤了。

Folder app/build/generated/source/kaptKotlin/debug
Folder app/build/generated/source/kaptKotlin/release

今天NDK項目中使用了Bitmap.h頭文件,結果編譯找不到已使用Bitmap.h中的一些類,經過查找需要加入在CMakeLists.txt中配置jnigraphics。

error: undefined reference to 'AndroidBitmap_getInfo'

error: undefined reference to 'AndroidBitmap_lockPixels'

error: undefined reference to 'AndroidBitmap_unlockPixels'

JsonReader jsonReader = new JsonReader(new StringReader(json));
jsonReader.setLenient(true);
在調用fromJson方法之前調用這兩段代碼即可解決。

com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 12 path $

選擇頭像時報錯,更改獲取圖片Uri方法,我將Environment.getExternalStorageDirectory()改爲Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)。

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=160, result=-1, data=Intent { dat=content://media/external/images/media/736476 flg=0x1 (has extras) }} to activity {com.wanhe.eng100.listening/com.wanhe.eng100.listening.pro.mine.MineInfoEditActivity}: java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/999/Tencent/QQ_Images/null-7968772d663cc099.jpg

之前開發合併了項目,今天我需要分離開一個moudle成爲獨立項目,可是報錯頻頻發生,各種奇葩的問題,經過我一番思索後發現沒有判斷從主moudle中移除要分離的moudle。判斷之後一切OK!

因此在Android P 使用HttpUrlConnection進行http請求會出現以下異常:
W/System.err: java.io.IOException: Cleartext HTTP traffic to **** not permitted
使用OKHttp請求則出現:
java.net.UnknownServiceException: CLEARTEXT communication ** not permitted by network security policy

android9.0 app不能訪問網絡,解決方法有三種:
1、APP改用https請求
2、targetSdkVersion 降到27以下
3、在 res 下新增一個 xml 目錄,然後創建一個名爲:network_security_config.xml 文件(名字自定) ,內容如下,大概意思就是允許開啓http請求

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>
//然後在APP的AndroidManifest.xml文件下的application標籤增加以下屬性
<application
...
 android:networkSecurityConfig="@xml/network_security_config"
...
/>

適配完android9.0網絡問題之後,發現流量app訪問服務器巨慢無比,經過一番測試,最後發現是服務器開啓了ipv6解析,通過和服務器溝通,爲android端開啓了另一個只解析ipv4的域名,使用之後一切nice。

androidstudio一直顯示 Indexing paused due to batch updated,不斷地loading。

解決辦法,退出項目界面,在其他項目界面Open項目,就沒問題了!

java.net.UnknownServiceException: CLEARTEXT communication to 10.0.2.2 not permitted by network security policy

這是因爲新的保護機制對於僅使用安全通信的應用,Android 6.0 Marshmallow(API 級別 23)引入了兩種機制來解決回退到明文通信的問題:(1) 在生產/安裝庫中,禁止明文通信,以及 (2) 在開發/QA 期間,在遇到任何非 TLS/SSL 通信時,予以記錄或者觸發崩潰。下文將更詳細地介紹這兩種機制。解決方法:如果一定要使用明文通信的話,則可以打開AndroidManifest.xml 文件,在 application 元素中添加:android:usesCleartextTraffic="true"如果聲明不使用明文通信,則可以在application元素中添加:android:usesCleartextTraffic=“false”

Manifest merger failed with multiple errors

清單文件合併衝突,有兩種情況。
第一種:清單文件Application屬性衝突。
解決方式: Application節點加入tools:replace=“android:icon,android:theme”
第二種:minSdkVersion或者targetSdkVersion不一致。
解決方式:統一minSdkVersion和targetSdkVersion


> Can not perform this action after onSaveInstanceState錯誤終極解決方案

Can not perform this action after onSaveInstanceState
@Override
public void onBackPress(){
	//這行代碼可以解決這個問題
	onStateNotSaved();
	super.onBackPress();
}

使用FragmentDialog時報出Can not perform this action after onSaveInstanceState錯誤,解決方案:

顯示FragmentDialog:
       transaction.add(realQuestionDialog, "realQuestionDialog");
       transaction.commitNowAllowingStateLoss();
隱藏FragmentDialog:
	dismissNowAllowingStateLoss();

使用過濾表情、特殊符號的方法,出現如下錯誤:

java.lang.IndexOutOfBoundsException: setSpan (0 ... 1) ends beyond length 0
    at android.text.SpannableStringInternal.checkRange(SpannableStringInternal.java:436)
    at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:163)
    at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:152)
    at android.text.SpannableString.setSpan(SpannableString.java:46)
    at android.text.TextUtils.copySpansFrom(TextUtils.java:1080)
    at com.wanhe.eng100.base.utils.o.filter(InputUtils.java:7)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:514)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:504)
    at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:502)
    at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:863)
    at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:627)
    at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:396)
    at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:192)
    at android.app.ActivityThread.main(ActivityThread.java:6800)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:825)

> 解決方案:
> 將EditText的InputType改爲:textNoSuggestions

app點擊home鍵退出,然後再點擊app圖標,發現app重啓了。
解決方案如下:

> 在app啓動的第一個界面中加入:
    if((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0){
            finish();
            return;
        }

然後在AndroidManifest.xml中找到啓動的第一個activity,配置:
android:alwaysRetainTaskState="true"

錯誤:Caused by: java.lang.NullPointerException: Attempt to invoke virtual method boolean androidx.fragment.app.FragmentManagerImpl.isDestroyed()’ on a null object reference
出現這個錯誤,如果你在Fragment中這樣寫,那麼解決錯誤,只需要去掉如下onDetach()方法中的代碼。

@Override
public void onDetach() {
    super.onDetach();
    try {
        Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
        childFragmentManager.setAccessible(true);
        childFragmentManager.set(this, null);

    } catch (NoSuchFieldException e) {
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

在5.0中,com.internal.R.string.config_webViewPackageName的值被獲取出來是: com.google.android.webview,也就是chrome內核。在5.1以及以上的版本中,com.internal.R.string.config_webViewPackageName的值被獲取出來是: com.android.webview, 也就是webkit內核。

android.content.res.Resources$NotFoundException: String resource ID #0x2040003
    at android.content.res.Resources.getText(Resources.java:318)
    at android.content.res.VivoResources.getText(VivoResources.java:123)
    at android.content.res.Resources.getString(Resources.java:404)
    at com.android.org.chromium.content.browser.ContentViewCore.setContainerView(ContentViewCore.java:694)
    at com.android.org.chromium.content.browser.ContentViewCore.initialize(ContentViewCore.java:618)
    at com.android.org.chromium.android_webview.AwContents.createAndInitializeContentViewCore(AwContents.java:631)
    at com.android.org.chromium.android_webview.AwContents.setNewAwContents(AwContents.java:780)
    at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:619)
    at com.android.org.chromium.android_webview.AwContents.<init>(AwContents.java:556)
    at com.android.webview.chromium.WebViewChromium.initForReal(WebViewChromium.java:312)
    at com.android.webview.chromium.WebViewChromium.access$100(WebViewChromium.java:96)
    at com.android.webview.chromium.WebViewChromium$1.run(WebViewChromium.java:264)
    at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.drainQueue(WebViewChromium.java:123)
    at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue$1.run(WebViewChromium.java:110)
    at com.android.org.chromium.base.ThreadUtils.runOnUiThread(ThreadUtils.java:144)
    at com.android.webview.chromium.WebViewChromium$WebViewChromiumRunQueue.addTask(WebViewChromium.java:107)
    at com.android.webview.chromium.WebViewChromium.init(WebViewChromium.java:261)
    at android.webkit.WebView.<init>(WebView.java:554)
    at android.webkit.WebView.<init>(WebView.java:489)
    at android.webkit.WebView.<init>(WebView.java:472)
    at android.webkit.WebView.<init>(WebView.java:459)
    at android.webkit.WebView.<init>(WebView.java:449)
    at com.wanhe.eng100.base.view.ProgressWebView.<init>(ProgressWebView.java:1)
    at com.wanhe.eng100.base.ui.web.LoadNoToolbarWebActivity.A(LoadNoToolbarWebActivity.java:6)
    at com.wanhe.eng100.base.ui.web.LoadNoToolbarWebActivity.a(LoadNoToolbarWebActivity.java:1)
    at com.wanhe.eng100.base.ui.web.LoadNoToolbarWebActivity$a.run(LoadNoToolbarWebActivity.java:1)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5418)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1037)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)

錯誤解決方案:

public class LollipopFixedWebView extends WebView {
    public LollipopFixedWebView(Context context) {
        super(getFixedContext(context));
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs) {
        super(getFixedContext(context), attrs);
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(getFixedContext(context), attrs, defStyleAttr);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(getFixedContext(context), attrs, defStyleAttr, defStyleRes);
    }

    public LollipopFixedWebView(Context context, AttributeSet attrs, int defStyleAttr, boolean privateBrowsing) {
        super(getFixedContext(context), attrs, defStyleAttr, privateBrowsing);
    }

    public static Context getFixedContext(Context context) {
        if (Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23) // Android Lollipop 5.0 & 5.1
            return context.createConfigurationContext(new Configuration());
        return context;
    }
}
發佈了94 篇原創文章 · 獲贊 40 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章