Android开发报错解决
Android开发报错解决
- 组件相关
- 文件相关
- 权限相关
- 代码相关
- 程序报错
- IDE相关
- 版本对应
- 框架
- okhttp
- 请求失败
- Room
- no such table
- cocos2d
组件相关
- 使用gravity属性让文字居中是,需把该属性放在text属性上面
- ScrollView只能容纳一个子视图
文件相关
-
放在drawble下的图片资源名称不能大写
-
gradle-wrapper下载超时,在gradle-wrapper.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)
- 解决:(注:文件名不能带冒号)
<!--公共存储空间读写权限申请--><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!--申请了写权限后,android-10以上还要在application标签下添加以下属性:-->
android:requestLegacyExternalStorage="true"
-
从Android 9(Pie)开始,默认情况下,非加密的流量(即使用HTTP而不是HTTPS)是不被允许的
- 解决方法1:配置网络安全配置文件
<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方法)
class DrawView : View {private lateinit var bitmap: Bitmapprivate lateinit var myCanvas: Canvasprivate 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.xval y = event.ywhen (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不同
// 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)下的根添加
kotlin {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
if (android.os.Build.VERSION.SDK_INT > 9) {StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy); }
- 使用线程/协程来操作网络请求
-
-
Unresolved reference: VERSION_1_8,解决方法如下:
compileOptions {sourceCompatibility = VERSION_1_8targetCompatibility = 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系主题
<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:哪有有问题就回避
<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”。
-
-
参考文章:关于网络请求报错:CLEARTEXT communication to xx.xx.xx.xx not permitted by network security policy_clearatext communication to-CSDN博客
-
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之后的版本已解决。
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
- 原因:该节点已有父亲
- 解决方法如下:
// 原报错代码: this.addChild(plant.getShowPlant());// 修改为: plant.getShowPlant().setParent(null); this.addChild(plant.getShowPlant());