![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Android开发
小红威武
Be a responsible, strong and gentle man.
展开
-
安卓预置系统应用加载so库失败问题
正常情况下通过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目录。原创 2023-01-03 16:16:43 · 2540 阅读 · 0 评论 -
系统系统应用权限报错Signature|privileged permissions not in privapp-permissions whitelist的解决
申请系统权限(如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原创 2022-05-20 18:43:45 · 3872 阅读 · 0 评论 -
Android JNI及NDK入门教程
Android JNI及NDK入门教程为什么要使用JNI一、native语言性能更优。二、在Java诞生前很多库都是native语言写的,没必要再用Java实现一遍。三、安全性更好:不容易被反编译。JNI是什么全称Java Native Interface。字面上理解就是Java和本地语言的接口。定义了Java和native语言之间互相通信的一套规范。(这是Java定义的,和安卓无关。)NDK是将native语言编译成特定平台的可执行文件的一套开发组件。(将C/C++编译成so库,由An原创 2021-11-13 11:42:11 · 2702 阅读 · 0 评论 -
静态内部类实现单例模式及其线程安全相关原理
实现方式public class SingleTonInstance { private SingleTonInstance(){}; public static SingleTonInstance getInstance(){ return SingleTonHolder.sInstance; } private static class SingleTonHolder{ private static final SingleTonI原创 2021-09-14 22:18:07 · 707 阅读 · 0 评论 -
做安卓SDK如何获取当前Activity。
安卓开发中获取当前Activity我们平时一般采用如下两种方式通过ActivityLifecycleCallbacks接口监听当前的Activity实例,在onActivityResumed当中去获取。通过管理每一个Activity的onResume方法,记录所有的activity的状态。最后调用onResume的状态的Activity即为当前activity。但做SDK的时候Application不是我们写的,其它的activity也可能是接入方开启的,这时我们就无法通过以上方式获取。此时可以采原创 2021-07-08 17:14:54 · 518 阅读 · 0 评论 -
两个模块布局文件同名时出现NoSuchFieldError报错的问题。
当主模块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 .原创 2021-01-18 21:32:49 · 443 阅读 · 0 评论 -
安卓SDK三方库与应用三方库版本冲突的解决方案。
开发过程中经常会遇到应用中用到一些三方库。但SDK也用到该三方库。如果版本不一致,就会造成冲突并编译报错。从主应用和SDK的角度,一般有如下三种解决办法:方案一,采用exclude方式剔除SDK中的冲突三方库。例如应用中使用了Gson,SDK也引入了Gson。在build.gradle中引用SDK时,配置如下,则可以将SDK中的Gson剔除,不将它打包到apk。implementation (‘xxx.xxx.sdk’){ exclude group: ‘com.google.code.gson’}原创 2021-01-04 13:19:25 · 2545 阅读 · 0 评论 -
查看文件定位解决安卓ANR问题。
查看文件定位解决安卓ANR问题。待完成原创 2020-12-30 18:08:39 · 144 阅读 · 0 评论 -
解决ScrollView嵌套RecyclerView滑动冲突及RecyclerView无法复用的问题。
当我们需要在ScrollView嵌套一个RecyclerView时,会遇到两个问题:滑动冲突问题:即滑动RecyclerView的时候ScrollView其它部分不动,还会有卡顿现象。这个问题可以将ScrollView改成NestedScrollView可解决。RecyclerView无法复用:不管你将RecyclerView的高度设成match_parent或是wrap_conten...原创 2020-03-23 14:44:22 · 3590 阅读 · 0 评论 -
RecyclerView的复用机制。
Recyclerview在滑动时,滑出屏幕的ViewHolder会被回收到mCachedViews队列中,mCachedViews默认size为2,如果已满则采用先进先出放入mRecyclerPool,显示到屏幕的item会在mCachedViews精确查找,如果有一样的View则直接返回,不会调用onBindViewHolder(),如果没有则从mRecyclerPool取一个同样ViewTyp...原创 2020-03-18 14:25:07 · 391 阅读 · 0 评论 -
关于arm64手机找不到so库或者出现so是32位不匹配的报错。
我们已经知道(假设)现在主流的手机都是armv7和arm64手机,还有部分是armv5的老机器。有时候我们只有一套arm结构的so库,部分so库可以适配armV7或arm64,但是为了方便以及减少apk体积,我们一般只在libs下放置一套so库在armeabi下,arm64的手机会向下兼容32位手机。可是今天我就出现了不能兼容的现象。情况如下:主模块没有ndk,lib模块是个ndk模块,主模块依...原创 2020-03-13 14:11:32 · 1805 阅读 · 0 评论 -
SurfaceView详解
SurfaceView的定义SurfaceView是View的子类,它内嵌了一个专门用于绘制的Surface,你可以通过getHolder获取它的SurfaceHolder,并通过SurfaceHolder的getSurface方法获取这个Surface。从而控制这个Surface的格式和尺寸,Surfaceview控制这个Surface的绘制位置。surface是纵深排序(Z-ordered)...原创 2020-03-02 23:29:17 · 1327 阅读 · 0 评论 -
一个自定义控件画图形的例子让你彻底明白画布旋转和save(),restore()的使用。
本文通过在自定义控件上先旋转画布再画一个向上的箭头,来搞清楚画布旋转与坐标系统变换及最终展示到界面的关系。自定义控件的代码如下。public class MyCustomView extends View { public MyCustomView(Context context) { super(context); } public MyCustomVi...原创 2019-12-19 21:38:43 · 231 阅读 · 0 评论 -
android handler消息机制和可能导致内存泄漏的原因
当Android应用启动的时候,会通过prepareMainLooper方法创建一个UI主线程的Looper对象,Looper实现了一个简单的消息队列,一个一个的处理里面的Message对象。主线程Looper对象在整个应用生命周期中存在。 当在主线程中初始化Handler时,该Handler和Looper的消息队列关联(如下代码所示mQueue = mLooper.mQueue)。 pub原创 2017-02-03 22:53:03 · 496 阅读 · 0 评论 -
JNI开发中链接各种类型的库的CMAKE文件写法。
一般来说有四种情况:动态库(.so),静态库(.a),NDK自带的库(eg. liblog),编写的源文件(c/c++文件):distribution_DIR 为libs目录 set(distribution_DIR ../../../../libs)1. 动态库:add_library( x264 SHARED IMPORTED)set_tar原创 2017-11-19 15:55:26 · 969 阅读 · 0 评论 -
IllegalStateException: The specified child already has a parent.
java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.at android.view.ViewGroup.addViewInner(ViewGroup.java:4309)原创 2017-05-27 16:30:53 · 1188 阅读 · 0 评论 -
VK登录
Error:Gradle DSL method not found: ‘isReleaseBuild()’原创 2017-04-06 20:45:22 · 11138 阅读 · 0 评论 -
Twiiter第三方登录接入跳坑
04-05 19:15:57.704 4204-4204/com.rcplatform.livechat E/Twitter: Invalid json: <?xml version="1.0" encoding="UTF-8"?> <hash>原创 2017-04-05 19:28:31 · 1910 阅读 · 0 评论 -
Java1.7通过collections类的sort方法对ArrayList进行排序无效的解决办法。
项目中对ArrayList进行排序,采用如下方法: class SortByNumber implements Comparator<ExchangeCommodity.ListBean> { public int compare(ExchangeCommodity.ListBean listBean1, ExchangeCommodity.ListBean listBean2原创 2017-03-16 14:26:18 · 2557 阅读 · 7 评论 -
安卓studio打包时出现OOM: GC overhead limit exceeded
项目中引入了一些第三方的包,然后就出现如下问题。UNEXPECTED TOP-LEVEL ERROR: java.lang.OutOfMemoryError: GC overhead limit exceeded at com.android.dx.cf.code.RopperMachine.getSources(RopperMachine.java:665) at co原创 2017-04-10 21:33:44 · 1359 阅读 · 0 评论 -
AS导入工程出现 Error:Failed to crunch file
从Github把MVP架构的示例工程荡下来看看,结果运行报如下错误,资源ID的R文件也无法自动生成。Information:Gradle tasks [:app:generateMockDebugSources, :app:prepareMockDebugUnitTestDependencies, :app:mockableAndroidJar, :app:generateMockDebugAndr原创 2017-03-15 11:13:03 · 828 阅读 · 0 评论 -
Support v-7 recycler view 出现IndexOutOfBoundsException: Inconsistency detected.异常解决办法。
QA提Bug说某个列表上下滑动会崩溃(非必现)。哎…,最怕的就是这种难以复现的问题了。问题产生的原因是使用了support-v7 的RecyclerView,在刷新数据的时候会出现以下异常:java.lang.NullPointerExceptionat com.rcplatform.livechat.im.SinchIMService$b.a(SinchIMService.java:592)a原创 2017-03-13 18:06:33 · 825 阅读 · 0 评论 -
接入google+登录SDK提示google-services.json is missing
接入google+登录SDK时下载官方的demo,然后一堆问题,于是把该安装的最新的库都安装了。 但仍然有如下错误。Information:Gradle tasks [:app:generateDebugSources, :app:mockableAndroidJar, :app:prepareDebugUnitTestDependencies, :app:generateDebugAndroid原创 2017-03-17 16:57:03 · 7289 阅读 · 4 评论 -
创建一个类似dialog的activity,需要注意的坑。
创建一个类似dialog的activity很简单。只要将activity的样式设置成和dialog样式即可。但是可能会遇到适配某些分辨率的手机会遇到高度不够的问题,如图。但其实还有黑色透明区域可容纳,原因可能是dialog样式的主题限制了显示区域宽高。So,首先设置一个透明activity的样式。 <style name="TranslucentBackground" pa...原创 2018-04-02 21:59:21 · 1313 阅读 · 0 评论 -
在pycharm环境下使用Django写API接口
一直做安卓开发,经常和后端开发打交道,但对后端接口开发知之甚少。最近抽空学python,第一感觉就是简单易用。但是不实践一下也学不好。正好用Python和Django开发api,既巩固了python基础,也了解了后端的开发。首先是安装环境:python3,pip3,还有pycharm和Django,Windows安装复杂些,有条件建议使用linux或mac系统,会省好多事。其次pychar...原创 2018-04-13 00:29:21 · 9306 阅读 · 1 评论 -
Android Studio 修改类的默认注释
在Android Studio中创建一个类的时候,默认会注释create by…如果不修改默认注释,AS会给你报一片屎黄色的警告,说你用了默认的文件头模板。 对于有代码洁癖的码农来说,不能忍。于是点击菜单栏的“File“->“Settings”,搜索file and code template,选中include-> File Header,按需修改。确定后在创建类就不会注释...原创 2018-04-26 20:03:07 · 1499 阅读 · 0 评论 -
安卓Webview 加载网页 Uncaught TypeError: Cannot read property 'getItem' of null",
在使用webview加载一个网页的时候出现Uncaught TypeError: Cannot read property ‘getItem’ of null”,resource:“http://xxx”,意思是访问xxx网页的时候找不到某元素。查了一下是因为该网页的js写得不规范(擦,原来是前端哥们挖的坑): 在JS运行的时候你的页面还没有加载完成,所以你的JS代码找不到你的页面元素,就会抛出这原创 2016-12-10 15:36:51 · 7287 阅读 · 1 评论 -
安卓集成Google登录并进一步获取性别生日手机号等信息
由于公司做海外产品需接入Google三方登录,并且登录后除获取邮箱,用户名和用户id等基本信息外还要获取用户的性别年龄甚至手机号等信息。后面的需求实现起来就有点坑了,主要原因:Google的文档写得真心乱。看网上很多人踩了很多坑还是没找到很好的方法,于是把自己采坑后成功解决的步骤记录下来供大家参考,不谢。1,打开官网文档,https://developers.google.com/identit...原创 2019-04-10 19:16:27 · 2968 阅读 · 0 评论 -
部署apk时gradle编译错误: Cause: duplicate entry: com/xxx/xxx/xxx.class。已解决
运行项目时出现了这个问题,报错的信息意思是某个类有重复入口,而且这个类是个kotlin类。但是同样的代码在同事的机子上就没问题完全可以部署运行。于是猜想是配置问题,几经周折找到了原因。解决方法是将下图红框中的勾选取消。以下是错误日志。org.gradle.api.tasks.TaskExecutionException: Execution failed for tas...原创 2018-08-14 18:02:41 · 8656 阅读 · 0 评论 -
Android 使用AudioRecorder和MediaRecorder录音并播放。
我们知道,安卓系统可以AudioRecorder和MediaRecorder录音,两者的区别是:AudioRecorder录制的是pcm数据(也称音频裸数据),可以方便的对音频数据进行处理(比如特效处理)。录音同时还可以使用AudioTrack进行播放。但是pcm数据并不可以采用播放器直接播放,而需要加上音频头信息才可以播放。比如本例中就是将pcm数据文件加上头信息转成wav文件然后便可以使...原创 2018-07-29 00:48:10 · 1869 阅读 · 0 评论 -
使用SurfaceView绘制一张图片。
明明可以使用imageview显示图片或者使用自定义View的ondraw()绘制一张图片,为什么要用surfaceView这么复杂的东西去绘制图片?因为Android系统是每隔16ms发出VSYNC信号来进行屏幕的重绘,这个重绘是在主线程中的。一旦主线程中的绘制任务时长超过16ms,就会出现卡帧现象。(之前项目在一个界面同时显示时钟每秒刷新和文字跑马灯效果,每次秒数刷新时便会出现跑马灯卡顿...原创 2018-07-23 21:50:35 · 3784 阅读 · 0 评论 -
ffmpeg3.3.7源码编译
!/bin/bashexport 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...原创 2018-07-10 18:56:27 · 403 阅读 · 0 评论 -
Mac上使用Nginx+rtmp搭建自己的直播推流服务器
安装HomeBrew不多说,Mac安装的神器。/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"安装Nginx扩展home-brew对ngixnx的扩展,在终端输入如下命令。brew tap homebrew/nginx安装Ngi...原创 2018-07-02 23:05:34 · 1340 阅读 · 0 评论 -
音视频开发大纲
视频文件:封装格式有avi,MP4视频:图像部分,编码格式有aviYUV格式RGB格式音频:音频部分,aac原创 2018-07-02 00:05:31 · 711 阅读 · 0 评论 -
Constraint Layout 学习总结
想要使用Constraint Layout,最主要的是记住以下一些属性的作用1. layout_constraintLeft_toLeftOf这个代表了改控件的左边与目标控件的左边对齐。例如下布局:<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk...原创 2018-06-19 15:12:36 · 779 阅读 · 0 评论 -
Resolved versions for app (26.1.0) and test app (27.1.1) differ
最近新建项目gradle编译会出现如下错误:Error:Execution failed for task ':app:preDebugAndroidTestBuild'.Conflict with dependency 'com.android.support:support-annotations' in project ':app'. Resolved versions for ap...原创 2018-06-19 11:50:35 · 435 阅读 · 0 评论 -
三行搞定md5加密
/** * 对字符串md5加密 * * @param str * @return */ public static String getMD5(String str) { try { // 生成一个MD5加密计算摘要 MessageDigest md = MessageDigest.getInstance(“MD5”);原创 2017-02-16 00:33:49 · 963 阅读 · 0 评论 -
android stuido关于在V7包下找不到recyclerview的解决办法
在android studio 中出现找不到com.android.support:recyclerview-v7 jar包。咋一看不对啊,明明you support-v7包啊。咋会找不到呢。仔细检查发现有的是com.android.support:appcompat-v7 jar包,而不是recyclerview的v7包。(好吧,我现在才知道support-v7包是分开的)。原创 2017-01-27 21:36:23 · 857 阅读 · 0 评论 -
安卓系统常用广播汇总
安卓系统中有很多的广播和接收事件,了解这些事件对开发应用功能的思路会有很大的帮助。android.provider.Telephony.SMS_RECEIVED接收到短信时的广播Intent.ACTION_AIRPLANE_MODE_CHANGED;//关闭或打开飞行模式时的广播 Intent.ACTION_BATTERY_CHANGED;//充电状态,或者电池的电量发原创 2016-11-24 18:27:04 · 2227 阅读 · 0 评论 -
Android系统adb shell 常用命令
1. 显示系统中全部Android平台: android list targets 2. 显示系统中全部AVD(模拟器): android list avd 3. 创建AVD(模拟器): android create avd --name 名称 --target 平台编号 4. 启动模拟器:原创 2016-11-24 18:17:38 · 989 阅读 · 0 评论