Android开发报错解决

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
  • 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"))
  • 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)下的根添加

      kotlin 复制代码
      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
  • 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
      java 复制代码
      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,解决方法如下:

    kotlin 复制代码
    compileOptions {
      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请求。

    • 解决方法:

      1. 项目改用https请求,安全性更高,但需要后台配合

      2. 将gradle中的targetSdkVersion 降到27以下 (不推荐,治标不治本)

      3. 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之后的版本已解决。

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());
相关推荐
鸿蒙布道师3 小时前
鸿蒙NEXT开发动画案例2
android·ios·华为·harmonyos·鸿蒙系统·arkui·huawei
androidwork3 小时前
Kotlin Android工程Mock数据方法总结
android·开发语言·kotlin
xiangxiongfly9155 小时前
Android setContentView()源码分析
android·setcontentview
人间有清欢6 小时前
Android开发补充内容
android·okhttp·rxjava·retrofit·hilt·jetpack compose
每次的天空9 小时前
Android学习总结之kotlin协程面试篇
android·学习·kotlin
每次的天空11 小时前
Android学习总结之Binder篇
android·学习·binder
峥嵘life11 小时前
Android 有线网开发调试总结
android
是店小二呀12 小时前
【算法-链表】链表操作技巧:常见算法
android·c++·算法·链表
zhifanxu13 小时前
Kotlin 遍历
android·开发语言·kotlin