Android
文章平均质量分 72
Android相关技术梳理
little_fat_sheep
图形学领域爱好者,未来将在图形渲染(OpenGL、LibGDX、Filament、Unity3D、UE)、图形编解码(FFmpeg)等领域长期深耕。
展开
-
【Android】使用 ContentObserver 监控统状态信息
1 前言使用ContentProvider实现跨进程通讯中介绍了自定义 ContentProvider,为外界提供操作 SQLite 的接口。但是大多数情况下,服务端的 ContentProvider 不需要用户编写,用户只需要知道怎么调用就行,比如系统资源。因此,本文将以监控飞行模式状态和最新短信为例,讲解使用 ContentObserver监控系统状态信息。常用的系统 URI 取值如下:内容名称 URI常量名 URI常量值 联系人 ContactsContract...原创 2020-11-23 02:20:43 · 1560 阅读 · 0 评论 -
【Android】使用ContentProvider实现跨进程通讯
1 前言ContentProvider 即内容提供器,是 Android 四大组件之一,为 App 存取数据提供统一的对外接口,让不同的应用之间可以共享数据。如图,Server 端通过 ContentProvider 对外提供操作 SQLite 的接口,Client 端通过 ContentResolver 与 ContentProvider 通讯,从而实现跨进程操作 Sqlite。(1)ContentProvider 接口ContentProvider 是一个抽象类,用户需要实现如下抽.原创 2020-11-22 01:46:29 · 3006 阅读 · 1 评论 -
adb常用命令总结
1 前言ADB(Android Debug Bridge)即 Android 调试桥,采用监听 Socket TCP 端口的方式通讯。连接手机有2种方式:有线连接、无线连接。(1)有线连接使用数据线连接手机后,在【开发人员选项】中开启【USB 调试】,并在【选择 USB 配置】中选择【MTP (多媒体传输)】。(2)无线连接adb connect ip注意事项:手机和 PC 需要连接同一个局域网 需要开启【USB 调试】,并选择【MTP (多媒体传输)】2 常用命令.原创 2020-11-18 01:08:20 · 3470 阅读 · 0 评论 -
【Android】Message、Handler、MessageQueue、Looper 详解
1 前言Handler 即处理器,常用于跨线程通讯:线程A 和线程 B 拥有同一个 handler 对象,在线程 A 中使用 handler 的 sendMessage() 方法发送消息,在线程 B 中使用 handler 的 handleMessage() 方法处理消息。Handler 家族主要有:Message、Handler、MessageQueue、Looper。(1)应用场景子线程处理完耗时操作后,请求主线程更新 UI 线程 A 定时给线程 B 发送消息 线程 A 周期性给线.原创 2020-11-11 02:09:01 · 1197 阅读 · 0 评论 -
【Android】使用MediaExtractor获取关键帧的时间戳
1 前言使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据中介绍了 MediaExtractor 类的主要方法,本文主要将使用其 advance() 和seekTo(timeUs, mode) 方法遍历帧,以获取关键帧的时间戳。advance() 方法能够从任意关键帧开始,依次往后遍历每一帧;seekTo() 方法能够定位到指定时间戳附近的关键帧。若只使用 advance()方法,则需要从头到尾遍历1遍所有帧;若只使用 seekTo() 方法,则需要知道所有关键帧附近..原创 2020-10-27 00:56:17 · 2644 阅读 · 0 评论 -
【Android】MediaCodec详解
1 前言MediaCodec 主要用于视频解码和编码操作,可以实现视频倍速播放、全关键帧转换、视频倒放等功能。MediaCodec 的工作原理图如下:原创 2020-10-24 00:49:01 · 4139 阅读 · 3 评论 -
【Android】使用MediaExtractor、MediaMuxer去掉视频文件中的音频数据
1 简介本文以 mp4 文件为例,讲解去音频操作。mp4 是一种视频封装的容器,里面包含音频(audio)和视频(video)数据,对应的数据编码格式分别为 aac 和 h264。在去音频过程中,主要使用到MediaFormat、MediaExtractor、MediaMuxer,其作用如下:MediaFormat:用于存储视频轨或音频轨的信息(MIME、时长、帧率、比特率、关键帧间隔、视频宽高等); MediaExtractor:媒体分离器,用于分离音频和视频数据,并且能够遍历帧数据; Me.原创 2020-10-22 00:58:27 · 1330 阅读 · 1 评论 -
【Android】使用 MediaMetadataRetriever 获取视频信息
1 环境配置与初始化(1)申请权限在 AndroidManifest.xml 中的 manifest 标签(application 同级标签)下添加外部存储读写权限,如下:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />原创 2020-10-21 01:29:18 · 4703 阅读 · 0 评论 -
【Android】使用Exoplayer播放视频
1 前言ExoPlayer 是 google 开源的应用级媒体播放器,github源码 →https://github.com/google/ExoPlayer。相较于 MediaPlayer,ExoPlayer 具有以下优点:支持更多的视频播放格式(包含 DASH 和 SmoothStreaming,这2种 MediaPlayer 不支持) 通过组件化自定义播放器,方便扩展定制 持久的高速缓存ExoPlayer 框架中组件主要有:MediaSource:媒体资源,用于定义要播放的媒体。.原创 2020-10-20 23:48:37 · 2940 阅读 · 1 评论 -
【Android】使用BluetoothSocket实现跨设备通讯
1 前言使用Socket实现跨设备通讯中介绍了使用 WiFi 通道实现跨设备通讯,本文将介绍使用 Bluetooth 通道实现跨进程通讯。1.1 蓝牙通讯核心类在蓝牙通讯中,主要用到 BluetoothAdapter、BluetoothDevice、BluetoothServerSocket、BluetoothSocket。(1)BluetoothAdapterpublic static synchronized BluetoothAdapter getDefaultAdapter(.原创 2020-10-08 01:11:46 · 5499 阅读 · 0 评论 -
【Android】使用Socket实现跨设备通讯
1 Socket 简介Socket(套接字)是应用层与 TCP/IP 协议通信的中间软件抽象层,它是一组接口,用户只需面向 Socket 编程,即可实现跨设备(网络)通讯。Socket 是 java 里的东西,不是 Android 特有的,使用 Socket 需要导入的类如下。java.net.ServerSocketjava.net.Socket(1)服务端主要接口调用// 获取 socketmServerSocket = new ServerSocket(port) /.原创 2020-09-25 01:43:45 · 1676 阅读 · 2 评论 -
【Android】使用Binder实现进程间传递对象案例
1 前言使用AIDL实现进程间通讯简单案例和使用AIDL实现进程间传递对象案例中介绍了使用 AIDL 进行进程间通讯,其本质仍然是Binder,aidl 文件对应生成的接口中,将服务端调用的抽象类(Stub)和客户端调用的代理类(Proxy)糅合在一个 java 文件中,使得新手读起来云里雾里。使用Binder实现进程间通讯简单案例中试图将生成的接口拆分为2个类(Stub 和 Proxy),分别布置在服务端和客户端,能够帮助读者更好地理解 AIDL 和 Binder。本文将延续使用Binder...原创 2020-09-20 11:42:42 · 1131 阅读 · 0 评论 -
【Android】使用Binder实现进程间通讯简单案例
1 前言使用AIDL实现进程间通讯简单案例和使用AIDL实现进程间传递对象案例中介绍了使用 AIDL 进行进程间通讯,文中提到在编写完 aidl 文件(如:IMessageManager.aidl)并 Make Buidl 后,会生成一个接口(如:IMessageManager.java),接口中包含一个静态抽象内部类 Stub,Stub 中又包含一个静态内部类 Proxy,Stub 和 Proxy 都实现了此接口,同时 Stub 继承了 Binder 类。本文将从 IMessageManager...原创 2020-09-18 01:44:49 · 1742 阅读 · 2 评论 -
【Android】使用Messenger实现进程间通讯
1 Messenger 简介2 项目结构3 服务端 msger_S 代码(1)创建服务MyService.javapackage com.example.msger_s;import android.app.Service;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.原创 2020-08-20 02:05:06 · 484 阅读 · 2 评论 -
【Android】使用AIDL实现进程间传递对象案例
1 前言在Android——使用AIDL实现进程间通讯简单案例中介绍了使用 AIDL 在进程间传递字符串,对于8种基本数据类型( byte、short、int、long、float、double、boolean、char )和 CharSequence(包含 String )、List、Map,用法同理。需要注意:List 和 Map 中的所有元素必须是 AIDL 支持的类型,List 支持泛型,Map 不支持泛型。本文将介绍使用 AIDL 实现自定义 User 对象间的传递,User 包含..原创 2020-08-15 01:19:07 · 1127 阅读 · 0 评论 -
【Android】使用AIDL实现进程间通讯简单案例
1 AIDL 简介2 项目结构注意: aidl_C 和 aidl_S 下的 com.zhyan8.aidl 包名及其中的 aidl 文件必须一致。3 服务端 aidl_S 代码(1)创建 aidl 文件MessagManager.aidlpackage com.zhyan8.aidl;interface MessageManager { void sendMsg(String msg); String getMsg();}注意:方法前不要添加 p.原创 2020-08-12 01:19:42 · 1667 阅读 · 5 评论 -
【Android】使用 Broadcast 实现进程间通讯
1Broastcast简介2 简单案例2.1 Clien_AMainActivity.javaactivity_main.xml2.2 Client_BMainActivity.javaactivity_main.xml2.3 效果展示原创 2020-08-12 00:13:28 · 531 阅读 · 0 评论 -
【Android】屏幕旋转时数据丢失问题解决方案
1 问题描述今天遇到一个问题,在旋转屏幕时,记录旋转屏幕次数的计数器(count)一直为 0,不能实现累加效果。主要因为在旋转屏幕时,会销毁原来的变量,重新构建界面。2 解决思路在 Activity 销毁(onDestroy)之前,将 count 保存到 Bundle中,再在Activity构建(onCreate)的时候从 Bundle 中取出 count 值。Google 工程师已想到这点,为我们提供了onSaveInstanceState(@NonNull Bundle outStat...原创 2020-08-03 23:08:28 · 1557 阅读 · 0 评论 -
【Android】截图案例
1 工作空间2 代码MainActivity.javapackage com.zhyan8.demo;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Handler;import android.support.v7.app.AppCompatActivity;import android.view.View;import android.widget.Button;impo原创 2020-08-02 16:09:27 · 349 阅读 · 0 评论 -
基于Android的“哲学家就餐问题”防死锁的设计与实现
1问题描述如图1.1,有5个哲学家围着一个大圆桌就餐。哲学家和筷子都按逆时针顺序编号,每个哲学家的编号与他左边的筷子的编号一致。规定如下:(1)哲学家之间不相互交流;(2)哲学家只做两件事:吃饭或思考;(3)每个哲学家只能拿其邻近的左右两支筷子;(4)哲学家不能抢占别人已经拿起的筷子;(5)哲学家在拿到两支筷子之前,不会放下手中的筷子;(6)哲学家只有拿到两支筷子才开始就餐,然后...原创 2019-01-17 20:42:50 · 434 阅读 · 2 评论 -
Android Studio 常用快捷键
1 编辑Ctrl+A:全选(选中当前文档所有内容) Ctrl+C:复制选中内容到剪贴板 Ctrl+X:剪切选中内容到剪贴板 Ctrl+V:将剪贴板中的内容粘贴到光标处 Ctrl+Z:撤销 Ctrl+Shift+Z:逆撤销 Ctrl+Y:删除当前行 Ctrl+D:复制当前行到下一行 Shift+Alt+↑:将当前行内容移至上一行(当前行与上一行内容交换,并且光标移至上一行) Shift+Alt+↓:将当前行内容移至下一行(当前行与下一行内容交换,并且光标移至下一行) Ctrl+Shif原创 2020-07-25 01:47:53 · 475 阅读 · 1 评论