Android
文章平均质量分 77
blueberry_mu
不积跬步,无以至千里。不积小流,无以成江海。
展开
-
使用OpenSL直接播放mp3
使用OpenSL直接播放mp3前言通过使用OpenSL来播放一个mp3文件来学习openSL的使用方式。设计在android平台播放mp3方式有多种方式入使用MediaPlayer、AudioTrack、OpenSL、oboe等。根据使用MediaPlayer,AudioTrack的经验一个播放器需要有的基础功能有加载数据、开始、暂停、停止、销毁等。我们可以设计一个播放器它具有开始播放、暂停、停止、调整进度等方式。那么我们需要设计一个类它应该支持以下功能:初始化:初始化SLEngine、构建原创 2022-04-10 15:06:13 · 5188 阅读 · 0 评论 -
Android使用SurfaceView搭建OpenGL环境
Android使用SurfaceView搭建OpenGL环境流程在页面上使用SurfaceView。在SurfaceView创建成功之后使用surface.getSurface获取到Surface对象传到native层。Native层根据传入的Surface对象获取ANativeWindow。获取显示对象EGLDisplay并初始化。根据配置创建EGL上下文(EGLContext)。为ANativeWindow设置buffer.根据EGLDisplay、ANativeWindow创建一个E原创 2022-03-26 13:44:09 · 6708 阅读 · 0 评论 -
Android移植带有libx264实现的ffmpeg
一、环境准备 1、Ubuntu系统(我使用VirtualBox搭建的虚拟机)。 2、最新的ffmpeg源码 3、最新的libx264的源码二、开始搞事情 1、下载最新的ffmpeg、x264源码 大家可以器ffmepg、x264的官网去下载然后解压到本地、也可以使用git直接clone ffmpg: http://ffmpeg.org/download.html原创 2016-12-30 13:05:39 · 5219 阅读 · 4 评论 -
Android Studio 2.2 NDK开发 opencv 人脸识别
一、开发环境准备 1、Android Studio到 2.2版本,在sdk Manager中下载 ndk-bundle 和 cmake 2、下载OpenCV for Android 下载地址:http://opencv.org/downloads.html 二、搭建环境 1、使用Android Studio 新建一个项目(在c++ suport 上打上对勾) 2、带项目创建好之后,将ope原创 2016-11-17 15:13:16 · 3547 阅读 · 2 评论 -
Mockito的使用 二
11、为回调做测试桩when(mock.someMethod(anyString())).thenAnswer(new Answer() { Object answer(InvocationOnMock invocation) { Object[] args = invocation.getArguments(); Object mock = invoc原创 2016-08-23 15:42:32 · 1920 阅读 · 0 评论 -
Mockito的使用一
一、Mockito的引用 Gradle:repositories { jcenter() }dependencies { testCompile "org.mockito:mockito-core:1.+" }Maven:<dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId原创 2016-08-23 15:04:45 · 2064 阅读 · 0 评论 -
Android Camera的使用 (三)
一、创建一个Camear App二、创建拍照功能 创建一拍照我们分以下几步: 1、检测和访问相机—–检测相机是否存在 2、创建一个用来预览的对象——创建一个 类继承自SurfaceView 并实现SurfaceHolder接口,这个类用来显示camera传来的图像。 3、创建布局——-创建不就用来放SurfaceView 以及控制按钮 4、设置监听器—设置监听器,当按钮点击时开始拍照或录像原创 2016-08-10 15:50:31 · 6646 阅读 · 0 评论 -
Apk获得系统权限的方法
方法1:通过将项目作为一个模块,放到Android系统源码中进行编译~~~步骤如下:在应用程序的AndroidManifest.xml中的manifest节点中加入”android:sharedUserId=”android.uid.system”这个属性。<manifest xmlns:android="http://schemas.android.com/apk/res/android"转载 2016-09-12 16:37:26 · 3823 阅读 · 0 评论 -
Android Camera的使用 (二)
一、前言 在我们使用Camera时我们应该首先考虑以下几个注意事项 1、我们的设备必须要有摄像头,以及我们应该在AndroidManifest.xml中将需要用到的权限必须加上。 2、我们的应用程序用Camera来干什么?能否考虑使用系统自带的Camera应用,还是需要自定义一个相机。 3、我们的媒体文件怎样存储,是私有,还是共享?以及我们的相册应用可以查看这些文件吗? 我们接下来就针对上原创 2016-08-10 14:31:23 · 1064 阅读 · 0 评论 -
Android Camera的使用 (一)
一、前言 在android 5.0 之后 官方已经不推荐Camear这个类了,而是推荐 android.hardware.camera2 包下的api.但我们还是有必要学习一下。Camera这个类可以被用来照相、start/top相机预览、将图像帧编码成video。它对于相机服务相当于一个客户端,它管理者真正的硬件Camera。要访问硬件Camera我们必须在AndroidManifest.xml原创 2016-08-10 13:39:48 · 2864 阅读 · 0 评论 -
Android 动画
一、 android动画分为 属性动画 和 View动画。 View动画又分为 补间动画和帧动画二、详细介绍1、属性动画 属性动画的xml文件定义在 res/animator 文件夹下 语法:<set android:ordering=["together" | "sequentially"]> <objectAnimator android:propertyName原创 2016-08-09 17:04:03 · 623 阅读 · 0 评论 -
Android使用libjpeg实现图片压缩
一、Android中使用的图片压缩库 Android和IOS 中图片处理使用了一个叫做skia的开源图形处理引擎。他位于android源码的/external/skia 目录。我们平时在java层使用一个图片处理的函数实际上底层就是调用了这个开源引擎中的相关的函数。 二、Android 中常用的压缩方式 Android中常用压缩方法分为2种:一种是降采样率压缩,另外一种是质量压缩。 代码:原创 2016-12-22 15:39:19 · 9001 阅读 · 7 评论 -
使用Ubuntu16下载编译Android6.0源码
一、环境准备 本人使用VirtualBox安装Ubuntu16系统。 1、安装git、curl 2、使用curl下载repo。(repo实际是一个用来下载源码的python脚本) 二、下载 1、创建存放源码的目录。 2、使用repo初始化并指定要下载Android源码版本 3、使用repo sync 下载 三、编译 1、下载openjdk 7.0 2、配置编译源码需要的依赖包。原创 2016-12-05 09:52:49 · 6310 阅读 · 2 评论 -
Android视频编码器
一、目的 在Android上使用FFmpeg将摄像头采集的YUV裸流编码为h264。 二、环境准备 1、使用FFmpeg动态库(这个动态库需要有libx264的实现,否则可能会出现寻找编码器失败异常)。关于如何获得这样的一个动态库可以参考http://blog.csdn.net/a992036795/article/details/53941436 2、Android开发环境(我用的是And原创 2017-01-04 16:53:00 · 4030 阅读 · 0 评论 -
Android文件上传
上传的方式本文将介绍2中文件上传的方式: 1.multipart/from-data方式上传。 2.binary方式上传。multipart上传方式html的上传方式代码这中上传方式是我们最常用的上传方式。比如我们使用网页上传文件,其中html代码大致为这样:<form method="post" enctype="multipart/form-data" action="/upload/sin原创 2017-07-07 16:45:02 · 2898 阅读 · 0 评论 -
Android移植librtmp
一、前言 为了让android能够使用librtmp,我们需要下载它的源码并使用交叉编译工具编译成可以供android使用的库文件。我在网上参考了一些别人移植的文章,但到自己移植的时候缺踩了许多坑。还好今天终于移植成功了,特此总结一下。 二、流程 我看了一下网上的资料大概流程都是: 1、从ndk中提出一个交叉编译工具链,并设置环境变量,供我们编译使用。 2、因为librtmp需要依赖ssl原创 2017-01-12 15:30:48 · 5528 阅读 · 4 评论 -
Android直播解决方案
Android直播解决方案思路本文采用的协议推送端实现音频采集视频采集音频编码视频编码音视频推送服务器搭建播放端项目地址Android直播解决方案思路要实现直播我们必须有3个东西 推流端、流媒体服务器、播放端。流媒体服务器我们可以暂时不考虑,可以直接使用开源的服务器red5或nginx等。推流端设计: 如何进行音频、视频采集如何进行音频、视频编码如何音视频一起实时发原创 2017-03-21 18:13:03 · 5856 阅读 · 9 评论 -
Android 使用Rtmp音视频推流
一、前言 本文介绍的是使用Android 摄像头、麦克风采集的音、视频进行编码。然后通过librtmp推送到流媒体服务器上的功能。 我所使用的环境:Android Studio 2.2.3 、Window 10二、流程 三、代码ManActivity.javapublic class MainActivity extends AppCompatActivity implements Sur原创 2017-01-17 16:02:08 · 20161 阅读 · 49 评论 -
Android知识点总结
Android知识点总结Android框架设计Android网络框架设计Android常见问题防止Activity被重新创建 Android中滑动冲突的解决方案Android中API的使用案例Service的使用AIDL的使用Messenger的使用ShareUserId的使用BroadcastReceiver的使用ContentProvider的使用AppWidget使用Android中的Dra原创 2017-01-23 09:00:03 · 1775 阅读 · 0 评论 -
IntentFilter的匹配规则
IntentFilter的匹配规则IntentFilter的使用假如我们要隐式启动一个Activity我们需要成功匹配activity中的任意一个intent-filter。如果要成功匹配该intent-filter我们需要完全匹配该intent-filter中的 action、category、data。示例:<activity android:name=".MainActivity">原创 2017-02-07 17:39:29 · 558 阅读 · 0 评论 -
使用librtmp推送AVC数据
一、前言 本文要讲述的是将AVC(h264)数据推送到流媒体服务器。我的实现方法是:1先使用android自带的API采集摄像头数据,然后进行h264编码。2、然后使用ndk开发将编码后的数据通过librtmp发送出去。关于如何得到librtmp的动态库和如何使用系统API编码视频,可以参考我以前的文章。移植librtmp http://blog.csdn.net/a992036795/arti原创 2017-01-16 12:28:52 · 2368 阅读 · 0 评论 -
Android使用系统API进行音视频编码
一、前言 上一篇文章我讲到,我用libx264对视频进行h264编码效率非常低下,原因在于libx264采用的是软编码。于是我在网上搜索得知使用系统的API可以对视频进行硬编码,从而减少cpu的压力,达到提高效率的作用。我写了一个demo试了一下,果真效率提高的很明显。 二、思路 1、核心类MediaCodec 这个类用来进行音/视频编码。AudioRecord 这个类用来录音得原创 2017-01-09 12:18:39 · 7682 阅读 · 11 评论 -
Android中的Drawable
一、Android中有这么几种Drawable: 1、Bitmap File 2、Nine-Patch File 3、Layer List 4、State List 5、Level List 6、Transition Drawable 7、Inset Drawable 8、Clip Drawable 9、Scale Drawable 10、Shape Drawable 下面我们原创 2016-08-09 12:23:59 · 627 阅读 · 0 评论 -
Android使用Gradle自动化打包
假如我们使用了友盟sdk或者别的sdk,我们需要在androidMainifest 填写一个渠道号,来帮助我们统计。也就说app发布之后需要每个应用市场对应着唯一的渠道号。如果我们不使用自动化打包的话,就非常的麻烦,需要自己去改Mainifest.xml中的渠道号。还好,我们可以使用gradle来帮我们完成这个过程。 我目前的一个项目使用了友盟统计,我需要在AndroidMainifest.xml原创 2016-08-02 16:36:56 · 2739 阅读 · 0 评论 -
AppWidget的使用及原理分析
一 AppWidget的使用: 1、首先在res/layout文件夹下定义一个 布局文件 res/layout/app_widget.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orien原创 2016-08-05 17:11:53 · 2699 阅读 · 0 评论 -
Android 中多线程的简单使用
一、多线程的实现 1.最简单的启动一下新线程private void startNewThread(){ new Thread(){ @Override public void run() { //耗时操作 } }.start(); }或者: pr原创 2016-05-10 13:38:11 · 3656 阅读 · 1 评论 -
android多线程----同步集合
一、程序中的优化策略—-CopyOnWriteArrayList Copy-On_Write 是一种用于程序设计中的优化策略,器基本思路是: 从多个线程共享同一个列表,当某个线程想要修改这个列表的元素时,会把列表的元素Copy一份,然后进行修改,修改完成之后在在将新的元素设置给这个列表,这是一种懒惰策略。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不要加锁,因为当前容器不会原创 2016-05-10 17:57:51 · 3387 阅读 · 1 评论 -
Android多线程-----同步锁
一、同步机制关键字synchronized 对于java来说,最常用的同步机制就是synchronized关键字,他是一种基于语言的粗略锁,能够作用于对象、函数、class。每个对象都只有一个锁,谁能够拿到这个锁谁就有访问权限。当synchronized作用于函数时,实际上锁的也是对象,锁定的对象就是该函数所在类的对象。而synchronized作用于class时则是锁的这个Clas原创 2016-05-11 10:27:40 · 20652 阅读 · 0 评论 -
Android多线程-------同步辅助类
一、循环栅栏 CyclicBarrier CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到达到某个公共屏障点。因为该Barrier在释放等待线程后可以重用,所以,称它为循环的Barrier 示例:public class CyclicBarrierTest { private static final int SIZE = 5; private static原创 2016-05-11 13:32:06 · 682 阅读 · 0 评论 -
AsyncTask 原理分析
一、先来看看AsyncTask的定义,以及主要的方法。 AsyncTask的定义如下:public abstract class AsyncTask<Params, Progress, Result> { ......}其中这几个泛型分别表示:参数类型、进度类型、返回结果类型。 接下来看看这个类中主要的方法//需要我们重写,其工作在子线程,用于执行比较耗时的操作protected a原创 2016-05-11 15:04:54 · 685 阅读 · 1 评论 -
Service的简单使用
一、先来看如何最简单的创建一个Service 1、新建一个类继承自Service重写其中的几个重要方法public class SimpleService extends Service{ private static final String TAG = "SimpleService"; @Override public void onCreate() { s原创 2016-05-31 10:21:39 · 1301 阅读 · 0 评论 -
IntentFilter的匹配规则
我们知道,启动Activity分为两种,显示调用和隐式调用。显示调用需要明确的指定被启动对象的组件信息,包括包名和类名,而隐式调用则不需要明确的指定组件信息。原则上一个Intent不应该即是显示调用又是隐式调用。如果二者共存的话以显示调用为主。 隐式调用需要Intent能够匹配目标组组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标的Activity。 IntentFil原创 2016-05-30 15:30:08 · 619 阅读 · 0 评论 -
Activity的启动模式
Activity的启动模式有4个,分别为standard、singleTop、singleTask、singleInstance。用户可以在AndroidManifest.xml中注册Activity时设置它的启动模式,例如: <activity android:name=".A" android:launchMode="singleTask"/>下面我们来一起看一下这四种原创 2016-05-26 10:10:54 · 1145 阅读 · 0 评论 -
防止Activity被重新创建
Activity在系统配置发生改变之后会重新创建,我们常见的是在手机旋转屏幕时activity就被重新创建了。那么怎么样才能不被创建呢?我们先来看一下系统的那些内容被改变后Activity会被重新创建。 系统的配置在Configuration类中,我们来查看Configuration类中的成员,看看他们分别代表的意思。mcc: SIM卡唯一标示IMSI(国际移动用户识别码)中的国家代码,由三位数原创 2016-05-25 14:51:41 · 5979 阅读 · 0 评论 -
使用ContentProvider
一、简介: ContentProvider 在android中的作用是对外共享数据,也就是说可以通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对应用中的数据进行增、删、该、查。使用ContentProvider的好处是,统一了数据的访问方式。 ContentProvider的体层实现实际是Binder。二、使用: 一般原创 2016-06-08 10:24:14 · 5166 阅读 · 0 评论 -
ContentProvider原理分析
一、ContentProvider的介绍 关于ContentProvider的介绍,以及使用可以参考我的上一篇博客http://blog.csdn.net/a992036795/article/details/51610936二、原理 1、我们知道要访问一个ContentProvider要使用到ContentResolver。我们就先来看ContentReselover。我们通常使用Conten原创 2016-06-08 14:44:04 · 14172 阅读 · 3 评论 -
使用AIDL
一、什么是aidl? AIDL是android内部一种进程通信接口的描述语言。二、使用aidl aidl支持的数据类型:基本数据类型 (int 、long、char 、boolean、double 等)String 和CharSequenceList:只支持ArrayList,里面每个元素都必须能够被AIDL支持。Map:只支持HashMap,里面的每个元素都必须被AIDL支持,包括ke原创 2016-06-03 17:14:54 · 5008 阅读 · 0 评论 -
Android网络框架设计
一、构建思路 1、构建一个Request用来封装 HTTP请求的类型、请求头参数、请求体、优先级、返回类型、等一些必要的属性。 这个Request定义为抽象的,使得用户可以扩展。 2、构建一个队列(BlockingQueue) 用来存贮这些请求,用户可以自己将请求添加到这个队列中 3、创建多个线程NetworkExecutor,用来遍历队列(BlockingQueue)获得Request,请求原创 2016-08-17 14:48:35 · 1989 阅读 · 0 评论 -
Retrofit源码简要分析
一、Retrofit的使用 本文使用的Retrofit 2.1.0版本。 在gradle中加入: compile 'com.squareup.retrofit2:retrofit:2.1.0'如果要是要解析json,还需加入: compile 'com.squareup.retrofit2:converter-gson:2.1.0'如果要结合rxjava 需要加入: compil原创 2016-08-04 11:39:44 · 1355 阅读 · 0 评论 -
android滑动冲突的解决方案
一、前言 Android 中解决滑动的方案有2种:外部拦截法 和内部拦截法。 滑动冲突也存在2种场景: 横竖滑动冲突、同向滑动冲突。 所以我就写了4个例子来学习如何解决滑动冲突的,这四个例子分别为: 外部拦截法解决横竖冲突、外部拦截法解决同向冲突、内部拦截法解决横竖冲突、内部拦截法解决同向冲突。 先上效果图: 二、实战 1、外部拦截法,解决横竖冲突 思路是,重写父控件的onInterc原创 2016-06-22 17:53:08 · 19540 阅读 · 5 评论