<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[小红威武]]></title><description><![CDATA[Be a responsible, strong, gentle man.]]></description><link>https://blog.youkuaiyun.com/HongEnIT</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; HongEnIT]]></copyright><item><title><![CDATA[熄屏（待机）状态下打开相机失败的解决]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/129732087</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/129732087</guid><author>HongEnIT</author><pubDate>Thu, 23 Mar 2023 15:49:04 +0800</pubDate><description><![CDATA[因为设备开机后自动进入熄屏状态（或者说待机状态），而用demo预览会先解锁和点亮屏幕。因此是熄屏（待机）导致的打开相机失败。虽然一直亮屏可以正常拉流，但是我们停止录像后需要先熄屏，才能进入低功耗状态，这样可以最大限度的保证降低功耗。所以最好的解决方案是能在熄屏状态下打开相机正常拉流。首先我们是想办法不让设备熄屏。具体做法是删除系统的systemUi模块，这样开机后就不会自动进入熄屏状态。熄屏状态下相机无法使用的原因是相机会下电，这个是电源管理决定的。项目中用开发的本地apk去打开相机并录像是正常的。]]></description><category></category></item><item><title><![CDATA[安卓预置系统应用加载so库失败问题]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/128534958</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/128534958</guid><author>HongEnIT</author><pubDate>Tue, 03 Jan 2023 16:16:43 +0800</pubDate><description><![CDATA[正常情况下通过install直接安装是使用PackageManager，它会将so文件拷贝到系统读取的系统so目录（system/lib或system/lib64）下，提供给App使用；但系统应用需要提前将so文件拷贝到系统目录或者app/lib目录下（/system/priv-app/xxx/lib/arm或…否则运行时将报错“无法找到该so库”。赋值LOCAL_PREBUILT_JNI_LIBS 变量时加上@符号，运行时会加载apk中对应的so库，这样就不需要解压apk中的so并拷贝到lib目录。]]></description><category></category></item><item><title><![CDATA[垃圾分类课程]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/124955160</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/124955160</guid><author>HongEnIT</author><pubDate>Tue, 24 May 2022 21:23:34 +0800</pubDate><description><![CDATA[垃圾分类课堂
1、什么是垃圾分类
一般分为四种可回收垃圾、厨余垃圾、有害垃圾和其它垃圾，垃圾分类就是将这四类分别装进不同的垃圾桶中。方便回收和处理。
那什么是回收呢？回收就是将可回收的垃圾进行清洗消毒和加工后，再次利用起来的结果。比如用过的纸张，可以做成新的纸张。
厨余垃圾可以用来喂养动物、还可以用来做植物的肥料等等。
有害垃圾需要先经过特殊处理，然后在安全无人的地方用土埋起来,让微生物去分解（吃掉）它们。或者送到发电站去烧掉发电。
其它垃圾一般也是用土埋起来，然后让微生物吃掉。
2、为什么要垃圾分类


]]></description><category></category></item><item><title><![CDATA[系统系统应用权限报错Signature|privileged permissions not in privapp-permissions whitelist的解决]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/124888610</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/124888610</guid><author>HongEnIT</author><pubDate>Fri, 20 May 2022 18:43:45 +0800</pubDate><description><![CDATA[申请系统权限（如WRITE_MEDIA_STORAGE）需要在编译时将app添加到系统应用的白名单。否则会报错如下：
2022-05-19 21:08:00.342 2303-2303/? E/AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main
    java.lang.IllegalStateException: Signature|privileged permissions not in privapp-permissions wh]]></description><category></category></item><item><title><![CDATA[Android JNI及NDK入门教程]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/121302160</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/121302160</guid><author>HongEnIT</author><pubDate>Sat, 13 Nov 2021 11:42:11 +0800</pubDate><description><![CDATA[Android JNI及NDK入门教程
为什么要使用JNI

一、native语言性能更优。
二、在Java诞生前很多库都是native语言写的，没必要再用Java实现一遍。
三、安全性更好：不容易被反编译。

JNI是什么

全称Java Native Interface。字面上理解就是Java和本地语言的接口。定义了Java和native语言之间互相通信的一套规范。（这是Java定义的，和安卓无关。）
NDK是将native语言编译成特定平台的可执行文件的一套开发组件。（将C/C++编译成so库，由An]]></description><category></category></item><item><title><![CDATA[静态内部类实现单例模式及其线程安全相关原理]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/120102033</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/120102033</guid><author>HongEnIT</author><pubDate>Tue, 14 Sep 2021 22:18:07 +0800</pubDate><description><![CDATA[实现方式
public class SingleTonInstance {
    private SingleTonInstance(){};

    public static SingleTonInstance getInstance(){
        return SingleTonHolder.sInstance;
    }

    private static class SingleTonHolder{
         private static final SingleTonI]]></description><category></category></item><item><title><![CDATA[做安卓SDK如何获取当前Activity。]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/118577798</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/118577798</guid><author>HongEnIT</author><pubDate>Thu, 08 Jul 2021 17:14:54 +0800</pubDate><description><![CDATA[安卓开发中获取当前Activity我们平时一般采用如下两种方式

通过ActivityLifecycleCallbacks接口监听当前的Activity实例，在onActivityResumed当中去获取。
通过管理每一个Activity的onResume方法，记录所有的activity的状态。最后调用onResume的状态的Activity即为当前activity。

但做SDK的时候Application不是我们写的，其它的activity也可能是接入方开启的，这时我们就无法通过以上方式获取。此时可以采]]></description><category></category></item><item><title><![CDATA[两个模块布局文件同名时出现NoSuchFieldError报错的问题。]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/112795119</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/112795119</guid><author>HongEnIT</author><pubDate>Mon, 18 Jan 2021 21:32:49 +0800</pubDate><description><![CDATA[当主模块app依赖模块myLib时，myLib中有布局文件myLayout.xml,而与此同时app模块也含有布局文件myLayout.xml，app的就会覆盖myLib的这个布局文件。所以当app的布局文件myLayout.xml修改了的时候，比如删掉了某个控件id。
就会报以下错误：

java.lang.NoSuchFieldError: No static field xxxx of type I in class Lcom/app/live/R$id; 
or its superclasses .]]></description><category></category></item><item><title><![CDATA[安卓SDK三方库与应用三方库版本冲突的解决方案。]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/112172797</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/112172797</guid><author>HongEnIT</author><pubDate>Mon, 04 Jan 2021 13:19:25 +0800</pubDate><description><![CDATA[开发过程中经常会遇到应用中用到一些三方库。但SDK也用到该三方库。如果版本不一致，就会造成冲突并编译报错。从主应用和SDK的角度，一般有如下三种解决办法：
方案一，采用exclude方式剔除SDK中的冲突三方库。
例如应用中使用了Gson，SDK也引入了Gson。在build.gradle中引用SDK时，配置如下，则可以将SDK中的Gson剔除，不将它打包到apk。
implementation (‘xxx.xxx.sdk’){ exclude group: ‘com.google.code.gson’}
]]></description><category></category></item><item><title><![CDATA[查看文件定位解决安卓ANR问题。]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/111995898</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/111995898</guid><author>HongEnIT</author><pubDate>Wed, 30 Dec 2020 18:08:39 +0800</pubDate><description><![CDATA[查看文件定位解决安卓ANR问题。
待完成

]]></description><category></category></item><item><title><![CDATA[解决ScrollView嵌套RecyclerView滑动冲突及RecyclerView无法复用的问题。]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/105048171</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/105048171</guid><author>HongEnIT</author><pubDate>Mon, 23 Mar 2020 14:44:22 +0800</pubDate><description><![CDATA[当我们需要在ScrollView嵌套一个RecyclerView时，会遇到两个问题：


滑动冲突问题：即滑动RecyclerView的时候ScrollView其它部分不动，还会有卡顿现象。这个问题可以将ScrollView改成NestedScrollView可解决。


RecyclerView无法复用：不管你将RecyclerView的高度设成match_parent或是wrap_conten...]]></description><category></category></item><item><title><![CDATA[RecyclerView的复用机制。]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/104943647</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/104943647</guid><author>HongEnIT</author><pubDate>Wed, 18 Mar 2020 14:25:07 +0800</pubDate><description><![CDATA[Recyclerview在滑动时，滑出屏幕的ViewHolder会被回收到mCachedViews队列中，mCachedViews默认size为2，如果已满则采用先进先出放入mRecyclerPool，显示到屏幕的item会在mCachedViews精确查找，如果有一样的View则直接返回，不会调用onBindViewHolder（），如果没有则从mRecyclerPool取一个同样ViewTyp...]]></description><category></category></item><item><title><![CDATA[关于arm64手机找不到so库或者出现so是32位不匹配的报错。]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/104838901</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/104838901</guid><author>HongEnIT</author><pubDate>Fri, 13 Mar 2020 14:11:32 +0800</pubDate><description><![CDATA[我们已经知道（假设）现在主流的手机都是armv7和arm64手机，还有部分是armv5的老机器。有时候我们只有一套arm结构的so库，部分so库可以适配armV7或arm64，但是为了方便以及减少apk体积，我们一般只在libs下放置一套so库在armeabi下，arm64的手机会向下兼容32位手机。
可是今天我就出现了不能兼容的现象。情况如下：主模块没有ndk，lib模块是个ndk模块，主模块依...]]></description><category></category></item><item><title><![CDATA[SurfaceView详解]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/104622586</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/104622586</guid><author>HongEnIT</author><pubDate>Mon, 02 Mar 2020 23:29:17 +0800</pubDate><description><![CDATA[SurfaceView的定义
SurfaceView是View的子类，它内嵌了一个专门用于绘制的Surface，你可以通过getHolder获取它的SurfaceHolder，并通过SurfaceHolder的getSurface方法获取这个Surface。从而控制这个Surface的格式和尺寸，Surfaceview控制这个Surface的绘制位置。surface是纵深排序(Z-ordered)...]]></description><category></category></item><item><title><![CDATA[一个自定义控件画图形的例子让你彻底明白画布旋转和save(),restore()的使用。]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/103623475</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/103623475</guid><author>HongEnIT</author><pubDate>Thu, 19 Dec 2019 21:38:43 +0800</pubDate><description><![CDATA[本文通过在自定义控件上先旋转画布再画一个向上的箭头，来搞清楚画布旋转与坐标系统变换及最终展示到界面的关系。自定义控件的代码如下。
public class MyCustomView extends View {
    public MyCustomView(Context context) {
        super(context);
    }
    public MyCustomVi...]]></description><category></category></item><item><title><![CDATA[安卓集成Google登录并进一步获取性别生日手机号等信息]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/89191724</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/89191724</guid><author>HongEnIT</author><pubDate>Wed, 10 Apr 2019 19:16:27 +0800</pubDate><description><![CDATA[由于公司做海外产品需接入Google三方登录，并且登录后除获取邮箱，用户名和用户id等基本信息外还要获取用户的性别年龄甚至手机号等信息。后面的需求实现起来就有点坑了，主要原因：Google的文档写得真心乱。看网上很多人踩了很多坑还是没找到很好的方法，于是把自己采坑后成功解决的步骤记录下来供大家参考，不谢。
1，打开官网文档，https://developers.google.com/identit...]]></description><category></category></item><item><title><![CDATA[部署apk时gradle编译错误： Cause: duplicate entry: com/xxx/xxx/xxx.class。已解决]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/81671775</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/81671775</guid><author>HongEnIT</author><pubDate>Tue, 14 Aug 2018 18:02:41 +0800</pubDate><description><![CDATA[运行项目时出现了这个问题，报错的信息意思是某个类有重复入口，而且这个类是个kotlin类。但是同样的代码在同事的机子上就没问题完全可以部署运行。



于是猜想是配置问题，几经周折找到了原因。解决方法是将下图红框中的勾选取消。





以下是错误日志。



org.gradle.api.tasks.TaskExecutionException: Execution failed for tas...]]></description><category></category></item><item><title><![CDATA[Android 使用AudioRecorder和MediaRecorder录音并播放。]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/81267158</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/81267158</guid><author>HongEnIT</author><pubDate>Sun, 29 Jul 2018 00:48:10 +0800</pubDate><description><![CDATA[我们知道，安卓系统可以AudioRecorder和MediaRecorder录音，两者的区别是：


AudioRecorder录制的是pcm数据（也称音频裸数据），可以方便的对音频数据进行处理（比如特效处理）。录音同时还可以使用AudioTrack进行播放。但是pcm数据并不可以采用播放器直接播放，而需要加上音频头信息才可以播放。比如本例中就是将pcm数据文件加上头信息转成wav文件然后便可以使...]]></description><category></category></item><item><title><![CDATA[使用SurfaceView绘制一张图片。]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/81175341</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/81175341</guid><author>HongEnIT</author><pubDate>Mon, 23 Jul 2018 21:50:35 +0800</pubDate><description><![CDATA[明明可以使用imageview显示图片或者使用自定义View的ondraw()绘制一张图片，为什么要用surfaceView这么复杂的东西去绘制图片？


因为Android系统是每隔16ms发出VSYNC信号来进行屏幕的重绘，这个重绘是在主线程中的。一旦主线程中的绘制任务时长超过16ms，就会出现卡帧现象。（之前项目在一个界面同时显示时钟每秒刷新和文字跑马灯效果，每次秒数刷新时便会出现跑马灯卡顿...]]></description><category></category></item><item><title><![CDATA[ffmpeg3.3.7源码编译]]></title><link>https://blog.youkuaiyun.com/HongEnIT/article/details/80990532</link><guid>https://blog.youkuaiyun.com/HongEnIT/article/details/80990532</guid><author>HongEnIT</author><pubDate>Tue, 10 Jul 2018 18:56:27 +0800</pubDate><description><![CDATA[!/bin/bash



export TMPDIR=”/Users/mack/Desktop/tools/ffmpeg-3.3”

NDK=/Users/hongenit/ffmpeg_test/android-ndk-r14b 
NDK_VERSION=android-21 
ARCH=arm 
CPU=arm 
PREFIX=(pwd)/android/(pwd)/android/(pwd...]]></description><category></category></item></channel></rss>