以后我遇到所有的适配问题都会放置在这个简书里面
1、魅族APK安装报错:
测试手机:华为8.0两款(分刘海屏和非刘海屏),小米两款,oppo两款,魅族一款,vivo一款,锤子一款
只有魅族报错,
报错内容如下
DELETE_FAILED_INTERNAL_ERROR,
Error while Installing APKs
无法安装完全不知道什么鬼,除开魅族手机,其余测试手机都能直接通过debug安装,两个小时多个开发代码版本对比发现,是库和Gradle的锅,这里建议Gradle版本降至3.2.1,不会影响Androidx也不会影响大多数库。
小米手机目前是所有测试机器中最垃圾的,debug测试卡顿这个问题一年了都没得人修复,社区直接删除了debug卡顿的反馈,直接不修复这个,操作秀到我了666,垃圾,测试一次麻烦得要死。
2、全屏适配:Only fullscreen opaque activities can request orientation错误崩溃
描述:activity弹出activitytwo,其中
找到你设置透明的Activity,将theme
<item name="android:windowIsTranslucent">true</item>
改成
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowDisablePreview">true</item>
有时候这就搞定了
但有时候还不行,不行怎么办?继续改,在AndroidManifest中对应的activity下面添加如下代码,让他跟着父页面进行屏幕适应
android:screenOrientation="behind"
nice搞定,还不行私聊??
3、单例音乐循环播放导致主页面动画卡顿,报错为:MEDIA_PLAYBACK_COMPLETE(2)
情况:主页全是动画,目测最少12个json动画(每个动画各个渲染方式也挺多的,这里就不讲了)
MediaPlayer使用如下
private static MediaPlayer mediaPlayer = null;//声明一个MediaPlayer对象
public static void playBGSound(final Activity activity) {
if (mediaPlayer != null) {
mediaPlayer .release();//释放资源
}
mediaPlayer = MediaPlayer.create(activity, R.raw.music);
mediaPlayer .setVolume(0.5,0.5);
mediaPlayer .setLooping(true);//循环不再做骚操作了,直接循环了
mediaPlayer .start();
// //为MediaPlayer添加播放完成事件监听 //下面的写法会与主页面冲突,会导致卡顿
// mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
// @Override
// public void onCompletion(MediaPlayer mp) {
// try {
// Thread.sleep(3000);//让线程休眠3秒
// playBGSound(activity);//重新播放音乐
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// }
// });
}
神奇的bug
4、最近又发现了一个麻烦的问题,Android弹窗的问题,用activity弹出activity不能全屏的问题(dialog弹出会引出虚拟按键,给用户一种屏幕在动的赶脚,太LOW了,当然这里说的仅只是app全屏的情况,非全屏完全不用考虑,直接用dialog就行)
弹窗问题实现后续会贴上来,先说解决办法:
Window window = this.getWindow();//this===当前activity
window .setType( WindowManager.LayoutParams.TYPE_APPLICATION_PANEL);
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
window.setLayout( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
直接强制全屏,网上有很多发什么
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);//(鸡毛用没有)
做个记录大家看一下
5、新问题:突然发现的,前后台切换,有时候会导致触发系统GC,会干掉你的部分数据
应用进入后台,系统可能因为内存紧张而杀掉activity,一般的页面还行,但是当你的页面有滚动条的时候就尴尬了啊,他有可能干掉你滚动条setProgress(int),int可能为空,哦 卖狗的,不说了,提高优先级,防止被kill。
application 里面添加android:persistent="true"
设置后app提升为系统核心级别,只要不是用户主动kill掉就不会被kill掉
还有一些方法,比如保存数据,我这里更加推荐数据保存的方式,存储在SharedPreference里面,在application 里面初始化主要的数据也行,数据保存就不多说了,网上一搜一大把,自己找找,用什么办法看自己吧!这个错误记录到这里了。
扩展:我本以为只有上面这种:系统可能因为内存紧张而杀掉activity,实际还有一种可能,后续更新,https://www.jianshu.com/p/635970ac603a里面提到的,也是可以解决的。
6、关于webview加载html(不能用腾讯的X5内核,腾讯X5内核截止到现在都不支持直接调用本地域名地址---被这个问题搞到绝望,最后才发现)
1、webview加载本地手机SD存储的html(图片也在本地)
体验比较好,加载速度快,包小
2、webview加载assert里面的html文件(不推荐,html内容比较多的情况下,包很大)
3、webview加载类似wap的网页url(图片和域名都采用http/https)(图片加载缓慢,体验不好)
4、webview加载类似wap的网页url(域名都采用http/https,图片下载在本地)
这个方法需要重写WebResourceResponse拦截url,把图片转文件流再放到html上去,缺点很明显,低端机经常加载不出来,尴尬
具体代码需要可以留言,主要是网上很多,这里也不想过多缀述不然看着累
一切为了体验和性能加油
7、继续升级Android studio3.5,报错Unable to start the daemon process
org.gradle.jvmargs=-Xmx1536m改成
org.gradle.jvmargs=-Xmx512m
8、这里说一个android studio比较奇怪的一个问题,打包失败的情况,android studio并不是每次都打包成功,极少极少的情况会出现打包失败的情况,因此在做打包的操作的时候,需要先clean project一遍然后再rebuild一遍,最后再去通过build进行打包,习惯很重要啊
9、错误报错:如下
Rejecting re-init on previously-failed class java.lang.Class<okhttp3.internal.platform.ConscryptPlatform$configureTrustManager$1>
解决办法:添加库文件如下即可解决
implementation 'org.conscrypt:conscrypt-android:2.2.1'
10、报错内容如下:
Rejecting re-init on previously-failed class java.lang.Class<androidx.core.view.ViewCompat$2>: java.lang.NoClassDefFoundError: Failed resolution of: Landroid/view/View$OnUnhandledKeyEventListener;
很多人都在说降低版本就行,确实是一个解决办法,
11、升级android studio4.0版本报错
报错情况 正确修改方式
response.body.string() response.body?.string().toString()
类似下面这种写法
var url: String? = null
Log.e("urlagent", url)
改成
var url: String? = null
Log.e("urlagent", url!!)
现在定义后要做为空的检查了。。
12、Android WebView 加载失败net::ERR_CLEARTEXT_NOT_PERMITTED
方法1(有可能没用):在application里面添加如下(Android 9.0(API级别28)开始,默认情况下禁用明文支持)这里打开明文支持,不过没得有可能有用
android:usesCleartextTraffic="true"
方法2(实测有用):res 下新建 xml 目录新建文件network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
AndroidManifest.xml 的 application里再添加
android:networkSecurityConfig="@xml/network_security_config"
13、android WebView LayoutAlgorithm.SINGLE_COLUMN失效问题
webView.getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);只针对4.4以下有效,4.4后就无效了,目前比较常用的方式就是在html的标签里面添加
width: 100%;height: auto;
14、添加线程报错
结果Call from user 0 as user without permission INTERACT_ACROSS_USERS
目前不知道为什么,还早找原因,线程添加的object的wait和notify
不加就没事,加了就直接报错
15、xml无法编译
网上说的删除.im文件啊,什么勾选啊之类的全部无效
我用了个最最直白的方式,直接删除下载最新版
https://developer.android.google.cn/studio/#downloads
16、PictureSelector has no zero argument constructor
End of input at character 0 of
17 高德地图嵌入卡顿问题,
可能的情况有两种
1、高德版本问题
这个情况升级版本就行,有问题的版本可能是7.几的版本。具体是多少忘记了
2、外层嵌套问题,导致焦点获取不准确
外层只要嵌入NestedScrollView或者ScrollView等滚动类型的控件都会出现这样的问题
需要对页面进行重新布局就行,不行的话,你就只有监听点击事件对对应的区域进行管理就行
18 No signature of method: build_tyj1ke2ug0kj94sw357d7sh2.android() is applicable for argument types:
19
20 Only the original thread that created a view hierarchy can touch its views
原代码中
fun init(){
var timer = Timer()
timer.cancel()
timer = Timer()
var timerTask: TimerTask = object : TimerTask() {
override fun run(){
timeRefresh()
}
}
timer.schedule(timerTask, 30*1000) //30秒
}
因为是费时的操作(如网络连接以及楼上的timer)需要另开线程
新开的线程中需要对UI进行设定,就可能违反单线程模型,
因此android采用一种的Message Queue机制保证线程间通信。
private val COMPLETED = 0
handlerTimer.sendEmptyMessage(COMPLETED);
private var thread: Thread? = null
@SuppressLint("HandlerLeak")
private val handlerTimer: Handler = object : Handler() {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
thread = Thread(Runnable { // 子线程中解析省市区数据
//......处理比较耗时的操作
if(CameraTimeDialog.saveStation!=1){
//每隔30秒刷新一次
timer.cancel()
if(CameraTimeDialog.timeChange!=0){
timer = Timer()
var longTime=CameraTimeDialog.timeChange*60
// 创建计时器任务
var timerTask: TimerTask = object : TimerTask() {
override fun run(){
//耗时线程
}
}
// 添加任务,设定开始计时器时间,第2个参数为时间单位毫秒,如果是0,立即执行
timer.schedule(timerTask, longTime.toLong()*1000)
}
}
})
thread!!.start()
}
}
20 AGPBI: {"kind":"warning","text":"Expected stack map table for method with no
gradle.properties文件中添加android.enableR8=false即可解决,不使用R8就行
改后报错:
Failed to apply plugin 'com.android.internal.application'.
> The option 'android.enableR8' is deprecated.
It was removed in version 7.0 of the Android Gradle plugin.
Please remove it from `gradle.properties`.
21 更换Gradle到11导致报错如下,虽然仍然可以编译运行,但是速度奇慢无比
API 'android.registerTransform' is obsolete.
It will be removed in version 8.0 of the Android Gradle plugin.
The Transform API is removed to improve build performance. Projects that use the
Transform API force the Android Gradle plugin to use a less optimized flow for the
build that can result in large regressions in build times. It’s also difficult to
use the Transform API and combine it with other Gradle features; the replacement
APIs aim to make it easier to extend the build without introducing performance or
correctness issues.
解决办法如下:
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
改成将未改的版本改成目前自己使用的版本即可
compileOptions {
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
kotlinOptions {
jvmTarget = '11'
}
22 视频捕捉某个时间点的第一帧图片报错mediaMetadataRetriever.setDataSource报错
val mediaMetadataRetriever = MediaMetadataRetriever()
mediaMetadataRetriever.setDataSource(file_path)
var timeMs=1 //秒
//视频读取需要使用微妙,因此需要*1000*1000
val bitmap: Bitmap? = mediaMetadataRetriever.getFrameAtTime((timeMs*1000 * 1000).toLong(),MediaMetadataRetriever.OPTION_CLOSEST)
添加try catch就好
23 2023年常用优化方向
1、使用内存友好的数据结构 SpareseArray,ArrayMap
2、避免内存泄漏,避免长生命周期对象持有短生命周期对象
3、使用池结构,复用对象避免内存抖动。
4、根据手机内存大小,设置内存缓存的大小。
5、多进程,扩大可使用内存
6、通过ComponentCallback2 监听内存吃紧,进行内存缓存的释放
24 如何避免内存oom
1、获取当前可用内存
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
//最大分配内存
int memory = activityManager.getMemoryClass();
System.out.println("memory: "+memory);
//最大分配内存获取方法2
float maxMemory = (float) (Runtime.getRuntime().maxMemory() * 1.0/ (1024 * 1024));
2、通过LruCache设置整个app最大缓存,针对有大规模数据使用场景进行限制
25 报错 com.android.tools.r8.CompilationFailedException: Compilation failed to complete, origin: ..../BuildConfig.dex
修改multiDexEnabled true
26Failed to transform searchkit-ui-9.3.0.aar to match attributes {artifactType=android-classes-jar, or
searchkit-ui-9.3.0.aar损坏
27 Couldn't terminate the existing process for com.skyz.app. Device is offline.
重启adb.exe
28 Unsupported class file major version 61
jdk版本过高,或者不匹配,适配jdk版本就好
29 Could not set unknown property 'includeCompileClasspath' for AnnotationProcessorOptions_Decorated{classNames=[], arguments={}, compilerArgumentProviders=[]} of type com.android.build.gradle.internal.dsl.AnnotationProcessorOptions.
解决:gradle和sdk版本对应就好
30 Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository 'maven
仓库地址记得使用https的地址就好
31 Installation failed Suggested action:
Android版本当前最新版Android Studio Iguana
后续继续更新