网站设计集团浙江省建筑诚信平台查询系统
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()); 
