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 FAILEDWarning: 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 shelladb server version (31) doesn't match this client (40); killing...could not read ok from ADB Server* failed to start daemonerror: 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.widthPixelsheightPixels =dm.heightPixelsdensityDpi = 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.debugFailure [INSTALL_FAILED_CONFLICTING_PROVIDER]$ adb shell pm uninstall com.wyk.test.debugDELETE_FAILED_INTERNAL_ERRORError 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 ComponentInfo{com.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配置

      <applicationandroid: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_PROVIDERJPUSH_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!!.attributesparams.width = ViewGroup.LayoutParams.MATCH_PARENTparams.height = ViewGroup.LayoutParams.MATCH_PARENTparams.dimAmount = 0.05fif(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"    //1api '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 ComponentInfo{com.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.LayoutParamsval behavior = params.behavior as AppBarLayout.Behaviorbehavior.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相关推荐

  1. Android日常开发 - FlexboxLayout学习笔记

    Android日常开发 - FlexboxLayout学习笔记 Android日常开发使用FlexboxLayout实现流式布局的效果,FlexboxLayout与h5中的flex使用十分相似,都是将 ...

  2. Android日常开发问题总结:这些问题火候不够,随时变成删库跑路!

    日常开发中碰到了各种开发问题,捡选了一部分分享出来.有些问题非常简单,属于编码规范类,有些属于特定情况下碰到的问题,不是很常见.不太准确的地方,欢迎共同探讨下~ 1.requestFeature() ...

  3. android日常开发60条经验

    全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效. 数据库表段字段常量和SQL逻辑分离,更清晰,建议使用 ...

  4. Android学习总结(6)——Android日常开发总结的技术经验60条

    1. 全部Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一 需要整体变动,一处修改到处有效. 2.数据库表段字段常量和SQL逻辑分离,更清 ...

  5. Android:日常学习笔记(8)———探究UI开发(2)

    Android:日常学习笔记(8)---探究UI开发(2) 对话框 说明: 对话框是提示用户作出决定或输入额外信息的小窗口. 对话框不会填充屏幕,通常用于需要用户采取行动才能继续执行的模式事件. 提示 ...

  6. Android:日常学习笔记(8)———探究UI开发(5)

    Android:日常学习笔记(8)---探究UI开发(5) ListView控件的使用 ListView概述 A view that shows items in a vertically scrol ...

  7. 提供了一些工具类以及自定义 View,用于日常的 Android 快速开发

    Androids 项目地址:1993hzw/Androids  简介:提供了一些工具类以及自定义 View,用于日常的 Android 快速开发.something about android 更多: ...

  8. Android TV开发 开源项目收集

    Android TV和Android手机开发的主要区别在于焦点的控制和焦点效果的不同. 以下是开发过程中收集到的开源项目,记录于此,与大家分享一下. Android TV google官方TV库 ht ...

  9. android 字符串数组去重,GitHub - deng-ming-hao/ec-do: 实例为日常开发常用的小实例,包括数组去重,打乱数组,字母大小写转换,cookie操作的封装等。...

    ec-do 自己封装的常用操作实例 实例为日常开发常用的小实例,包括数组去重,打乱数组,字母大小写转换,cookie操作的封装等. 使用方法 引入ec-do.js //去除空格 ecDo.trim(' ...

最新文章

  1. EasyTransaction 1.3.0 发布,一站式分布式事务解决方案
  2. CLR_via_C#.3rd 翻译[1.5 本地代码生成工具NGen.exe]
  3. 小车自动往返工作原理_自动气象站的工作原理介绍
  4. CF79D Password(P3943 星空)
  5. 【转】3.1SharePoint服务器端对象模型 之 访问文件和文件夹(Part 1)
  6. linux 命令学习记录
  7. 中国进口消费市场研究报告2020
  8. JAVA中的引用四种引用类型
  9. QT开发(四十)——GraphicsView编程
  10. python点对点传输_python点对点简单实现
  11. 知云文献翻译选中翻译出现乱码的解决方式
  12. Mimics:快捷键介绍
  13. 人群密度估计-Crowd Density
  14. 设计模式——设计模式中英文对照
  15. 如何在 R 中计算 Eta 平方
  16. Mixamo使用笔记
  17. 小程序源码:端午送粽子祝福微信小程序源码下载支持打赏模式带背景音乐
  18. 【kindle】使用Typora+Calibre自制电子书
  19. 什么是编码?什么是解码?
  20. 【MyBatis】关联查询

热门文章

  1. parameterType的用法
  2. newifi无盘服务器,newifi 3 padavan纯净版固件,2.4G挺稳定,2019年5.09更新
  3. Python+OpenCV图像处理与识别 Step by Step
  4. 瑞利信号公式(级联信道,多信道之和,多个瑞利信号之和,概率密度函数)
  5. STM32开发 -- RTC详解
  6. 科学中有故事,故事中有科学
  7. EEPROM存储芯片24C02
  8. Java常见运算符整理
  9. MySQL数据库的官网下载、安装及卸载(2018年最新)
  10. Django使用容联云发送短信验证码时提示:172001,网络错误