Android
文章平均质量分 76
阿飞__
熟悉 Android、C++ 等
展开
-
Android手势识别GestureDetector和ScaleGestureDetector介绍与使用,以自定义一个可拖拽拉伸的ImageView为例
GestureDetector主要用于检测单指手势,例如单击、长按、滑动等,不支持多指手势。用于检测缩放手势,即双指捏合或者扩张的手势。它提供了 onScale() 和 onScaleBegin() 等回调方法来处理缩放手势的开始、进行中和结束时的事件。首先,我们可以直接继承 ImageView,并通过 Matrix 来控制图片的移动和拉伸。其次,使用 GestureDetector 监听移动的相关事件,使用 ScaleGestureDetector 监听拉伸的相关事件。原创 2024-04-07 19:04:32 · 2272 阅读 · 0 评论 -
MediaRecorder 介绍和使用,结合Camera2录制视频实例(含完整项目)
在中通过设定的宽高去修改view的宽高。@Override} else {} else {可以将相机的一些基础操作和实现都封装起来,并在CameraSurfaceView中完成相关操作。完整文件地址:// 封装相机的各种操作// 设置屏幕常亮@Override@Override// 将View的大小修改为和相机预览分辨率相同的比例@Override。原创 2023-12-14 19:38:47 · 4235 阅读 · 1 评论 -
Android Activity 启动时获取View的宽高为0?正确获取View宽高的方式
方法对于确保在视图完成布局后执行操作非常有用,但在处理复杂布局时需要谨慎使用,以避免引入不必要的延迟,更推荐使用下面这种。方法去获取 View 的宽高信息,会发现拿到的宽高大概率都是0。这是由于 View 很可能还未完成布局,而没有宽高信息。通过 View 的 ViewTreeObserver 添加一个监听事件,在 View 的大小完成计算后自动回调。备注:AndroidX 中可以使用。判断是否已经完成布局,即。使用 View 类的。原创 2023-10-19 15:53:49 · 639 阅读 · 0 评论 -
Android 使用 registerForActivityResult() 打开系统相册或相机获取图像
当使用了 AndroidX 后,发现标记为过时了,而是推荐我们使用函数。函数是 Android 中用于启动 Activity 结果回调的新方式。这个函数的目的是简化在 Activity 和 Fragment 之间进行启动其他 Activity 并接收结果的过程,取代了传统的和方法。使用函数,您可以更容易地管理 Activity 结果的处理,使代码更清晰和模块化。AndroidX 是 Android 中的一个开发库,旨在简化 Android 应用程序的开发和维护。原创 2023-10-08 21:37:51 · 3405 阅读 · 1 评论 -
Android Camera2 SessionConfiguration介绍和使用
最近在相机开发中发现已经被标记为过时(@Deprecated)的函数了,取而代之的是函数。因为不建议在主线程中执行回调,所以通常我们会创建一个相机的执行器。原创 2023-10-07 20:02:13 · 1201 阅读 · 1 评论 -
Android Camera2获取摄像头的视场角(FOV)信息
在摄影和计算机图形学中,FOV也经常与焦距(focal length)、相机镜头和投影类型(例如透视投影或正交投影)一起使用,以影响图像的外观和透视效果。不同的FOV设置可以用来创造不同的视觉效果,从而满足特定的需求和创意要求。FOV的大小会影响到用户或设备所能看到的景象的广度和逼真程度。较大的FOV可以提供更广阔的视野,使用户感到更加沉浸在虚拟现实环境或更好地观察到摄像机捕捉到的场景。然而,较大的FOV通常需要更复杂的设备和技术来实现。如图所示,要计算FOV,只要我们拿到传感器的长度。原创 2023-09-18 22:08:28 · 1810 阅读 · 0 评论 -
Android Camera2相机预览画面放大缩小(数码变焦DigitalZoom)功能实现
一、前言Android自定义相机开发中,常常会有通过手势放大或缩小相机预览画面的需求,即数码变焦DigitalZoom。二、接口说明1. 获取最大的放大倍数float maxZoom = mCameraCharacteristics.get(CameraCharacteristics.SCALER_AVAILABLE_MAX_DIGITAL_ZOOM);怎么理解这个值呢?假设正常预览画面(即没有缩放)矩形为 activity_rect,放大后的预览画面矩形为 crop_rect,那么它们宽高的原创 2021-08-13 16:21:29 · 12009 阅读 · 5 评论 -
使用SSH无线连接Android手机设备调试
一、应用场景组内项目开发,Android 测试机有限,可在Android 测试机上开启一个 SSH 服务,然后通过 adb connect 直接连接,支持多个电脑同时连接。二、准备下载一个 sshdroid.apk,安装并启动,手机需要连接WiFi,点击启动如下所示:下载链接:https://download.csdn.net/download/afei__/20239709三、设置并连接1. 修改端口号由于默认的端口号是2222,试过通过连接不上,可以通过 adb 命令将端口号改为 555原创 2021-07-26 16:03:14 · 3763 阅读 · 1 评论 -
Android文件游览选择器(支持选择多个文件、支持选择文件和文件夹,返回文件路径)
一、效果预览用的图标都是网上到处拷贝的,仅仅做个示例使用。截图 gif二、思路首先我们需要一个 FilePickerActivity 去显示页面。里面包含一个标题栏(ToolBar)、路径文本(TextView)和文件列表(RecyclerView)。RecyclerView 需要使用一个 Adapter 展示内容,内容来自于 File 类的 listFiles() 函数。最后我们完善那些返回、单击进入文件夹、长按选择、空页原创 2021-03-23 17:44:05 · 2013 阅读 · 0 评论 -
Android MediaMuxer+MediaCodec 编码yuv数据成mp4
一、简介使用 MediaCodec 对 yuv 数据进行编码,编码的格式为 H.264(AVC) 。使用 MediaMuxer 将视频track和音频track混合到 mp4 容器中,通常视频编码使用H.264(AVC)编码,音频编码使用AAC编码。二、流程分析(简要介绍一下流程,具体api的参数说明起来篇幅太大,不清楚的可以自己搜索一下)创建编码器并配置MediaFormat mediaFormat = MediaFormat.createVideoFormat(MediaFormat.M原创 2021-03-18 15:44:31 · 4416 阅读 · 7 评论 -
Android MediaExtractor+MediaCodec解码视频,返回yuv回调数据
一、解码流程分析(简要介绍一下流程,具体api的参数说明起来篇幅太大,不清楚的可以自己搜索一下)MediaExtractor 负责提取视频信息,创建一个该对象,并设置视频路径MediaExtractor extractor = new MediaExtractor();extractor.setDataSource(videoFilePath);视频文件一般都包含视频、音频等,我们需要获取视频轨道private static int selectVideoTrack(MediaExtr原创 2021-03-16 17:13:39 · 3266 阅读 · 5 评论 -
Android10有sdcard读写权限,仍无法读写sdcard中文件问题解决
一、问题场景在Android 10及以上系统的手机上测试发现,明明已经申请了 android.permission.READ_EXTERNAL_STORAGE 和 android.permission.WRITE_EXTERNAL_STORAGE 权限,且应用也拥有了这些权限,但应用只能读写 Context.getExternalxxxDir() 获取到的目录,而无法读写 /sdcard 下的其余文件。这是由于 Android 在 10 之后又加强了数据隐私管理,可以把 Context.getExter原创 2021-03-05 11:23:36 · 8602 阅读 · 7 评论 -
Android Camera2 之 CameraDevice 详解
一、简介CameraDevice 是一个连接的相机设备代表,你可以把它看作为相机设备在 java 代码中的表现。类比于旧 API 中的 Camera 类。官方文档链接:https://developer.android.google.cn/reference/android/hardware/camera2/CameraDevice二、获取 CameraDevice 实例通过 Camera...原创 2018-12-29 17:59:59 · 14788 阅读 · 5 评论 -
Android Camera2 之 CameraManager 详解
一、简介CameraManager 是系统服务之一,专门用于 检测 和 打开相机,以及 获取相机设备特性。官方文档其实说的蛮清楚的了,英文好的同学也可以直接看官方文档把:https://developer.android.google.cn/reference/android/hardware/camera2/CameraManager二、获取 CameraManager 实例通过 Con...原创 2018-12-29 17:30:06 · 22701 阅读 · 0 评论 -
Android 性能优化总结
一、简介性能调优是开发中少不了的一个过程,同时也是一名优秀的程序员需要掌握的基本技能。下面我们来看一下在 Android 中可以从哪些方面来进行性能优化吧。二、内存优化内存是很重要的一个模块了,所以我也将其放在了第一位来说明。那么如何来优化我们应用的内存呢?当应用内存不足时,将发生内存溢出。内存溢出会直接导致应用 crash。尽量减少应用的内存使用将很好的避免发生内存溢出。我们可以从如下方...原创 2018-12-18 23:36:00 · 1691 阅读 · 0 评论 -
自定义Camera系列之:TextureView + Camera
一、前言上一篇介绍了 自定义Camera系列之:SurfaceView + Camera,接着我们介绍使用 TextureView + Camera 的组合。为什么选择 TextureView ?由于 SurfaceView 是拥有一个独立的 Surface,不在 View hierachy 体系中,因此不支持动画和截图,而 TextureView 则没有该限制。TextureView 是...原创 2018-12-26 22:11:13 · 6759 阅读 · 6 评论 -
Android NDK 面试题汇总
一、谈谈你对 JNI 和 NDK 的理解JNI:JNI 是 Java Native Interface 的缩写,即 Java 的本地接口。目的是使得 Java 与本地其他语言(如 C/C++)进行交互。JNI 是属于 Java 的,与 Android 无直接关系。NDK:NDK 是 Native Development Kit 的缩写,是 Android 的工具开发包。作用是更方便和...原创 2018-12-08 00:29:20 · 12515 阅读 · 4 评论 -
Android 为例编写一个 OpenGL ES 3.0 实例,Native & Java 两种实现
一、简介通过这个 Sample,你将了解到 Android 中是怎么使用 OpenGL ES通过绘制一个简单的静态三角形,来简单入门和了解它大致的流程(类似于 HelloWorld 工程)介绍使用 Native 层 和 Java 层 两种方式来分别实现本文暂不介绍具体的语法,但会给比较详细的注释和解释,帮助你理解二、Native 实现1. 头文件由于我们使用的是 OpenGL E...原创 2018-12-05 10:24:04 · 6479 阅读 · 4 评论 -
Android 进程通信 (IPC) 之 AIDL 的使用
一、简介AIDL 是 Android Interface Definition Language 的缩写,是 Android 定义的一种专门用于进程间通信的接口语言,它的语法也和 java 比较类似。二、特点我们知道 Android 中还有一种轻量级的进程通信方式——Messenger。Messenger 类似于一个进程间使用的 Handler,它适用于消息的传递,服务器只能以串行的方式一...原创 2018-11-28 23:42:36 · 1244 阅读 · 0 评论 -
Android.mk 语法和变量介绍
一、简介Android.mk 是一种脚本语言,是将 C/C++ 源文件粘合至 NDK 的构建文件。官网对 Android.mk 的介绍:https://developer.android.com/ndk/guides/android_mk二、一些超级基本的语法例如我们使用 # 表示注释,使用 $() 表示取值,使用 := 表示赋值,使用 += 表示附加等等。在学习之前,我们起码得看得懂这...原创 2018-11-14 17:05:39 · 11325 阅读 · 0 评论 -
灰度图(IR 图)转成 RGB 图预览,画面出现光斑/黄斑问题解决
一、背景存在一个 IR 图(红外线 Infrared Radiation),需要在页面上显示出来,IR 图片格式是 gray8,即 8 位的灰度图。Android 上的 Bitmap 图片格式使用的是 ARGB_8888,所以需要把灰度图转 ARGB 图,每个通道都为 8 位。二、问题现象转码思路很简单,就是一个 int 表示一个像素点,刚好是 4 * 8 = 32 位。那么每一位的值都...原创 2018-11-13 09:56:20 · 7441 阅读 · 1 评论 -
Android 进程通信 (IPC) 之 Messenger 的使用
一、简介Messenger 是 Android 提供的一种轻量级的进程间通信方案。它的本质是对 AIDL 的封装,所以使用起来也更加容易了。Messenger 是指 “信使” 的意思,即它是一个进程与进程间的信使,就像是一个快递员在两个进程间传递消息(Message)。因此,它的使用也和 Message 息息相关。二、服务端我们创建一个 Service 作为服务端,它是一个独立的进程,并负...原创 2018-10-25 21:21:31 · 605 阅读 · 0 评论 -
Android P 上 remount of the / superblock failed: Permission denied
现象:$ adb rootrestarting adbd as root$ adb remountremount of the / superblock failed: Permission deniedremount failed 原因:Android P 版本后 google 启用 avb(Android Verified Boot)2.0,verified boo...原创 2018-10-15 14:58:04 · 18143 阅读 · 11 评论 -
Android NDK 从入门到精通(汇总篇)
注意:本文为各博客汇总分类的链接贴,方便大家快速寻找和学习相应的内容。未完待续,佛性更新中~~专栏地址 Android NDK 开发,从入门到精通NDK 入门 NDK 开发第一课:环境配置与第一个 JNI 程序JNI 知识 JNI 数据类型和类型描述符 JNIEnv 和 JavaVM JNI 接口大全 JNI 静态注册...原创 2018-07-30 19:40:46 · 44565 阅读 · 2 评论 -
你真的知道 ARGB_8888 格式图片的 A、R、G、B 每个通道的排列顺序吗?
一、前言Android 开发中经常使用到 Bitmap,而 Bitmap 的默认加载个格式为 ARGB_8888 。而关于 ARGB_8888 的介绍,网上基本都是只说明 ARGB_8888 格式每个像素占 4 个字节,每个通道(A:alpha,R:red,G:green,B:blue)有 8 位,可以表示 0-255 个值。但是,你是否知道它内部每个通道的排列顺序吗?是 A-R-G-B 这...原创 2018-08-04 21:16:50 · 11520 阅读 · 4 评论 -
Android Studio 中 gradle 的两个版本号对应关系
问题描述使用 Android Studio 开发的小伙伴,是不是经常被 gradle 折磨的死去活来,其实它很多地方还是很方便的。今天我们说的是 gradle 版本号的问题。一个是我们看到的 gradle 版本(例如 4.4),另一个是在工程下面看到的版本,例如classpath ‘com.android.tools.build:gradle:3.1.2’注意:对照关系表在文章末尾。...原创 2018-08-04 09:38:49 · 30162 阅读 · 5 评论 -
Android 刷新 sdcard
问题描述:在 Android 开发中,有时我们往 sdcard 写了一些东西,但是查看的时候却没有立即刷新出来,那么我们可以使用下面这种方式去执行一个立即刷新的效果:Intent scanIntent = new Intent("android.intent.action.MEDIA_SCANNER_SCAN_FILE");scanIntent.setData(Uri.fromFil...原创 2018-08-04 08:56:37 · 1092 阅读 · 0 评论 -
自定义Camera系列之:SurfaceView + Camera
一、前言之前一直想把 Camera 系列的写一下,拖了很久,现在慢慢填坑吧。首先介绍 SurfaceView + Camera 的组合。虽然从 Android 5.0 后推荐使用 Camera2 了,不过某些旧工程或者需要适配低版本的场景还是用得着旧的 Camer API 的。为什么选择 SurfaceView ?SurfaceView 在自己独立的线程中绘制,不会影响到主线程,内部使用双...原创 2018-12-25 23:34:16 · 10342 阅读 · 7 评论 -
Android Studio图文安装教程
Android Studio图文安装教程原创 2016-05-21 14:44:11 · 1574 阅读 · 0 评论 -
浅谈 SurfaceView、TextureView、GLSurfaceView、SurfaceTexture
一、SurfaceViewSurfaceView 是一个可以在子线程中更新 UI 的 View,且不会影响到主线程。它为自己创建了一个窗口(window),就好像在视图层次(View Hierarchy)上穿了个“洞”,让绘图层(Surface)直接显示出来。但是,和常规视图(view)不同,它没有动画或者变形特效,一些 View 的特性也无法使用。概括:SurfaceView 独立于视图...原创 2019-08-22 20:34:38 · 11698 阅读 · 0 评论 -
Android 实时滤镜 Demo(GPUImage + Camera2 实现)
一、应用截图二、前言GPUImage 是一个开源的图像渲染的库,使用它可以轻松实现很多滤镜效果,也可以很轻松的定义和实现自己特有的滤镜效果。地址:https://github.com/cats-oss/android-gpuimage三、依赖工程要想使用 GPUImage,使用 Android Studio 只需要在 build.gradle 里面添加相关的依赖即可。implemen...原创 2019-08-12 18:50:17 · 6909 阅读 · 11 评论 -
Android Camera2 预览数据格式 YUV_420_888 合集之 I420 转 Bitmap
一、简介说简单点,就是如何将 YUV I420 格式转换为 RGBA8888 格式。在 Camera2 API 中,相机预览不能直接使用 NV21 格式获取了,否则会报错一个 “NV21 format is not supported” 的异常。官方推荐我们使用 YUV_420_888 格式,关于这个格式的介绍,可以参考官方文档或者百度。如果获取到相机预览数据,并转化为 YUV I420 格...原创 2019-07-05 17:59:08 · 12179 阅读 · 3 评论 -
Android Camera2 获取预览帧的回调数据(带demo)
一、前言众所周知,在旧Camera接口中,我们通过 setPreviewCallback 或 setPreviewCallbackWithBuffer 接口来获取相机预览的帧数据。然而,在 Camera2 中,这些接口以及不复存在了,那么 Camera2 该如何获取预览帧数据呢?在 Camera2 中,我们通过 ImageReader 类来间接的获取预览帧数据,并在 onImageAvaila...原创 2019-06-15 16:22:53 · 22919 阅读 · 17 评论 -
Android 使用音量键/耳机按键控制拍照
一、简介一般手机都有 “音量上键”、“音量下键”,耳机线上通常也有 “上、中、下键”。有时我们会需要用到这些键来执行一些特殊的任务,例如 拍照,那么该怎么做呢?步骤就是:监听按键的事件并执行指定的任务最方便的方式是在 Activity 的 onKeyDown(int keyCode, KeyEvent event) 或者 onKeyUp(int keyCode, KeyEvent e...原创 2019-06-19 15:32:10 · 4018 阅读 · 1 评论 -
Android Gradle 使用示例,各参数含义
前言目前 Android 的开发大都使用 Android Studio 了,而 Android Studio 所使用的 Gradle 也是大有文章,其中有许多可以定制和使用的技巧。Gradle 的语法是使用的 Groovy 语言,这里不做详细介绍了。下面是我总结的一些常用的选项以及释义:apply plugin: 'com.android.application'android {...原创 2019-02-27 00:18:55 · 1486 阅读 · 0 评论 -
自定义Camera系列之:GLSurfaceView + Camera2
一、前言假如你要使用 OpenGL ES 来渲染相机的话,使用 GLSurfaceView 将是一个很常用的选择。这里介绍 GLSurfaceView + Camera2 的组合。如果你对 Camera2 的相关类和接口还不熟悉,可以先看看下面这些介绍:CameraManager详解CameraDevice详解CameraCharacteristics详解CameraCapture...原创 2019-02-14 00:16:19 · 5752 阅读 · 3 评论 -
Android Studio 配置一键生成 JNI 头文件工具
一、前言我们知道进行 NDK 开发中,native 方法大多是需要进行静态注册的,如果手动一个个写,不仅容易出错,而且繁琐和浪费时间。那么有什么好用的工具可以使用呢?这个其实是有的,就在我们的JDK中就有一个 javah.exe 工具帮助我们生成 JNI 的头文件,我们只需要将其配置到 Android Studio 中就可以很方便的使用它了。二、效果示例如下,com_afei_opengl...原创 2019-02-28 00:03:17 · 5908 阅读 · 5 评论 -
自定义Camera系列之:TextureView + Camera2
一、前言之前已经介绍过过时的旧 Camera 的使用了,毕竟在从 Android 5.0 后推荐使用 Camera2 了,所以现在开始介绍 Camera2 相关使用。该篇介绍 TextureView ,这也是谷歌示例中使用的组合。如果你对 Camera2 的相关类和接口还不熟悉,可以先看看下面这些介绍:CameraManager详解CameraDevice详解CameraCharact...原创 2019-01-31 00:12:52 · 5608 阅读 · 12 评论 -
自定义Camera系列之:GLSurfaceView + Camera
一、前言假如你要使用 OpenGL ES 来渲染相机的话,使用 GLSurfaceView 将是一个很常用的选择。这里介绍 GLSurfaceView + Camera 的组合。虽然从 Android 5.0 后推荐使用 Camera2 了,不过某些旧工程或者需要适配低版本的场景还是用得着旧的 Camer API 的。为什么选择 GLSurfaceView ?GLSurfaceView 继...原创 2019-01-23 00:08:12 · 4712 阅读 · 8 评论 -
Android Camera2 之 CameraCaptureSession 详解
一、简介CameraCaptureSession 是一个事务,用来向相机设备发送获取图像的请求。主要为 setRepeatingRequest() 和 capture() 方法。setRepeatingRequest() 是重复请求获取图像数据,常用于预览或连拍,capture() 是获取一次,常用于单张拍照。CameraCaptureSession 类是一个抽象类,其直接的实现类为 Cam...原创 2019-01-08 23:57:57 · 25029 阅读 · 5 评论