Android 问题汇总

开发中遇到的问题

记录在实际开发中遇到的问题及心得

自定义注解反射

当使用自定义注解同时使用反射获取属性值时,Field. isAnnotationPresent 判断此属性是否存在注解,如果isAnnotationPresent 方法一直返回false 可以查看下自定义注解中是否添加:
@Retention(RetentionPolicy.RUNTIME) 【表示运行时存在】

##ADB 调度使用
在这里插入图片描述
遇到这种情况,直接在活动监视器中杀掉ADB重新启动就可,亲测可行:
在这里插入图片描述

Android多module下重复jar包问题

对于module 添加如下操作
// implementation fileTree(include: [‘*.jar’], dir: ‘libs’)
provided files(‘libs/utiltool.jar’)
第一行是去掉gradle自动扫描libs目录下的jar,第二行是以provided的方式参与编译

白屏体验时android体验的克星

1.在首启动的引导页或者广告页的activity的style加入以下代码

true
true

SO文件size = 0

java.lang.UnsatisfiedLinkError: dlopen failed: file offset for the library “/data/app/com.beiya.littletraveler-1/lib/arm/***.so” file size =0>

解决办法:查看**.so的大小是否为空

gradle 更新失败问题

修改build.gradle 中的repositories 与allprojects部分修改如下:

buildscript {
dependencies {
classpath ‘com.android.tools.build:gradle:3.5.1’
}

repositories {


    maven { url'https://maven.aliyun.com/repository/public/' }
    maven { url'https://maven.aliyun.com/repository/google/' }
    maven { url'https://maven.aliyun.com/repository/jcenter/' }
    maven { url'https://maven.aliyun.com/repository/central/' }

    //mavenCentral()

// maven { url “http://maven.aliyun.com/nexus/content/repositories/central” }
}
}

allprojects {
repositories {

    maven { url'https://maven.aliyun.com/repository/public/' }
    maven { url'https://maven.aliyun.com/repository/google/' }
    maven { url'https://maven.aliyun.com/repository/jcenter/' }
    maven { url'https://maven.aliyun.com/repository/central/' }

   // mavenCentral()

}
tasks.withType(JavaCompile) {
    options.encoding = "UTF-8"
}

}

javax.crypto.BadPaddingException: Decryption error

1.异常描述:最近做项目为了增强数据传输的安全性用到了RSA加密。即android客户端将要传送的信息,用私钥通过RSA非对称加密算法加密后,传到服务器端(PC端)。服务器端用对应(密钥)的公钥来解密时解密失败,抛出“javax.crypto.BadPaddingException: Blocktype”异常。

2.异常原因:Android系统使用的虚拟机(dalvik)跟SUN标准JDK是有所区别的,其中他们默认的RSA实现就不同。即Android端用Cipher.getInstance(“RSA”)方法进行加密时,使用的provider是Bouncycastle Security provider,Bouncycastle Security provider默认实现的是“RSA/None/NoPadding”算法,而服务器(PC)端用Cipher.getInstance(“RSA”)进行解密时,使用的是Sun的security provider,实现的是“RSA/None/PKCS1Padding”算法,所以,解密时会失败。

3.解决办法:我这里提供三种解决办法:
第一种:将服务器(pc)端的Cipher.getInstance(“RSA”)方法改为Cipher.getInstance(“RSA/ECB/NoPadding”)。但这种改法有一个缺点就是解密后的明文比加密之前多了很多空格。(空格的长度个数+原来的明文字符数=产生密钥时采用的bit数/8)

第二种:将Android端的Cipher.getInstance(“RSA”)方法改为Cipher.getInstance(“RSA/None/PKCS1Padding”)。这种方法解密后的明文和加密前的明文是对应的,不会出现第一种方法中的现象,推荐这种方法。

第三种:在服务器(pc)端的jdk中加入Bouncycastle Security provider,关于Bouncycastle JCE的安装配置及验证请参看 http://blog.csdn.net/caoshichao520326/article/details/8732670, 配置好Bouncycastle Security provider后,将服务器(pc)端的Cipher.getInstance(“RSA”)方法改为Cipher.getInstance(“RSA”,“BC”)。
————————————————
版权声明:本文为CSDN博主「sichard」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/cshichao/article/details/8731680

Exception in MessageQueue callback: handleReceiveCallback

当迁移到Android X 之后混淆时,出现异常:

2021-01-21 20:41:23.928 30986-30986/cn.ft.appstore E/InputEventReceiver: Exception dispatching input event.
2021-01-21 20:41:23.929 30986-30986/cn.ft.appstore E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback
2021-01-21 20:41:23.931 30986-30986/cn.ft.appstore E/MessageQueue-JNI: java.lang.AbstractMethodError: abstract method "boolean android.view.Window C a l l b a c k . d i s p a t c h G e n e r i c M o t i o n E v e n t ( a n d r o i d . v i e w . M o t i o n E v e n t ) " a t c o m . a n d r o i d . i n t e r n a l . p o l i c y . D e c o r V i e w . d i s p a t c h G e n e r i c M o t i o n E v e n t ( D e c o r V i e w . j a v a : 411 ) a t a n d r o i d . v i e w . V i e w . d i s p a t c h P o i n t e r E v e n t ( V i e w . j a v a : 10295 ) a t a n d r o i d . v i e w . V i e w R o o t I m p l Callback.dispatchGenericMotionEvent(android.view.MotionEvent)" at com.android.internal.policy.DecorView.dispatchGenericMotionEvent(DecorView.java:411) at android.view.View.dispatchPointerEvent(View.java:10295) at android.view.ViewRootImpl Callback.dispatchGenericMotionEvent(android.view.MotionEvent)"atcom.android.internal.policy.DecorView.dispatchGenericMotionEvent(DecorView.java:411)atandroid.view.View.dispatchPointerEvent(View.java:10295)atandroid.view.ViewRootImplViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:4928)
at android.view.ViewRootImpl V i e w P o s t I m e I n p u t S t a g e . o n P r o c e s s ( V i e w R o o t I m p l . j a v a : 4787 ) a t a n d r o i d . v i e w . V i e w R o o t I m p l ViewPostImeInputStage.onProcess(ViewRootImpl.java:4787) at android.view.ViewRootImpl ViewPostImeInputStage.onProcess(ViewRootImpl.java:4787)atandroid.view.ViewRootImplInputStage.deliver(ViewRootImpl.java:4293)
at android.view.ViewRootImpl I n p u t S t a g e . o n D e l i v e r T o N e x t ( V i e w R o o t I m p l . j a v a : 4346 ) a t a n d r o i d . v i e w . V i e w R o o t I m p l InputStage.onDeliverToNext(ViewRootImpl.java:4346) at android.view.ViewRootImpl InputStage.onDeliverToNext(ViewRootImpl.java:4346)atandroid.view.ViewRootImplInputStage.forward(ViewRootImpl.java:4312)
at android.view.ViewRootImpl A s y n c I n p u t S t a g e . f o r w a r d ( V i e w R o o t I m p l . j a v a : 4459 ) a t a n d r o i d . v i e w . V i e w R o o t I m p l AsyncInputStage.forward(ViewRootImpl.java:4459) at android.view.ViewRootImpl AsyncInputStage.forward(ViewRootImpl.java:4459)atandroid.view.ViewRootImplInputStage.apply(ViewRootImpl.java:4320)
at android.view.ViewRootImpl A s y n c I n p u t S t a g e . a p p l y ( V i e w R o o t I m p l . j a v a : 4516 ) a t a n d r o i d . v i e w . V i e w R o o t I m p l AsyncInputStage.apply(ViewRootImpl.java:4516) at android.view.ViewRootImpl AsyncInputStage.apply(ViewRootImpl.java:4516)atandroid.view.ViewRootImplInputStage.deliver(ViewRootImpl.java:4293)
at android.view.ViewRootImpl I n p u t S t a g e . o n D e l i v e r T o N e x t ( V i e w R o o t I m p l . j a v a : 4346 ) a t a n d r o i d . v i e w . V i e w R o o t I m p l InputStage.onDeliverToNext(ViewRootImpl.java:4346) at android.view.ViewRootImpl InputStage.onDeliverToNext(ViewRootImpl.java:4346)atandroid.view.ViewRootImplInputStage.forward(ViewRootImpl.java:4312)
at android.view.ViewRootImpl I n p u t S t a g e . a p p l y ( V i e w R o o t I m p l . j a v a : 4320 ) a t a n d r o i d . v i e w . V i e w R o o t I m p l InputStage.apply(ViewRootImpl.java:4320) at android.view.ViewRootImpl InputStage.apply(ViewRootImpl.java:4320)atandroid.view.ViewRootImplInputStage.deliver(ViewRootImpl.java:4293)
at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:6817)
at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:6791)
at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:6734)
at android.view.ViewRootImpl W i n d o w I n p u t E v e n t R e c e i v e r . o n I n p u t E v e n t ( V i e w R o o t I m p l . j a v a : 6989 ) a t a n d r o i d . v i e w . I n p u t E v e n t R e c e i v e r . d i s p a t c h I n p u t E v e n t ( I n p u t E v e n t R e c e i v e r . j a v a : 185 ) a t a n d r o i d . o s . M e s s a g e Q u e u e . n a t i v e P o l l O n c e ( N a t i v e M e t h o d ) a t a n d r o i d . o s . M e s s a g e Q u e u e . n e x t ( M e s s a g e Q u e u e . j a v a : 328 ) a t a n d r o i d . o s . L o o p e r . l o o p ( L o o p e r . j a v a : 148 ) a t a n d r o i d . a p p . A c t i v i t y T h r e a d . m a i n ( A c t i v i t y T h r e a d . j a v a : 6251 ) a t j a v a . l a n g . r e f l e c t . M e t h o d . i n v o k e ( N a t i v e M e t h o d ) a t c o m . a n d r o i d . i n t e r n a l . o s . Z y g o t e I n i t WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6989) at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185) at android.os.MessageQueue.nativePollOnce(Native Method) at android.os.MessageQueue.next(MessageQueue.java:328) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:6251) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:6989)atandroid.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)atandroid.os.MessageQueue.nativePollOnce(NativeMethod)atandroid.os.MessageQueue.next(MessageQueue.java:328)atandroid.os.Looper.loop(Looper.java:148)atandroid.app.ActivityThread.main(ActivityThread.java:6251)atjava.lang.reflect.Method.invoke(NativeMethod)atcom.android.internal.os.ZygoteInitMethodAndArgsCaller.run(ZygoteInit.java:1063)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:924)
解决办法,添加以下混淆文件
-keep class com.google.android.material.** {;}
-keep class androidx.** {
;}
-keep public class * extends androidx.**
-keep interface androidx.** {*;}
-dontwarn com.google.android.material.**
-dontnote com.google.android.material.**
-dontwarn androidx.**

Andorid 9 添加WebView

1,修改frameworks/base/core/res/res/xml/config_webview_packages.xml
添加内容:






2,在package/app添加WebViewGoogle APK
修改device相对应的MK,添加应用
WebViewGoogle.apk的下载地址

添加WebViewGoogle.apk 的mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := WebViewGooglearm64(APK 的名字)
LOCAL_MODULE_TAGS := optional
LOCAL_DEX_PREOPT := false
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := platform
LOCAL_MODULE_PATH := $(TARGET_OUT)/priv-app
LOCAL_SDK_VERSION := current
include $(BUILD_PREBUILT)

RecyclerView 单行更新闪烁问题

是由于RecyclerView 更新时默认动画的问题,所以直接设置:((SimpleItemAnimator)lvResult.getItemAnimator()).setSupportsChangeAnimations(false);停止动画就可以了

OkHttp +Reftrofit 下载返回400错误

下载声明
public interface IDownFile {
@GET
@Streaming
Observable downfile(@Url String url, @Header(“Range”) String range);
}
使用URL 通过下面方式处理不会返回400错误
String path = “”;
try {
// LogUtils.error(“path” + mPoint.getUrl());
path = new String(mPoint.getUrl().getBytes(), “utf-8”);
path = URLEncoder.encode(path, “UTF-8”);
logger.info("path = "+path);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}

android 9 SystemUI 下拉显示白色

主要流程涉及的类:base/packages/SystemUI/src/com/android/systemui/qs/QSFragment.java
base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java
问题解决:
QSFragment 主要显示处理QSSettings,QSPanel显示下拉内容:
QSFragment.setQsExpansion 操作下拉菜下滑动作;
在方法中添加如下方法:
if(expansion==1.0)
{
Log.d(TAG,“updateQsState begin true”);
mQsDisabled = false;
mQsExpanded = true;
updateQsState();

    }else
    {
        Log.d(TAG,"updateQsState begin false ");
        mQsDisabled = false;
        mQsExpanded = false;
        updateQsState();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值