android开发错误记录

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xy1213236113/article/details/80204346

使用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"
展开阅读全文

没有更多推荐了,返回首页