当前位置: 首页 > news >正文

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
  • 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不同

      // 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
  • 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请求。

    • 解决方法:

      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.xJDK 8 到 JDK 17(包括 JDK 16)Gradle 7.x 不再支持 JDK 8 以下版本,建议使用 JDK 11 或更高版本。
Gradle 6.xJDK 8 到 JDK 16支持 JDK 8 到 JDK 16,JDK 17 不受支持。
Gradle 5.xJDK 8 到 JDK 14支持 JDK 8 到 JDK 14,JDK 15 及以上版本不受支持。
Gradle 4.xJDK 7 到 JDK 9支持 JDK 7 到 JDK 9,JDK 10 及以上版本不受支持。
Gradle 3.xJDK 7 和 JDK 8Gradle 3.x 不支持 JDK 9 及以上版本。
  • 插件版本 与 Gradle
插件版本所需的gradle最低版本
8.48.6
8.38.4
8.28.2
8.18.0
8.08.0
7.47.5
7.37.4
7.27.3.3
7.17.2
7.07.0
4.2.0+6.7.1
4.1.0+6.5+
4.0.0+6.1.1+
3.6.0 - 3.6.45.6.4+
3.5.0 - 3.5.45.4.1+
3.4.0 - 3.4.35.1.1+
3.3.0 - 3.3.34.10.1+
3.2.0 - 3.2.14.6+
3.1.0+4.4+
3.0.0+4.1+
2.3.0+3.3+
2.1.3 - 2.2.32.14.1 - 3.5
2.0.0 - 2.1.22.10 - 2.13
1.5.02.2.1 - 2.13
1.2.0 - 1.3.12.2.1 - 2.9
1.0.0 - 1.1.32.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());
    

相关文章:

  • 正则表达式实战指南:原理、口诀与高频场景案例
  • 姚琛全新特别版EP上线 携手金牌制作人诠释夏日浪漫
  • Python 基础知识
  • 正则表达式(Regular Expression)详解
  • 配置VS的DLL文件引用目录(两种方案,无需每次生成dll后手动将其复制到exe目录下)
  • 表面等离子共振技术(SPR)在小分子与蛋白质相互作用研究中的应用
  • MyBatis 动态 SQL 完整笔记
  • 世界少棒联盟(Little League Baseball)·棒球1号位
  • 【LangChain基础系列】深入全面掌握文本分类
  • C——VS的调试技巧
  • 更多 QVariant 使用案例
  • Python序列Day3
  • 如何对 Oracle 日志文件进行校验
  • 钯铂贵金属分离回收树脂
  • Nginx 配置多个监听端口
  • obj = null; 赋值null之前没有其他引用指向obj对象,那么,当obj=null时,会被垃圾回收机制立即回收吗?
  • 编程题 02-线性结构2 一元多项式的乘法与加法运算【PAT】
  • PostgreSQL 的 pg_current_logfile 函数
  • 【Ubuntu】Netplan静态网络配置
  • 缺乏实体人形机器人的主流高精度仿真方案
  • 马上评|让“贾宝玉是长子长孙”争议回归理性讨论
  • 国家主席习近平同普京总统签署关于进一步深化中俄新时代全面战略协作伙伴关系的联合声明
  • 花20万骑自行车?CityRide带火“骑行经济”
  • 又一日军“慰安妇”制度受害者去世,大陆在世幸存者仅7人
  • 中邮保险斥资8.69亿元举牌东航物流,持股比例达5%
  • 观察|22项达全球最优,世行为上海营商环境“盖章”