解决这些坑的过程就不说了,说出来也都是泪,直接上干货。
INSTALL_FAILED_DUPLICATE_PERMISSION
adb安装apk时报错。2个apk有一个或多个相同的自定义权限,但是签名不一致,因而无法正常安装。并不是什么防止相互唤醒之类的,这是Android L的新规则。
获取IMEI为空does not meet the requirements to access device identifiers.
telephonyManager.getImei();
自 Android 10(API 级别 29)起,您的应用必须是设备或个人资料所有者应用,具有特殊运营商许可,或具有 READ_PRIVILEGED_PHONE_STATE 特权,才能访问不可重置的设备标识符。
WebView加载Https无法显示的问题
当load有ssl层的https页面时,如果这个网站的安全证书在Android无法得到认证,WebView就会变成一个空白页,而并不会像PC浏览器中那样跳出一个风险提示框。因此,我们必须针对这种情况进行处理。
解决:
wv.setWebViewClient(new WebViewClient(){
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error){
//handler.cancel(); 默认的处理方式,WebView变成空白页
//handler.proceed();接受证书
view.reload();
//handleMessage(Message msg); 其他处理
}
吐司不显示
对于原生吐司来说,小米、oppo通知权限关闭后吐司仍正常,华为不行,这可以说是安卓系统的一个bug,但小米、oppo系统定制时修复了这个bug,而华为没有,但华为默认打开通知权限。对于第三方库封装的吐司库或工具,容易造成在新上市的手机无法显示吐司,如oppo手机。
解决:尽量使用原生直接吐司。
Expiring Daemon because JVM heap space is exhausted
jvm 默认可分配的堆内存不够
解决方案:
在 gradle.properties 文件中添加
org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=512m
阿里云oss在android10及以上上传图片无回调
Android10增加了分区存储特性
解决:升级oss库依赖版本到2.9.5,并在sdk>28时调用uri参数的接口。
Program type already present: com.umeng.umzid.Spy
项目中存在2个jar包中包含相同名称的类文件。
解决:在libs目录中和AS中项目的外部库列表中查找,一般是不同版本的jar包同时存在导致的,按需要删除一个即可。
SourceSet with name ‘test’ not found.
在AS项目中运行java的main函数报错。
解决:打开项目/.idea/gradle.xml文件,在标签内加入一个选项:,然后重新运行。
AS日志输出乱码
1、打开Help -> Edit Custom VM Options
2、添加如下内容后重启Android Studio
-Dfile.encoding=UTF-8
SourceSet with name ‘main’ not found
解决:在.idea文件夹中找到gradle.xml, 打开文件,在GradleProjectSettings标签下添加
<option name="delegatedBuild" value="false" />
ClassNotFoundException:Didn’t find class “org.apache.http.ProtocolVersion” on path
解决:在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。要继续使用 Apache HTTP 客户端,以 Android 9 及更高版本为目标的应用可以向其 AndroidManifest.xml的application节点下 添加以下内容:
<uses-library
android:name="org.apache.http.legacy"
android:required="false" />
webview打开网页显示:net::ERR_CLEARTEXT_NOT_PERMITTED
解决:webview未适配9.0系统。
Permission denied, please try again.
密码错误或者远程Git项目未设置ssh key.
mac中adb: command not found
未配置Android的环境变量。因此,您需为Mac中的Android SDK配置环境变量。
1、打开终端
2、进入当前用户的home目录:进入当前用户的home目录
3、创建.bash_profile文件:touch .bash_profile
4、编辑.bash_profile文件:open -e .bash_profile
5、在.bash_profile文件中输入:。
export PATH=/Users/您的用户名/文件路径/platform-tools/:$PATH
注意,多个路径时以“:”隔开且末尾不需要加
:$PATH
,如export PATH=${PATH}:/Users/ShaneChen/Documents/android-sdk-macosx/platform-tools:/Users/ShaneChen/Documents/android-sdk-macosx/tools
6、保存并关闭文件
7、更新刚配置的环境变量:source .bash_profile
8、验证配置是否成功:adb
注意:as中adb的生效晚于在终端配置的时间。
Resources$NotFoundException: Drawable … with resource ID #0x7f07010b
说明:我把一个TextView的背景设置为以下drawable xml文件
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="#409EFF"/>
<item android:color="@android:color/black"/>
</selector>
解决:因为背景只能设置为drawable类型或其子类型(shape等),而这里却把color作为drawable类型。因为我有另一个类似的文件设置给TextView的文本颜色,以为设置背景的drawable xml写法与设置文本颜色一样。原来一直以为是组件化模块依赖的问题,还在这个角度查找问题解决方案。最终还是再认真揣摩了一下报错日志中有这么一句:”item> tag requires a ‘drawable’ attribute or child tag defining a drawable“,发现color类型应该不能在xml里面转成drawable使用。所以就改成shape标签写法了,问题就解决了。
控件明明设置了onClickListener,但是点击了始终没有反应。
解决:可能是其他地方也对这个控件设置了onClickListener,而且早于你所设置的时间,所以占用了事件监听。我遇到的是被databinding库的android:onClick=”@{vm.onClick}”占用了,由于我自己设置监听却忘记删掉databinding的监听。
-java.lang.ClassCastException: com.chad.library.adapter.base.viewholder.BaseViewHolder can not cast to …BaseDataBindingHolder
解决:将AS日志窗口过滤器选择verbose,可以看到另一个实际的异常。因为BRVAH里面的实现是把异常捕捉后打印的。我这次异常的实际原因是使用databinding的@BindAdapter时,方法不是静态的。而我是如何最终发现是这个原因呢?刚开始我并不知道切换到verbose下能直接看到实际错误,直到我开启调试,一步一步从BRVAH的源码中发现上面的原理,最后才切换到verbose看到实际的异常日志。
-The drawable “xxx” in drawable has no declaration in the base drawable folder or in a drawable-densitydpi folder; this can lead to crashes when the drawable is queried in a configuration that does not match this qualifier
解决:重启AS
-gson序列化出现的异常:can not make a java.lang.reflect.method constructor accessible
stackoverflowerror:stack size 1037kbs
java.util.LinkedList.listIterator(LinkedList.java:867)
原因及解决:模型类中包含了应用上下文,因为我需要在模型中引用string.xml文件中的字符串。解决方案就是让gson序列化时跳过这个字段或者你删除这个应用上下文变量。具体解决可参考:https://www.iteye.com/blog/kanpiaoxue-2441160
**-对象(包含了应用上下文变量)在intent中传输导致:
java.lang.RuntimeException: Parcelable encountered IOException writing serializable object (name = package.Model)
解决:删除应用上下文字段。
-依赖自创的远程库后sync出现:Affected Modules: app错误。
解决:多sync几次。
-Could not find com.github.bumptech.glide:compiler:null.
解决:依赖的配置中版本没有值。
-…/…/.gradle/caches/transforms-2/files-2.1/8516ac599c0f39cda6e75249f41fc5c3/appcompat-v7-28.0.0/res/values-v28/values-v28.xml
AAPT: error: resource android:attr/dialogCornerRadius not found.
…/…/.gradle/caches/transforms-2/files-2.1/ccf94a4f227dfa4f17156620e28a8b98/support-compat-28.0.0/res/values/values.xml
AAPT: error: resource android:attr/fontVariationSettings not found.
AAPT: error: resource android:attr/ttcIndex not found.
解决:依赖的库使用了高版本28的sdk,在这个是v7包和v4包,而我的项目的编译sdk版本是27。所以打包时会找不到28或者说依赖的库所需的文件。降低依赖库的版本即可。
-编译报错:Process ‘command ‘E:\Android\jre\bin\java.exe’’ finished with non-zero exit value 1
解决:检查电脑内存是否已满
-吐司显示不出来
解决方案:检查构建吐司的参数、执行线程或者系统管理是否关闭了应用的通知功能。
-AAPT: error: resource android:attr/dialogCornerRadius not found
AAPT: error: resource android:attr/fontVariationSettings not found.
AAPT: error: resource android:attr/ttcIndex not found.
解决:项目依赖的库中依赖的support库版本(28.0.0)高于项目对应的版本(27.1.1)。修改项目编译sdk版本(改为28) >= 依赖的库对应的版本(28)。
-databinding错误: 找不到符号 符号: 类 Activity Impl
解决:通常是由于布局文件中对VM的变量或方法引用不正确导致。
查看更详细原因:
打开AS右边的gradle,选择对应的任务执行,在下面的输出窗口会看到详细原因。
-Didn’t find class "androidx.databinding.DataBinderMapperImpl
解决:在项目的每个module内的build文件中加入
android {
dataBinding {
enabled = true
}
}
-项目运行报错Error: Static interface methods are only supported starting with Android N (–min-api 24)
错误原因:这是因为java8才支持静态接口方法的原因
解决办法:在每个模块的build.gradle文件中配置使用java8编译:
android {
…
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
重新运行项目即可运行成功
用netty写Android端服务器,运行直接崩溃
上关键日志:
09-09 23:16:58.945: E/AndroidRuntime(12407): io.netty.channel.ChannelException: Unable to create Channel from class
class io.netty.channel.socket.nio.NioServerSocketChannel
09-09 23:16:58.945: E/AndroidRuntime(12407): Caused by: io.netty.channel.ChannelException: Failed to open a server
socket.
09-09 23:16:58.945: E/AndroidRuntime(12407): at java.net.ServerSocket.<init>(ServerSocket.java:59)
双击日志跳转到我写的代码中:
ChannelFuture future = server.bind(AppConstants.PORT_LOCAL).sync();
解决方法:
查看手机是否联网和在minifest文件中添加所有和网络相关的权限。我是用以下这些:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
使用DialogFragment封装对话框,启动时报错:No Activity
原因:我在要显示在activity中的OneFragment的父类BaseFragment中初始化了一个全局变量,代码为:
private FragmentManager manager = getChildFragmentManager();
分析和解决:估计不允许这么做,于是只能删掉这行代码,另辟蹊径了,后来也真可以不用这行代码也能实现用fragment调起dialogfragment了。
服务中弹出的系统级对话框不能在线程中创建,必须在主线程中(服务的方法)里。
业务需求是在服务中弹出一个“有可更新软件版本的”对话框,即全局对话框,在网上找到了代码,然而我需要在线程中循环隔一天判断一次版本号,索性有新版本直接在服务开启的线程中弹出对话框,但是一直无法弹出。最后把创建对话框的方法搬到服务的方法中就可以了,太坑了。
监听网络状态改变接收器可以在minifest文件中注册,若使用不正常,请检查手机系统是否把软件的相关权限禁用了。
我测试的时候用的是三星手机,安装完软件后我没看清楚他弹出的权限列表以及开关状态我就忽略过了,测了老半天,没有接受到网络状态的改变,最后才发现,然后把“自动运行”这个管理打开就正常了。。
java.lang.UnsatisfiedLinkError: Native method not found
说明:当我按照成功运行的别人的demo搬好代码运行操作,闪退出现了。我刚开始以为so文件没有加载到本地系统存储目录中,然后检查发现有相应的so文件,然后我就没有头绪了,直接上百度了,真让我找到了问题的解决方案。
解决:必须按照厂家提供的demo中的包名来放置类,否则报错。