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());
相关推荐
aningxiaoxixi2 小时前
android stdio 的布局属性
android
CYRUS STUDIO3 小时前
FART 自动化脱壳框架一些 bug 修复记录
android·bug·逆向·fart·脱壳
寻找优秀的自己4 小时前
Cocos 打包 APK 兼容环境表(Android API Level 10~15)
android·cocos2d
大胃粥5 小时前
WMS& SF& IMS: 焦点窗口更新框架
android
QING6185 小时前
Gradle 核心配置属性详解 - 新手指南(二)
android·前端·gradle
QING6185 小时前
Gradle 核心配置属性详解 - 新手指南(一)
android·前端·gradle
_一条咸鱼_8 小时前
Android Runtime内存管理子系统启动流程原理(13)
android·面试·android jetpack
法迪8 小时前
Android的uid~package~pid的关系
android
二流小码农9 小时前
鸿蒙开发:hvigorw,一个你不得不去了解的神器
android·ios·harmonyos