Android开发报错解决
组件相关
- 使用gravity属性让文字居中是,需把该属性放在text属性上面
- ScrollView只能容纳一个子视图
文件相关
-
放在drawble下的图片资源名称不能大写
-
gradle-wrapper下载超时,在gradle-wrapper.properties文件修改:
properties
distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-7.5-bin.zip
# distributionUrl=https://mirrors.cloud.tencent.com/gradle/gradle-8-bin.zip
- 去掉CheckBox或RadioButton(单选按钮)的默认显示框:设置属性
android:button="@null"
- 目的:可以通过selector的checked状态实现背景图片的自动切换
权限相关
- FileNotFoundException: /storage/emulated/0/Pictures/2024-04-10_22:47.jpg (Protocol error)
- 解决:(注:文件名不能带冒号)
xml
<!--公共存储空间读写权限申请-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--申请了写权限后,android-10以上还要在application标签下添加以下属性:-->
android:requestLegacyExternalStorage="true"
-
从Android 9(Pie)开始,默认情况下,非加密的流量(即使用HTTP而不是HTTPS)是不被允许的
- 解决方法1:配置网络安全配置文件
xml<network-security-config> <base-config cleartextTrafficPermitted="true"> </base-config> </network-security-config>
application
标签加上属性android:networkSecurityConfig="@xml/network_security_config"
- 解决方法2:
application
标签加上属性android:usesCleartextTraffic="true"
代码相关
- Paint问题:修改paint的颜色/画笔粗细时,再调用
canvas.drawPath(path, paint)
方法时,之前画好的图像也改变了。- 解决:给canvas一个bitmap对象,保存到bitmap的path是持久化的,不会重绘(注:修改属性时,记得调用path.reset方法)
kotlin
class DrawView : View {
private lateinit var bitmap: Bitmap
private lateinit var myCanvas: Canvas
private val paint: Paint = Paint()
private val path: Path = Path()
constructor(context: Context) : super(context)
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
init {
paint.strokeWidth = 5F // 初始化画笔粗细
paint.style = Paint.Style.STROKE // 设置类型为描边,默认是填充
paint.isAntiAlias = true // 启用抗锯齿效果,是线条更平滑
paint.color = Color.GREEN
}
@SuppressLint("DrawAllocation")
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
myCanvas = Canvas(bitmap)
myCanvas.drawColor(Color.WHITE) // 设置画板的背景为白色
}
override fun onTouchEvent(event: MotionEvent): Boolean {
val x = event.x
val y = event.y
when (event.action) {
// 开始触摸
MotionEvent.ACTION_DOWN -> {
path.moveTo(x, y)
}
// 滑动
MotionEvent.ACTION_MOVE -> {
path.lineTo(x, y)
}
// 结束触摸
MotionEvent.ACTION_UP -> {
}
}
invalidate()
return true
}
override fun draw(canvas: Canvas) {
super.draw(canvas)
myCanvas.drawPath(path, paint)
canvas.drawBitmap(bitmap, 0F, 0F, null)
}
fun setColor(color: Int) {
path.reset()
paint.color = color
}
}
Toast.makeText
不显示,解决方法:- 方法1:使用Cold Boot Now
- 方法2:更新
Android Emulator
的版本(未验证)
程序报错
-
Algorithm HmacPBESHA256 not available
- 解决:设置 => 构建、执行、部署 => 构建工具 => gradle,修改gradle JVM的版本为jbr17
-
Dependency 'androidx.lifecycle:lifecycle-viewmodel:2.6.2' requires libraries and applications that
depend on it to compile against version 33 or later of the
Android APIs.
- 解决:修改build.gradle文件相关属性为:
compileSdk 33,targetSdk 33
- 解决:修改build.gradle文件相关属性为:
-
Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules kotlin-stdlib-1.8.22 (org.jetbrains.kotlin:kotlin-stdlib:1.8.22) and kotlin-stdlib-jdk8-1.7.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21)
- 解决:在Gradle Scripts => build.gradle.kts => dependencies里添加:
implementation(platform("org.jetbrains.kotlin:kotlin-bom:1.8.0"))
- 解决:在Gradle Scripts => build.gradle.kts => dependencies里添加:
-
Cannot find implementation for com.example.biluo.database.UserDatabase. UserDatabase_Impl does not exist
-
注意:@Entiy注解标识的类不能有构造方法
-
原因:room依赖的引入在kotlin下和java不同
groovy// build.grade文件 //java中room依赖的导入: implementation 'androidx.room:room-runtime:2.5.0' annotationProcessor 'androidx.room:room-compiler:2.5.0' // kotlin中要改成: // plugins要先加上:id 'kotlin-kapt' implementation 'androidx.room:room-runtime:2.5.0' kapt 'androidx.room:room-compiler:2.5.0'
-
-
Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.8.0, expected version is 1.6.0.
-
解决:在保证kotlin版本是大于等于1.8.0的前提下,在build.gradle(:app)下的根添加
kotlinkotlin { version '1.9.10' }
-
-
SDK location not found. Define a valid SDK location with an ANDROID_HOME environment variable or by setting the sdk.dir path in your project's local properties file at 'D:\Download\Doraemon-pre-release\local.properties'.
- 解决:在根项目下的local.properties(没有创建)中加上
sdk.dir=D\:\\Android\\Sdk
- 解决:在根项目下的local.properties(没有创建)中加上
-
Binary XML file line #20: Error inflating class fragmen
- 解决:静态注册的fragment所在布局文件对应的Activity不能用binding
- 网上:
- fragment标签要有id
- 标签对应的类路径不能写错
- 对应Activity要继承AppCompatActivity或FragmentActivity,而不能继承Activity
-
Binary XML file line #10: Error inflating class com.example.demo.DrawView
- 原因:自定义View使用时报错,继承View时没有实现它的三个构造方法
-
Unable to create application com.example.chat.MyApplication: android.os.NetworkOnMainThreadException
-
原因:一个APP如果在主线程中请求网络操作,将会抛出此异常。Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。( Android 4.0 之后不能在主线程中请求HTTP请求)
-
解决:
- 使用StrictMode
javaif (android.os.Build.VERSION.SDK_INT > 9) { StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); }
- 使用线程/协程来操作网络请求
-
-
Unresolved reference: VERSION_1_8,解决方法如下:
kotlincompileOptions { sourceCompatibility = VERSION_1_8 targetCompatibility = VERSION_1_8 } // 在上面的VERSION_1_8加上前缀:JavaVersion.
-
You need to use a Theme.AppCompat theme with this activity
-
原因:继承了AppCompatActivity的类如果配置是非AppCompat主题,会导致Activity无法启动。因为AppCompat 框架的诸多后续处理紧密关联该主题配置的属性。因此在加载画面前将严格检查是否采用了 AppCompat 系主题,否则将抛出异常。
-
解决方法:
- 方法1:主题改为AppCompat系主题
xml<style name="Theme.Mvsapp" parent="android:Theme.Material.Light" /> <!--改为--> <style name="Theme.Mvsapp" parent="Theme.AppCompat.Light" />
- 方法2:继承的Activity改用 SDK 版本
android.app.Activity
(不推荐,因为很多常用的框架都依赖于AppCompatActivity) - 方法3:哪有有问题就回避
xml<style name="Theme.Mvsapp" parent="android:Theme.Material.Light" /> <!--例如上面检查的是是否配置了AppCompat提供的windowActionBar属性,那么加上即可--> <style name="Theme.Mvsapp" parent="android:Theme.Material.Light"> <item name="windowActionBar">true</item> </style>
-
-
CLEARTEXT communication to xx.xx.xx.xx not permitted by network security policy
-
原因:Android P 将禁止 App 使用所有未加密的连接,所以高版本默认不支持http请求。
-
解决方法:
-
项目改用https请求,安全性更高,但需要后台配合
-
将gradle中的targetSdkVersion 降到27以下 (不推荐,治标不治本)
-
manifest文件中application标签配置上
android:usesCleartextTraffic="true"
android:usesCleartextTraffic 指示应用程序是否打算使用明文网络流量,例如明文HTTP。目标API级别为27或更低的应用程序的默认值为" true"。面向API级别28或更高级别的应用默认为" false"。
-
-
IDE相关
- 重写方法参数为p0,p1...或arg0,agr1...
- 解决:下载源码(如果是通过反编译获取的方法参数名,就为arg之类的)
- 无法查看数据库:在真机下使用
App inspection
无法查看数据库(使用雷电模拟器本地连接下)- 解决:将本地连接改为远程连接(相当于从USB调试改为wifi远程调试)
版本对应
- JDK 与 Gradle
Gradle 版本 | 支持的 JDK 版本 | 备注 |
---|---|---|
Gradle 7.x | JDK 8 到 JDK 17(包括 JDK 16) | Gradle 7.x 不再支持 JDK 8 以下版本,建议使用 JDK 11 或更高版本。 |
Gradle 6.x | JDK 8 到 JDK 16 | 支持 JDK 8 到 JDK 16,JDK 17 不受支持。 |
Gradle 5.x | JDK 8 到 JDK 14 | 支持 JDK 8 到 JDK 14,JDK 15 及以上版本不受支持。 |
Gradle 4.x | JDK 7 到 JDK 9 | 支持 JDK 7 到 JDK 9,JDK 10 及以上版本不受支持。 |
Gradle 3.x | JDK 7 和 JDK 8 | Gradle 3.x 不支持 JDK 9 及以上版本。 |
- 插件版本 与 Gradle
插件版本 | 所需的gradle最低版本 |
---|---|
8.4 | 8.6 |
8.3 | 8.4 |
8.2 | 8.2 |
8.1 | 8.0 |
8.0 | 8.0 |
7.4 | 7.5 |
7.3 | 7.4 |
7.2 | 7.3.3 |
7.1 | 7.2 |
7.0 | 7.0 |
4.2.0+ | 6.7.1 |
4.1.0+ | 6.5+ |
4.0.0+ | 6.1.1+ |
3.6.0 - 3.6.4 | 5.6.4+ |
3.5.0 - 3.5.4 | 5.4.1+ |
3.4.0 - 3.4.3 | 5.1.1+ |
3.3.0 - 3.3.3 | 4.10.1+ |
3.2.0 - 3.2.1 | 4.6+ |
3.1.0+ | 4.4+ |
3.0.0+ | 4.1+ |
2.3.0+ | 3.3+ |
2.1.3 - 2.2.3 | 2.14.1 - 3.5 |
2.0.0 - 2.1.2 | 2.10 - 2.13 |
1.5.0 | 2.2.1 - 2.13 |
1.2.0 - 1.3.1 | 2.2.1 - 2.9 |
1.0.0 - 1.1.3 | 2.2.1 - 2.3 |
框架
okhttp
请求失败
10秒请求失败后就会抛出超时异常,解决方法:设置超时时间大一点。
如果设置超时时间无效,需要retryOnConnectionFailure
设置为false,关闭okhttp的重试机制。该问题在3.4.1之后的版本已解决。
kotlin
OkHttpClient.Builder()
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.retryOnConnectionFailure(false)
.build()
Room
no such table
报错:There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such table: user_msg)
原因:数据库名不能带下划线
cocos2d
使用cocos2d-android.jar时报的各种错:
-
报错:aused by: java.lang.AssertionError: TMX: unsupported compression method
- 原因:地图的tmx文件中的图块层压缩格式zlib不被支持
- 解决方法:使用tiled编辑器修改tmx文件的压缩方式为gzip(不能为无压缩,否则报错:Attempt to invoke virtual method 'int java.nio.IntBuffer.get(int)' on a null object reference)
- tiled编辑器地址:Tiled | Flexible level editor (mapeditor.org)
-
报错:java.lang.AssertionError: Layer#ccTouchBegan override me
- 原因:
return super.ccTouchesBegan(event)
该代码调用的方法内部有assert false : "Layer#ccTouchBegan override me"
- 解决方法:直接改成
return true
- 原因:
-
报错:java.lang.AssertionError: child already added. It can't be added again
- 原因:该节点已有父亲
- 解决方法如下:
java// 原报错代码: this.addChild(plant.getShowPlant()); // 修改为: plant.getShowPlant().setParent(null); this.addChild(plant.getShowPlant());