- 博客(56)
- 资源 (21)
- 收藏
- 关注
原创 Android NDK项目创建的时候C++版本选择都有什么区别
C++的语言标准是由国际标准化组织(ISO)制定和发布的,它规定了C++的语法、语义、库和兼容性等方面的内容。C++的语言标准有不同的版本,每个版本都会添加一些新的特性和改进,以增强C++的功能和性能。在此之前,有C++17(2017年发布),C++14(2014年发布),C++11(2011年发布)等等。Android ndk项目在创建的时候有C++版本选择有4个选项,分别是Toolchain default, C++11,C++14,C++17。
2023-12-01 19:14:32 617
原创 NDK打印android日志
_android_log_print方法,第一个参数是log level,第二个是tag,第三个是日志内容。这样就可以在logcat里面看到刚才的日志。首先在cpp文件中 引入。
2023-12-01 18:59:04 431
原创 在Android上搭建一个NDK项目
target_link_libraries方法是用来指定一个目标文件(可执行文件或者库文件)需要链接的库文件的。你可以指定库文件的名称,也可以指定库文件的路径。你还可以指定链接的范围,比如PUBLIC、PRIVATE或者INTERFACE,来控制库文件的传递性。project方法指定了native lib的名字,也就是MainActivity中init方法load的lib。再来看一下native-lib.cpp,毫无疑问这里面就是stringFromJNI方法的具体底层的实现。
2023-12-01 17:38:16 600
原创 NDK代码编译的方式,ndk-build,Cmake,独立工具链分别有什么区别
NDK代码编译的方式有三种,分别是基于Make的ndk-build,CMake,以及独立工具链。
2023-11-30 19:25:50 456
原创 android log能在release包里面打印吗
在 build.gradle 文件中,设置 buildTypes 的 release 下的 debuggable 为 true,这样就可以在 release 模式下查看 logcat 的日志。但是这样会影响安全性和性能,所以不建议在正式发布的应用中使用。 在 proguard-rules.pro 文件中,添加 -assumenosideeffects class android.util.Log 的规则,这样就可以在 release 模式下删除 log 的代码,避免泄露敏感信息。这种方法需要开启混淆和优化
2023-11-09 19:46:46 299
原创 ArrayList的初始容量是多少。
如果使用无参构造函数ArrayList()创建一个空的ArrayList对象,那么它的初始容量为10。但是,这个容量是在第一次添加元素时才会分配的,也就是说,在创建对象时,ArrayList的底层是一个长度为0的空数组。 如果使用有参构造函数ArrayList(int initialCapacity)创建一个指定容量的ArrayList对象,那么它的初始容量就是传入的参数值。这样可以避免在添加元素时频繁地调整大小,提高性能。
2023-11-09 11:05:51 320
原创 Content-Security-Policy(CSP)的内容构成。
每一个指令后面都应该有一个或多个源,多个源之间使用空格分隔。如果需要允许所有来源的资源,可以使用。会允许从所有源加载脚本。
2023-10-19 11:25:43 126
原创 用ffmpeg删除视频的音轨,让视频静音
再对比看一下video.mp4的信息,是有两个Stream信息,一个video,一个audio。删除以后我们查看muteVideo的文件信息,只有一个Stream:video信息了。
2023-10-08 17:22:04 1273
原创 ffprobe命令
Stream:说明是一个音频流,编码格式是aac,采样率是44100Hz,声道是立体声。Duration:音频总时长:开始播放时间:比特率。可以看到audio.m4a这个文件的所有信息。查看一个音频文件,在终端命令行输入一下命令。
2023-10-08 16:24:02 62
原创 Support for password authentication was removed on August 13, 2021 解决方案
打开你的github,Setting 点击Developer settings。给git设置token样式的remote url。点击generate new token。生成token,以后复制下来。按照需要选择scope。然后就可以正常访问了。
2023-09-05 19:38:07 663
原创 什么是依赖注入(DI)
依赖注入是一种设计模式,最初是Spring框架的核心概念之一。其作用是去除Java类之间的依赖关系,实现松耦合,以便于开发测试。如今这一设计理念也风靡Android端,比如dagger1,dagger2,hilt等一些框架。依赖注入的含义是,当一个类需要引用另一个类的实例时,不是自己创建或获取,而是由外部提供并注入。这样可以减少类之间的耦合,提高代码的可重用性和可测试性。
2023-05-12 16:07:47 301
原创 Dagger1和Dagger2还有Hilt的区别
Dagger1,Dagger2和Hilt都是Android开发中的依赖注入框架,它们的区别如下:
2023-05-12 15:15:22 254 1
原创 dagger2的使用
需要注意,dagger会在编译时生成相应的代码,因此需要在IDE中开启Annotation Processing选项,以便在编译时正常生成代码。同时,需要了解依赖注入的基本原理和设计思想,才能更好的利用dagger实现应用程序的松散耦和可测试性。在需要依赖注入的类中,添加相应的注解。例如,使用@Inject注解对需要注入的对象进行标注,使用@Module注解对提供依赖对象的方法进行标注。根据需要注入的对象,创建相应的组件。在需要使用依赖对象的地方,通过组件对对象进行注入。
2023-05-11 21:07:56 382
原创 kotlin操作对象的扩展函数有哪些?都有什么区别
另外,apply和also函数返回的是对象本身,而let和run函数返回的是执行结果。run:该函数可以在对象的作用域内执行一些操作,并返回执行结果。also:该函数可以在对象的作用域内执行一些操作,并返回该对象本身。与apply函数不同的是,also函数在对象作用域执行完成后,返回的是原始的对象本身。apply:该函数可以在对象的作用域内执行一些操作,并返回该对象本身。let:该函数可以在对象的作用域内执行一些操作,并返回执行结果。// 在myObject作用域内执行一些操作,并返回结果。
2023-05-10 22:28:41 477
原创 Android上将M3U8文件转换为MP4文件
要在Android上将M3U8文件转换为MP4文件,可以使用FFmpeg库。在命令执行期间,可以使用回调来跟踪进度和状态。最后,将生成的MP4文件保存到指定的输出文件路径中。请注意,这只是一个简单的示例代码,某些情况下可能需要更多的错误处理和参数配置。根据您的需求进行修改和优化。在这个方法中,您需要传递M3U8 URL和输出文件路径作为参数。方法将构建FFmpeg命令,并使用。
2023-04-28 15:27:07 1263
原创 DiffUtil的使用
当调用这个方法时,我们会创建一个新的DiffCallback对象,然后使用calculateDiff()方法计算旧数据集和新数据集之间的差异。RecyclerView的DiffUtil用于计算并更新RecyclerView中数据集的变化。通过使用DiffUtil,我们可以避免完全重新加载整个列表,并且只会更改必要的视图。总之,DiffUtil是一个非常有用的工具,可以帮助我们更高效地更新RecyclerView中的数据集。在上面的例子中,我们首先定义了一个自定义的适配器MyAdapter,并实现了一个。
2023-04-28 14:26:47 920
原创 Kotlin(4)kotlin中协程的实现原理
当我们在协程中调用suspend函数时,协程会进入一个暂停状态,并保存其状态以便稍后恢复执行。它使用suspend函数和状态机来实现多个任务之间的切换,同时使用协程调度器将协程分配到不同的线程上。协程的另一个关键组成部分是协程调度器。Kotlin的协程框架提供了几种不同类型的调度器,例如IO调度器、默认调度器和无限制调度器等。Kotlin中的协程是基于协程框架Coroutine实现的,该框架提供了一个轻量级的并发处理机制。当我们在协程中调用suspend函数时,它会将当前协程挂起,同时允许其他协程运行。
2023-04-27 15:43:06 278
原创 Kotlin(3)kotlin如何用val和var定义所有数据的,底层实现
总之,在底层字节码层面,Kotlin会将不同类型的变量编译成不同的指令,并且会根据上下文自动推断类型。这使得Kotlin能够更高效地处理不同类型的数据,并且可以生成更少的字节码。Kotlin同时也支持其他一些数据类型,如字符串、布尔值、数组等。这些类型也会被编译成相应的指令。在使用这些类型时,Kotlin会根据上下文自动推断类型,并生成相应的字节码。在底层字节码层面,Kotlin会将不同类型的变量编译成不同的指令。这些指令会与Java虚拟机中的相应指令对应。指令,而浮点数类型(如。声明的是只读变量,而。
2023-04-27 15:38:32 119
原创 Kotlin面试(2)说一下协程,并举例阐述一下
Kotlin的协程是一种轻量级的并发处理机制,可以用来代替传统的线程和回调方式。协程的主要目的是使异步编程更加容易和直观,并且可以避免使用回调函数导致的代码嵌套和可读性问题。协程通过挂起和恢复执行来实现任务之间的切换,这样就可以避免创建多个线程和所带来的开销和复杂度。在Kotlin中,协程被视为一种语言机制,因此不需要任何特殊的库或API支持。总之,协程是Kotlin的一项强大功能,可以让异步编程变得更加容易和直观。它可以通过简单的代码来避免复杂的线程和回调函数,并提高程序的可读性和可维护性。
2023-04-27 15:15:27 274
原创 kotlin面试(1):说一下你对kotlin的理解
此外,Kotlin还提供了很好的null安全支持,通过强制非空类型来减少空指针异常的发生。Kotlin的代码比Java代码更加简洁明了,同时也保证了类型安全,这使得程序的可读性和可维护性都有了很大的提高。由于支持与Java无缝互操作,因此Kotlin与Java之间可以轻松进行混合编程,这也为正在使用Java的开发者们提供了更多的选择。总之,Kotlin是一门功能强大的语言,它对Java的改进使得它更加适用于现代编程环境,同时也带给了开发者更多的灵活性和效率。
2023-04-27 15:11:15 101
原创 Android 通过MediaMetadataRetriever获取视频封面和时长
【代码】Android 通过MediaMetadataRetriever获取视频封面和时长。
2022-10-09 22:32:22 1102
原创 Android:获取相册视频、图片缩略图
class ThumbnailUtil { companion object { fun getPictureThumbnail( context: Context?, fileId: Long?, fileUri: Uri?, size: Size, ): Bitmap? { if (context == null) return null return.
2021-11-05 17:39:05 1153
原创 给mac zsh 添加Git-completion
下载Git-completion脚本# Create the folder structuremkdir -p ~/.zshcd ~/.zsh# Download the scriptscurl -o git-completion.bash https://raw.githubusercontent.com/git/git/master/contrib/completion/git-completion.bashcurl -o _git https://raw.githubusercont
2021-10-12 20:15:28 795
原创 Android文件路径报FileNotFoundException问题解决
val musicFile = File(musicPath) if (!musicFile.exists()) { musicPath = URLEncoder.encode(musicPath, "UTF-8") }这个问题主要是路径中含有中文字符或者空格%等特殊符号,需要用UTF8编码一下。...
2021-10-12 19:58:35 1443
原创 RecyclerView的缓存获取机制
# RecyclerView的缓存获取机制RecyclerView是我们开发中接触比较多的控件。官方给他的定义是"A flexible view for providing a limited window into a large data set."定义中有个large data 很是醒目,那RecyclerView怎么处理大量的数据,而不oom和卡顿呢?这就是RecyclerView里面的缓存机制,首先我们看一下几个基本概念:- Binding: 子视图显示adapter中与其对应位置的.
2021-09-06 16:02:22 430
原创 FragmentContainerView详解
FragmentContainerView 位于androidx.fragment.app包下面,是专门为Fragment设计的自定义布局。它扩展了FrameLayout,所以它可以可靠地处理Fragment事务,并且它还有其他功能来协调Fragment行为。FragmentContainerView应该被用作fragment的容器,通常在一个activity的xml布局中设置,例如: <androidx.fragment.app.FragmentContainerView xm
2021-05-15 14:57:41 22310 3
原创 Git新建一个分支,并且push的新的远程仓库
工作中有时候需要我们在基于现在的分支,新建一个分支,然后单独开发某一个功能。先看一下我们当前的分支情况。git branch -a我们现在本地是master分支,对应远程的origin/master分支。我们现在基于master分支,新建一个本地分支 feature_dev_video,用于开发一个单独的功能视频播放。git checkout -b feature_dev_video这个时候我们就有了一个新的本地分支,feature_dev_video,但是他现在还没
2020-05-15 11:20:39 1187
原创 Android Studio Intellij idea使用 gradle 同步失败解决方法
国内链接google、jcenter的maven仓库,会经常失败,这样解决的问题就是使用阿里云的代理.将gradle的配置文件做如下改动,就可以编译成功了.// Top-level build file where you can add configuration options common to all sub-projects/modules.buildscript { ...
2020-01-16 17:04:20 1154
原创 Git:SSH密钥生成
SSHSSH密钥SSH密钥允许您在计算机和GitLab之间建立安全连接。在shell中生成SSH密钥之前,请通过运行以下命令检查您的系统是否已有SSH密钥:Windows命令行:type %userprofile%\.ssh\id_rsa.pubGNU / Linux的/ MAC / PowerShell的:cat ~/.ssh/id_rsa.pub如果您看到以...
2019-05-14 11:30:01 1090
原创 Activity生命周期
方法 描述 Killable? Next onCreate() 在Activity开始时调用。这是大多数初始化应该做的:调用setContentView(int)来填充Activity的UI,使用findViewById以编程方式与UI中的小部件交互,调用managedQuery(Uri、String[]、String、String[]、String)来检索显示数...
2019-03-27 15:25:45 161
原创 android View类详解。
Android中的View类代表用户界面中基本的构建块。一个View在屏幕中占据一个矩形区域、并且负责绘制和事件处理。View是所有widgets的基础类,widgets是我们通常用于创建和用户交互的组件,比如按钮、文本输入框等等。子类ViewGroup是所有布局(layout)的基础类。layout是一个不看见的容器,里面堆放着其他的view或者ViewGroup,并且设置他们的布局属性。所...
2019-03-26 13:46:40 8940 2
原创 Android面试:怎么样理解Android系统运行在自己的安全沙箱内?
安装到设备后,每个 Android 应用都运行在自己的安全沙箱内:Android 操作系统是一种多用户 Linux 系统,其中的每个应用都是一个不同的用户; 默认情况下,系统会为每个应用分配一个唯一的 Linux 用户 ID(该 ID 仅由系统使用,应用并不知晓)。系统为应用中的所有文件设置权限,使得只有分配给该应用的用户 ID 才能访问这些文件; 每个进程都具有自己的虚拟机 (VM),因...
2019-03-18 14:03:37 409
原创 Git第一次提交代码教程
在创建完仓库之后,可以通过如下方式,向仓库提交第一行代码。方法1、先将仓库clone到本地,修改后再push到码云的仓库仓库$ git clone https://***.com/***.git #将远程仓库克隆到本地在克隆过程中,如果仓库是一个私有仓库,将会要求用户输入码云的账号和密码。按照提示输入即可。当然,用户也可以通过配置本地的git配置信息,执行git config命令...
2019-03-18 14:00:09 5601
原创 Android:ProgressBar的不确定模式
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/r...
2019-03-18 10:23:27 501
原创 掌握JDK8:(四)一个例子讲函数式接口:Consumer
Consumer<T> 是一个函数式接口 jdk1.8加入。 代表一个“接受一个参数,但是不返回值”的函数 函数式方法是accept源码:import java.util.Objects;@FunctionalInterfacepublic interface Consumer<T> { void accept(T t); defau...
2019-03-18 10:08:46 687
原创 掌握JDK8:(三)函数式接口Function接口详解
JDK8开始,Java在java.util.function包里面加入了很多的函数式接口。见下图。今天我们先讲一下Function接口。package java.util.function;import java.util.Objects;/** * Represents a function that accepts one argument and produces a...
2019-03-15 15:34:31 815
原创 掌握JDK8:(二)函数式接口@FunctionalInterface。
函数式接口,是JDK8新进入的新特性。概念:有且只有一个抽象实例方法(Abstract Method)的接口称为函数式接口(Functional Interface)。但是从Object类里面重写的抽象方法除外。此外为了兼容性,JDK8里面还加入了一个默认方法(default method)在接口里面,默认方法是有具体的实现的。没错,就是接口里面的实现方法。举例:我们看一下我们都比较熟悉的...
2019-03-15 14:22:19 274
圣思园所有视频下载的链接,直接复制到迅雷就可以下载,超快
2013-06-02
macBook Air 使用的dr.com客户端(城市热点)
2013-05-30
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人