Android日常开发收集的Tips
Posted 巨头之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android日常开发收集的Tips相关的知识,希望对你有一定的参考价值。
android日常开发收集的Tips
1. 时间戳转时间:
要注意时间戳的位数,10位的是秒级别的,13位的是毫秒级别的,
因此,在转化为时间中,也有稍微的区别.
// 10位的秒级别的时间戳
long time1 = 1527767665;
String result1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time1 * 1000));
System.out.println("10位数的时间戳(秒)--->Date:" + result1);
Date date1 = new Date(time1*1000); //对应的就是时间戳对应的Date
// 13位的秒级别的时间戳
double time2 = 1515730332000d;
String result2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time2);
System.out.println("13位数的时间戳(毫秒)--->Date:" + result2);
参考: https://blog.csdn.net/fanrenxiang/article/details/80531649
2.Android Studio编译报错Unable to merge dex
log:
com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
原因:项目的jar包重复
3.Android Studio无法关联Api* 源码-提示Souces for android api * platform not found
借鉴: https://www.cnblogs.com/permanent2012moira/p/5447419.html
4.Android 集成支付宝,Proguard报错(支付宝sdk的版本为v15.5.9,arr包)
Warning: there were 1 unresolved references to library class members.
You probably need to update the library versions.
Warning: Exception while processing task java.io.IOException: Please correct the above warnings first.
:app:transformClassesAndResourcesWithProguardFor_360Debug FAILED
Warning: com.alipay.android.phone.mrpc.core.b: can't find referenced method 'org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(int,android.net.SSLSessionCache)' in library class android.net.SSLCertificateSocketFactory
解决:
#保持SSLCertificateSocketFactory类不被混淆
-dontwarn android.net.**
-keep class android.net.SSLCertificateSocketFactory*;
#或者忽略警告
#-ignorewarnings
5.Android中Button文字不能铺满解决方法
问题:Android中的button设置文字后,字体设置大一些那么文字就会被截掉了,可是文字显示部分只占用了整个button的大概一半,根本没有填充满整个Button。
解决:Button的padding值为0,即可解决
6.调用fragment的popBackStack函数报错
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1832)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1850)
at android.support.v4.app.FragmentManagerImpl.popBackStack(FragmentManager.java:769)
原因: 不能在onSaveInstanceState方法之后调用popBackStack。 onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后再给它添加Fragment就会出错。在项目中出现该异常是由于:将第三方支付封装在fragment,当我点击微信支付的返回键时,是通过本地广播去拦截 ‘取消支付’ 的消息,拦截到该消息时~将该支付fragment进行popBackStack操作,结果就报错了
解决:
try去捕捉异常,当activity处于运行状态的时候,再去判断fragment栈中是否存在该fragment,再执行popBackStack操作
7.fragment中popBackStack函数的坑
popBackStack是将弹出栈的操作 插入队列中,没有立刻去执行,要注意。如果想立刻去执行弹栈操作,可以用popBackStackImmediate函数,立马执行弹栈操作
8.TextView中Hint属性要注意的点
- 1.例如布局中的TextView属性值hint的数据占的高度为两行,但是你真实数据占高只有一行,页面还是会显示两行的高度;
- 2.例如布局中的TextView设置了Hint属性的值,但是真实数据是没有值的,尽管你通过setText向该TextView设置了内容,页面还是hint属性的值
命令行adb启动失败问题
C:\\Users\\Administrator>adb shell
adb server version (31) doesn't match this client (40); killing...
could not read ok from ADB Server
* failed to start daemon
error: cannot connect to daemon
原因及解决:可能由于第三方(360手机助手、豌豆荚)的进程导致的,查看下电脑(windows)任务管理器,kill掉进程,重新启动adb(adb start-server)
9.屏幕适配中,dp为什么不是万能的?
屏幕的px值 是由 dp * (dpi/160)
可dpi并不是由分辨率和屏幕尺寸计算出来的固定值,而是手机厂商设定的,
一般标准的:屏幕分辨率为720x1280,dpi通常为320;分辨率1080x1920 的dpi为480,可手机厂商就不按照标准来,一般 720x1280 的dpi值通常是240 ~ 320,这就导致dp并不是万能的
10.改变手机的分辨率和dpi值
wm命令是高通平台下对手机分辨率、像素密度等进行设置的命令。用法很简单:
首先使用adb shell命令进入手机的shell中,然后就可以使用wm命令了,常用的命令如下:
wm size //输出手机的分辨率信息
wm size reset //还原手机的原始分辨率
wm density
wm density 240
wm density reset
11通过代码获取手机分辨率和dpi值
DisplayMetrics dm = mContext.getResources().getDisplayMetrics();
mScreenWidth = dm.widthPixels;
mScreenHeight = dm.heightPixels;
mDensity = dm.density;
widthPixels = dm.widthPixels
heightPixels =dm.heightPixels
densityDpi = dm.densityDpi
12.AndroidStudio运行时报错 ‘INSTALL_FAILED_CONFLICTING_PROVIDER’
在同一台android设备上安装多个同一项目的apk,配置build.gradle里的applicationIdSuffix,运行时报下面的错误:
$ adb shell pm install -t -r "/data/local/tmp/com.yhsoft.tax.debug"
pkg: /data/local/tmp/com.wyk.test.debug
Failure [INSTALL_FAILED_CONFLICTING_PROVIDER]
$ adb shell pm uninstall com.wyk.test.debug
DELETE_FAILED_INTERNAL_ERROR
Error while Installing APK
原因:在Android中authority要求必须是唯一的,比如你在定义一个provider时需要为它指定一个唯一的authority。如果你在安装一个带有provider的应用时,系统会检查当前手机已安装应用的authority是否和你要安装应用的authority相同,如果相同则会弹出上述警告,并且安装失败
解决:authority的前缀不要写死,一般用项目包名做前缀
在极光推送SDK、FileProvider适配时,可能会导致该问题
借鉴:https://www.jianshu.com/p/ad8c066e9166
13.Android7.0,dialog弹框无法显示的问题
在设置App字体大小不随手机系统字体改变时,通过getResources()方法修改Configuration类的配置导致的,不能调用configuration.setToDefaults()这个方法,在这个方法内部会将screenWidthDp和screenHeightDp设置为0
借鉴:https://www.cnblogs.com/liyiran/p/6491001.html
14.AndroidStudio编译报错,缺少ABI库
“No toolchains found in the NDK toolchains folder for ABI with prefix: mipsel-linux-android”
原因:SDK路径下的SDK\\sdk\\ndk-bundle\\toolchains目录内缺少mipsel-linux-android这个库
解决:https://blog.csdn.net/qq_24118527/article/details/82867864
下载ndk:https://developer.android.com/ndk/downloads/?hl=zh-cn
15.gradle里的compile问题
implementation可以让module在编译时隐藏自己使用的依赖,但是在运行时这个依赖对所有模块是可见的。而api与compile一样,无法隐藏自己使用的依赖。
api或compile关键字引用的包对于其他module来说是可见的,而implementation关键字引用的包对于其他module来说是不可见的
假设模块A引用模块B,那么模块B上通过implementation引用的依赖,对模块A都是不可见的(编译时)
假设模块A引用模块B,那么模块B上通过api引用的依赖,对模块B都是可见的
16.编译报错attribute value must be constant
原因:可能工程是一个Library工程,而Library工程生成的R文件不是constant的,因此才会报错
借鉴:http://www.it610.com/article/5263632.htm
17.Mob SDK更新版本后报错(2019.03.21)
报错信息:
A problem occurred configuring root project 'taxtao_201903'.
> Could not resolve all artifacts for configuration ':classpath'.
> Could not resolve com.mob.sdk:MobSDK-Impl:latest.integration.
Required by:
project : > com.mob.sdk:MobSDK:2018.0319.1724
> Failed to list versions for com.mob.sdk:MobSDK-Impl.
> Unable to load Maven meta-data from https://jcenter.bintray.com/com/mob/sdk/MobSDK-Impl/maven-metadata.xml.
> Could not HEAD 'https://jcenter.bintray.com/com/mob/sdk/MobSDK-Impl/maven-metadata.xml'. Received status code 502 from server: Bad Gateway
原因: 因为jcenter仓库无法访问,可以访问Mob自家创建的maven仓库,也可以访问阿里的maven仓库
解决:
buildscript
repositories
jcenter
url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'
//或者maven
// url "http://mvn.mob.com/android"
//
18.打渠道包时,调用不同文件夹(项目/src目录下不同文件夹)下相同名称的java文件
-
1.在app下的build.gradle文件下定义渠道相关信息
flavorDimensions "default" productFlavors wyk hehe
-
2.根据渠道名创建相应的文件夹
-
3.选择所需的Flavor
-
4.在编译之后,就会调用到flavor名称对应的文件夹下的文件,其实是根据不同的flavor+buildType,结合项目main目录下的文件,进行编译,如下(Kotlin编译后的文件和java所处位置不一样),而java的编译产物是在\\app\\build\\intermediates\\javac目录下
参考:https://blog.csdn.net/starhosea/article/details/82713348
19.Android Studio V4包、V7包的引用报红,应用可以正常运行
-
点击File->Invalidate Caches / Restart…
-
也可能是support库和AndroidX冲突
20.Android逆向助手反编译时报: Java环境丢失
解决方法:下载最新的逆向助手工具,具体的地址请Goggle或百度
21.Android逆向助手反编译dex后,自动打开文件夹是空的
解决方法: https://ibotpeaches.github.io/Apktool/ 下载最新的apkTool.jar,放到安装目录Android逆向助\\lib\\apktool里,注意文件名称是apktool.jar
22.Android反编译全解
参考:https://www.52pojie.cn/thread-726176-1-2.html
23.RxJava报异常:io.reactivex.exceptions.UndeliverableException
解决方法: try/catch异常
24.Androidx和Support包冲突,gradle文件中并没有依赖androidx底下的库
原因:可能项目中某些库的最新版本已经依赖androidx底下的库
解决方法:命令行 gradlew :app:dependencies 查看哪些库依赖了androidx,目前的做法要不降低该库的版本(使其依赖的是support),要不整个项目从support过渡到androidx
25.App瘦身 – 减少so的架构包
项目中只保留armeabi-v7a和arm64-v8a这两种ABI的so包,模拟器调试时需要x86的so包
26.集成腾讯X5的问题记录
部分手机加载X5内核失败
-
1.下载官网提供的SDK包,找到包中的文档"x5接入必读.doc",按照文档查看手机是否有无内核;
-
2.64位的手机,可能因为so包位置不同而导致内核加载失败;
-
通过cmd命令行启动adb,查看手机的位数和架构
adb shell cat /proc/cpuinfo 例如:ARMv7 Processor rev 1 (v7l)、 AArch64 Processor rev 4 (aarch64)
-
通过官网的提示查看项目是否有位置,没有则进行配置:
参考
https://x5.tencent.com/tbs/technical.html#/detail/sdk/1/34cf1488-7dc2-41ca-a77f-0014112bcab7
-
-
3.运行了官网提供的demo,demo运行失败; 官网也没有提供详细的Api文档
-
4.有相关问题,在下面链接查看是否有相应的答案
https://x5.tencent.com/tbs/technical.html#/list/sdk/916172a5-f14e-40ed-9915- eaf74e9acba8/%E5%8A%A0%E8%BD%BDX5%E5%86%85%E6%A0%B8%E7%B1%BB
27.IntentService异步的问题
由于IntentService执行的任务是在异步线程,所以网络访问的操作不需要再切换线程
28.Android Studio构建时报错"aapt.exe’’ finished with non-zero exit value 1"
原因:导致该异常的问题有多种,笔者遇到几次都是因为module之间包的冲突
解决:查看具体报错方法在Terminal输入gradlew processDebugResources --debug来查看
比较方便的方法是查看项目模块中的依赖树,寻找冲突的库,具体查看依赖树方式:
-
gradle查看模块库依赖情况(下面两种方式输出结果一致)
-
打开Android Studio右侧Gradle,然后找到项目下的androidDependencies(路径: 模块名/Tasks/android/androidDependencies),双击执行
-
或者 AndroidStudio 的Terminal中输入 gradlew :app:androidDependencies执行
-
-
gradle查看模块库依赖树情况,即查看三方库又依赖了那些库(下面两种方式输出结果一致)
-
打开Android Studio右侧Gradle,然后找到项目下的dependencies(路径: 模块名/Tasks/help/dependencies),双击执行
-
或者 AndroidStudio 的Terminal中输入 gradlew :app:dependencies执行
-
关于项目中多个module引用同个jar,导致冲突的问题,参考https://blog.csdn.net/jinpeng9001/article/details/82747944
备注:看项目构建的日志,日志会告诉你最清楚的错误信息
29.通过Intent传递数据报错,传递的对象需要序列化
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object
原因及解决: 通过Intent传递的对象需要序列化,可以实现serializable或Parcelable接口,但记得对象里的对象也得实现serializable或Parcelable接口
30.集成Arouter报错
Caused by: com.alibaba.android.arouter.exception.InitException: ARouter::Init::Invoke init(context) first!
at com.alibaba.android.arouter.launcher.ARouter.getInstance(ARouter.java:57)
原因:没有在项目工程中初始化Arouter
31.访问接口报UnknownHostException异常
java.net.UnknownHostException: Unable to resolve host "*****": No address ass
原因:可能是手机网络未开启,或者项目的文件清单没有添加网络权限
32.解决内存泄漏的AutoDispose框架要注意的点
和Lifecycle2框架一样,为了解决Rx中发生的内存泄漏问题,比如当页面已经置于后台或销毁,这时可能该页面所属的接口刚要发出请求,从而会产生内存泄漏,而AutoDispose和Lifecycle等框架就为了防止内存泄漏的发生,在页面置于后台或销毁情况下,将请求进行取消。
在项目中,遇到这么种情况要注意的,当页面置于后台时,产品需求还是要求当前页面的网络请求要继续,而不是取消,这时候我们在使用AutoDispose和Lifecycle等框架时就要注意咯,要记得调用api的时候,设置在Lifecycle.Event.ON_DESTROY(比如AutoDispose)才取消网络请求的操作
33.接入com.github.LuckSiege.PictureSelector库(当前版本v2.2.3)遇到的问题
1.异常信息
java.lang.RuntimeException: Unable to start activity ComponentInfocom.twukj.wlb_wls/com.luck.picture.lib.PicturePreviewActivity: android.view.InflateException: Binary XML file line #8: Error inflating class
原因及解决:由于找不到样式id,在PictureSelector调用时,调用themeStyle设置上样式即可解决
2.沉浸式状态的问题
Android5.0以下版本未支持沉浸式状态栏
5.0以上,v2.2.0版本有些状态栏变成白色,升级到v2.2.3即可解决
3.升级到2.2.3版本,编译报错
> Manifest merger failed : Attribute application@theme value=(@style/MyBaseAppTheme) from AndroidManifest.xml:12:9-46
is also present at [com.github.LuckSiege.PictureSelector:picture_library:v2.2.2] AndroidManifest.xml:11:18-49 value=(@style/AppTheme).
Suggestion: add 'tools:replace="android:theme"' to <application> element at AndroidManifest.xml:11:5-37:19 to override.
原因及解决:样式冲突导致的,在文件清单加上
4.升级2.2.3版本遇到的问题
error: Error: No resource found that matches the given name: attr 'picture.preview.statusFontColor
...
finished with non-zero exit value 1
原因及解决: 找不到 “picture.preview.statusFontColor” 这个样式名,删除即可解决
34.自定义View报错
Caused by: android.view.InflateException: Binary XML file line #2: Error inflating class com.wyk.slideView.SlideIntroducePageView
...
Caused by: java.lang.NoSuchMethodException: <init> [class android.content.Context, interface android.util.AttributeSet]
原因及解决: 没有声明自定义View中两个参数的构造函数,由于Kotlin中@JvmOverLoads注解中,构造函数的参数没写默认值导致的。
35.自定义View报错
Caused by: android.view.InflateException: <merge /> can be used only with a valid ViewGroup root and attachToRoot=true
原因及解决: 自定义View中,由于布局根部使用了merge标签,所以inflate的时候要指定root对象和attachToRoot为true
36.Android8.0 Google nexus 5x 报错
java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation
原因及解决: 只有全屏的activity才支持设置activity方向,所以在文件清单中将该activity的screenOrientation属性去掉
37.Android9.0不支持http请求
解决方案:
-
所有网络链接都改用https
-
targetSdkVersion 降级回到 27
-
文件清单加配置,步骤:
-
在 res 下新建一个 xml 目录,创建一个名为:network_security_config.xml 文件 ,该文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
-
AndroidManifest.xml的application标签内应用上面的xml配置
<application android:name=".App" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_config" android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/AppTheme"> </application>
-
38. strings资源文件提示 “ xxx” is translated here but not found in default locale
原因:这种问题是由于部分字符串没有本地化,或者是分包后有的字符串在子包strings文件中没有出现,在main的strings出现导致的
解决: 在应用级的build.gradle中找到 lintOptions ,在其中添加如下代码即可:
lintOptions
abortOnError false //不在error情况下中断
disable 'MissingTranslation' //无视字符串缺少本地化的情况
disable 'ExtraTranslation'//无视多做了本地化的字符串
备注: 也可以尝试重启as, 上面的解决方法试了没用,笔者通过重启as解决了
39.友盟新浪分享报错ClassCastException
ClassCastException: java.net.Socket cannot be cast to javax.net.ssl.SSLSocket
at com.android.okhttp.internal.http.HttpsEngine.connected(HttpsEngine.java:45)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:303)
at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
解决: 这个问题是由于新浪SDK的bug导致,部分设备可以通过导入CA证书的方式解决,新浪CA证书下载链接
40.Android Library不允许switch-case语句引用资源ID
Resource IDs cannot be used in a switch statement in Android library modules
解决: 由于library的R.java中的资源ID不是常量引起的,我们可以在library中通过if-else-if条件语句来引用资源ID,这样就避免了这个错误
41.Android工程中,module间merge的时候报错
Attribute application@name value=(com.kk.MyApplication) from AndroidManifest.xml:125:9-43
is also present at [:module_login] AndroidManifest.xml:3:93-130 value=(com.mob.MobApplication).
Suggestion: add 'tools:replace="android:name"' to <application> element at AndroidManifest.xml:124:5-1484:19 to override.
解决:
- mob SDK以插件的方式集成时,AndroidManifest文件清单没有指定application时,会默认赋予com.mob.MobApplication;
- 由于各个module间的AndroidManifest文件清单在合成的时候,属性冲突导致的
在主项目工程的AndroidManifest文件清单中添加 tools:replace=“android:name”,注意是主项目工程
42.检测项目中未被使用到的资源文件,比如图片、xml等
在AndroidStudio中,点击菜单栏 Analyze -> Run Inspection by Name -> unused resources -> Moudule ‘app’ -> OK
43. Android Studio 无法连接华为手机的问题
AS无法识别到手机,可能是华为自带的驱动没办法被AS使用,在网上看到的方法大多是使用360手机助手或者豌豆荚,然而本人不想使用这两个软件,最后找到了这样的解决办法
步骤: 打开Android Studio并打开SDK Manager,打开tools选项卡,勾选Google USB Driver,安装完毕,连接真机试试
44.最近新建的AndroidStudio项目编译时出现了这个错误,Could not find any version that matches com.android.support:appcompat-v7:29.+.
解决: 将implementation ‘com.android.support:appcompat-v7:29.+’ 改成 implementation ‘com.android.support:appcompat-v7:+’ , build即可
45.Andriod Studio adb.exe,start-server’ failed – run manually if necessary 解决
导致adb启动失败原因有多种,一般遇到的比较多的可能是: 因为360手机链接工具导致的,占用了端口. 可以通过cmd命令查看是哪个端口占用的
首先cmd命令行执行 netstat -ano|findstr “5037” 回车,可以看到是 “59304” 这个进程占用了端口,接着执行 tasklist|findstr “59304” 回车,这时就可以看到是哪个应用占用了adb端口,通过任务管理器结束该应用即可
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 59304
TCP 127.0.0.1:5037 127.0.0.1:50319 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:50327 TIME_WAIT 0
TCP 127.0.0.1:5037 127.0.0.1:50340 TIME_WAIT 0
但今天遇到的adb启动失败,通过任务管理器的详细信息看到有3个adb, 结束其中任何一个adb,两秒后自动重启,搜索资料后,发现其中两个adb 是由虚拟机启动的,刚好我运行了gemymotion,我关掉genymotion,这两个adb则消失,问题解决
46.MUI框架默认关闭复制粘贴,如何打开?
添加如下样式
*
-webkit-user-select: auto;
47.Kotlin项目build报错:Kotlin plugin should be enabled before ‘kotlin-kapt’
原因: kapt插件需要有Kotlin插件的支持,所以得在kapt插件的前面 apply plugin: ‘kotlin-android’,如下这么写即可
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android-extensions'
48. AndroidStudio连接Genymotion模拟器报" \\sdk\\platform-tools\\adb.exe start-server’ failed – run manually if necessary"
之前有遇到过这个异常,一直链接不上,在上面也有记录,是因为360手机链接工具导致的, 可是这一次采用此解决方法却没有效果,接连困扰了,这下子终于解决咯
原因: 一般点击AndroidStudio的run按钮,则会启动adb的进程,发生这问题时,AndroidStudio还没启动adb这个进程,而Genymotion在启动时会启动adb这个进程,所以当启动完Genymotion再来点击AndroidStudio的Run按钮时,这时adb由于已经被Genymotion占有,从而就导致启动失败咯
解决:在启动Genymotion之前,先点击AndroidStudio的Run按钮来启动adb这个进程, 即可解决.
49.Android Dialog 去掉遮罩层(全透明)
dialog.getWindow().setDimAmount(0f);
50. 关于java.lang.SecurityException Unable to start service Intent异常问题
1.manifest中未声明service的权限,这种情况下需要在manifest中声明service;
2.服务中设有签名保护,尝试调用服务的app签名与服务签名不一致,这种情况下需要卸载掉service和app,重启新的service和app;
3.由于coloros的OPPO手机自动熄屏一段时间后,会启用系统自带的电量优化管理,禁止一切自启动的APP(用户设置的自启动白名单除外),需要try catch
51. AndroidStudio运行到手机失败,报错 INSTALL_FAILED_CONFLICTING_PROVIDER
异常信息:
Installation did not succeed.
The application could not be installed: INSTALL_FAILED_CONFLICTING_PROVIDER
...
List of apks:
[0] '省略...'
Installation failed due to: 'null'
原因:这个是由于手机本身已经存在相同authorities的FileProvider的APP, 手机在安装时会检测是否有相同authorities的FileProvider的app,如果有的话则提示安装失败,错误提醒信息是 INSTALL_FAILED_CONFLICTING_PROVIDER
解决:
-
可以通过打开apk文件,查看其AndroidManifest文件的FileProvider,是否相同App存在同一authorities;
-
目前遇到该异常的原因: 由于极光的JPUSH_PKGNAME未配置成功,引起的不同项目的authorities一样导致的;
android defaultConfig manifestPlaceholders = [ JPUSH_PKGNAME : "$rootProject.ext.android["applicationId"]", //JPUSH_PKGNAME : Project.getName() //copy极光文档时忘记改了,导致INSTALL_FAILED_CONFLICTING_PROVIDER JPUSH_APPKEY : "$rootProject.ext.sdk["JPUSH_APPKEY"]", //极光开发平台上注册的包名对应的appkey. JPUSH_CHANNEL : "$rootProject.ext.sdk["JPUSH_CHANNEL"]", //暂时填写默认值即可. ]
52. Android Studio真机调试,vvivo手机安装失败
- 1.在工程目录的gradle.properties中添加android.injected.testOnly = false 即可
- 2.android studio中Settings选项中将Enable Instant Run 关闭
53. Android Dialog 关闭的时候标题栏闪烁一下的处理方法
添加代码
private fun processStatusBar()
val params = window!!.attributes
params.width = ViewGroup.LayoutParams.MATCH_PARENT
params.height = ViewGroup.LayoutParams.MATCH_PARENT
params.dimAmount = 0.05f
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
window?.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS)
//window?.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS)
window?.setStatusBarColor(Color.TRANSPARENT)
/*if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
try
val decorView = Class.forName("com.android.internal.policy.DecorView")
val field = decorView.getDeclaredField("mSemiTransparentStatusBarColor")
field.setInt(window?.getDecorView(), Color.TRANSPARENT)
catch (e: Exception)
*/
54. 解决ADB错误“more than one device and emulator”的方法
原因: 输入adb命令操作设备,但多个设备连接了电脑,导致adb无法识别操作具体哪台设备
解决:
-
输入adb devices,显示序列号和设备
- a.执行命令adb -s DG4064b7ac4408(序列号) shell,进入该设备操作
- b.如不想进入设备shell模式,则执行 adb -s DG4064b7ac4408 指令
- c.如果只有一个模拟器和一个手机连着电脑; 可以用adb -e 来指明是操作模拟器(Emulator); 可以用adb -d 来指明是操作设备(Device)
55. ViewBinding使用注意事项
- 模块化/组件化中注意模块/组件中的布局不能重复,例如模块的布局名和app目录下的布局名一致,这种问题导致开发时没问题,运行时就出现问题了,布局ID找不到,但是代码中的布局ID是可以跳转到布局的,很难排查
56. 网络请求报错UnknownServiceException
报错信息:
java.net.UnknownServiceException: CLEARTEXT communication to ykhapitest.gzzyrj.com not permitted by network security policy
原因: 由于 Android P(版本27以上) 限制了明文流量的网络请求,非加密的流量请求都会被系统禁止掉。
如果当前应用的请求是 htttp 请求,而非 https ,这样就会导系统禁止当前应用进行该请求
解决:
-
方案1:新增 “network_security_config.xml” 配置
-
1.在 res 下新建一个 xml 目录,然后创建一个名为:network_security_config.xml 文件 ,该文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <base-config cleartextTrafficPermitted="true" /> </network-security-config>
-
2.在 AndroidManifest.xml Application增加配置 android:networkSecurityConfig=“@xml/network_security_config”
-
-
方案2: targetSdkVersion 降级回到 27
-
方案3: 将http改回https,当然这个需要服务器nginx配置ssl证书和相关配置
57.腾讯Bugly全量更新报错,更新sdk初始化失败
异常日志
System.err: java.lang.ExceptionInInitializerError
...
Lifecycle IllegalStateException: Method addObserver must be called on the main thread
原因:引入compose相关的jar包导致的该异常
api "androidx.compose.ui:ui:$compose_version"
api "androidx.compose.material:material:$compose_version"
api "androidx.compose.ui:ui-tooling-preview:$compose_version" //1
api 'androidx.activity:activity-compose:1.3.0-alpha06'
api "androidx.compose.compiler:compiler:1.1.0-alpha01" //1
解决:
- 通过排除法确定上面未注释1的3个依赖都会导致该异常,通过 gradlew :app:dependencies 进行查看依赖, 确定是依赖的 androidx.lifecycle:lifecycle-runtime:2.3.1 这个jar包导致的,怎么排查出是这个jar包? 通过报错信息,跟踪报错的代码,从而定位到这个jar包,那怎么解决? 通过降低这个jar包的版本,在gradle依赖文件 引入 api “androidx.lifecycle:lifecycle-runtime:2.2.0”,从而解决这个初始化问题
注意:
- 当没检测到有新版本时,是不会报错的,在upgradeStateListener的回调是没有最新版本,当检测到新版本时,则报错
58. 修改JDK环境变量的值,命令行输入java -version,jdk版本号没有变化
原因:
1.可能系统变量里的Path变量还有个jdk的值,例如C:\\Program Files (x86)\\Common Files\\Oracle\\Java\\javapath,在该目录下有java.exe、javaw.exe、javaws.exe 的执行文件
解决: 将该目录下的这三个文件删掉 或 删除path变量的该路径的值
59. RecycleView偶尔notifyDataSetChanged无效
adapter原本持有的Data的引用地址变了,说白了就是赋予新的值咯
60.Gradle开启非离线模式
点击AndroidStudio工具右侧的Gradle菜单,找到 "Toggle Offline Mode"这个图标, 非选中状态则是联网构建
参考的链接: https://blog.csdn.net/u013449800/article/details/114634113
61.安装app,as报错,安装失败
报错日志:
List of apks:
[0] ‘E:\\project02\\ams_android\\app\\build\\outputs\\apk\\debug\\app-debug.apk’
Installation via USB is disabled.
解决: 手机自带的USB安装管理,将我们开发的app受监控应用给禁止了; 打开手机管家----权限管理----USB安装管理----受监控的应用----允许,结束
62.运行报错 InflateException: Binary XML file line #17 in com..:layout/abc_screen_simple
异常信息:
java.lang.RuntimeException: Unable to start activity ComponentInfocom.gncaller.crmcaller/com.gncaller.crmcaller.windows.activity.base.SplashActivity: android.view.InflateException: Binary XML file line #17 in com.gncaller.crmcaller:layout/abc_screen_simple: Binary XML file line #17 in com.gncaller.crmcaller:layout/abc_screen_simple: Error inflating class androidx.appcompat.widget.FitWindowsLinearLayout
原因: 可能是androidx 跟support包冲突导致的,因为目前测试了只在targetSdkVersion大于28时才出现,测试了targetSdkVersion为29和30时,都报错该异常
解决: 目前暂缺将targetSdkVersion改为28,即解决
63. 百度地图SDK的信息窗infoWindow的大小问题
问题:定义一个Button,设置长宽和背景,作为参数传入InfoWindow中,Button的长宽并未生效
解决: 查看百度api文档,可以看到InfoWindow有如下描述: 利用该view生成一个Bitmap绘制在地图中,所以问题应该是在Button上,将Button改为TextView,尺寸生效了,完美解决
64. 正确使用behavior.setDragCallback不报空指针的方案
前提:布局中有CoordinatorLayout、AppBarLayout、recyclerView等控件,需要根据代码对其中的behavior设置setDragCallback,从而决定appBarLayout是否可以滑动
问题:当在代码直接获取behavior并setDragCallback,这时候是会报空指针异常的,原因可能就是behivor还未被构建出来,所以可以延时或在页面加载完成后(viewTreeObserver.addOnGlobalLayoutListener)进行behavior.setDragCallback
代码:
mViewBinding.ablAppbar.viewTreeObserver.addOnGlobalLayoutListener(object: ViewTreeObserver.OnGlobalLayoutListener
override fun onGlobalLayout()
mViewBinding.ablAppbar.viewTreeObserver.removeOnGlobalLayoutListener(this)
val params = mViewBinding.ablAppbar.layoutParams as CoordinatorLayout.LayoutParams
val behavior = params.behavior as AppBarLayout.Behavior
behavior.setDragCallback(object: AppBarLayout.Behavior.DragCallback()
override fun canDrag(appBarLayout: AppBarLayout): Boolean
return false
)
)
65.AndroidStudio连接不到MUMU模拟器
原因:由于MUMU模拟器的端口是7555,所以as连接不上;
解决: cmd命令行执行 adb connect 127.0.0.1:7555 即可解决; 夜神模拟器的端口是62001,这应该是AndroidStudio默认连接的端口号
66. 解决荣耀系列手机打开usb调试无法连接adb的问题
解决:在开发者选项中找到 “选择USB的配置” 选择 “RNDIS(USB以太网)”
67.Android 设备adb连接后unauthorized解决方法
1.检查开发者选项USB调试是否开启
2.重新插拔USB看是否有授权提示
3.重启adb
adb kill-server
adb start-server
以上是关于Android日常开发收集的Tips的主要内容,如果未能解决你的问题,请参考以下文章