Blogs

Android播放音效

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 有些时候程序需要播放几个很短的低延迟的音效来响应与用户的交互。 Android通过SoundPool将文件音频缓存加载到内存中,然后在响应用户操作的时候快速地播放。 Android框架低通了SoundPool来解码小音频文件,并在内存中操作它们来进行音频快速和重复的播放。SoundPool还有一些其他特性,比如可以在运行时控制音量和播放速度。 播放音效也很简单,总共分5步 准备音频文件 将音频文件放置在assets目录下 初始化SoundPool SoundPool mSoundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); 加载音频文件 int streamID = mSoundPool.load(getApplicationContext().getAssets().openFd("beep/beep1.mp3"), 1); 播放音频文件 mSoundPool.play(streamID, 10, 10, 1, 0, 1.0f); 释放SoundPool mSoundPool.release(); mSoundPool = null; Code package com.kongqw.kqwplaybeepdemo; import android.media.AudioManager; import android.media.SoundPool; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import java.io.IOException; import java.util.HashMap; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private static final String TAG = "MainActivity"; private SoundPool mSoundPool; private int streamID; private HashMap<String, Integer> mSoundMap; @Override protected void onCreate(Bundle savedInstanceState) { super.

继续阅读

App启动优化最佳实践

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 看了医生写的文章一触即发——App启动优化最佳实践,收获是有的。 做Android开发,一定写给过启动页,在这里做一些初始化的操作,还有就是显示推广信息。 很普通的一个页面,以前测试也给我提出过bug,应用在启动的时候,有时候有白屏/黑屏。当时能做的就是尽量较少耗时操作,上面医生的文章里也有提到,但是通过主题的方式优化这个问题之前还真是不知道的。 下面主要总结一下通过主题的方式优化启动页(医生还提到了在子线程初始化和使用IntentService初始化,都是属于异步初始化,还有延迟初始化,就不说了) 效果图 通过修改主题优化启动时白屏/黑屏 原理请移步到医生的文章,我就不复述了,之所以会看到白屏或者黑屏,是和我们的主题有关系的,因为系统默认使用的主题,背景色就是白色/黑色。那么我们自定义一个主题,让默认的样式就是我们想要的,就优化了白屏/黑屏的问题。 首先,我们自定义一个主题,设置一个我们想要的背景 <!-- 启动页主题 --> <style name="SplashTheme" parent="@style/Theme.AppCompat.Light.NoActionBar"> <item name="android:windowBackground">@drawable/start_window</item> </style> 自定义背景start_window.xml <layer-list xmlns:android="http://schemas.android.com/apk/res/android" android:opacity="opaque"> <!-- The background color, preferably the same as your normal theme --> <item android:drawable="@android:color/holo_blue_dark" /> <!-- Your product logo - 144dp color version of your app icon --> <item> <bitmap android:gravity="center" android:src="@mipmap/ic_launcher" /> </item> </layer-list> 最后,在清单文件设置启动页使用我们自定义的主题 <?xml version="1.

继续阅读

Android串口通信

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 串口通信偏向嵌入式一点,是Android设备通过串口与其他设备进行通信的一种方式,本文介绍的Android纯串口的通信,并不是手机上的USB串口通信。 手机上是没有这个串口的哦。 关于串口通信,Google已经给出了源码,地址在GitHub android-serialport-api 四年前的代码,还是Eclipse工程,本文主要介绍如何在Android Studio中使用。 源码地址在 KqwSerialPortDemo 集成 Java层的代码,Google已经给封装在 SerialPort.java 导入.so 没有什么难度了,将so导入到项目 导入jni文件 在main目录下创建cpp文件夹,并将jni源文件和CMakeLists.txt导入 在build.gradle配置cmake路径。 android { …… externalNativeBuild { cmake { path "src/main/cpp/CMakeLists.txt" } } …… } 修改jni源文件 这里要注意jni文件函数名的写法:Java_包名_类名_方法名 在将源码里的jni导入过来的时候,包名是源码Demo的包名,我们在自己的工程里要换成自己的包名、类名,源文件和头文件都要记得改。 修改CMakeLists.txt与SerialPort.java CMakeLists.txt cmake_minimum_required(VERSION 3.4.1) add_library(SerialPort SHARED SerialPort.c) # Include libraries needed for libserial_port lib target_link_libraries(SerialPort android log) SerialPort.java static { System.loadLibrary("SerialPort"); System.loadLibrary("serial_port"); } 使用 基类 需要使用串口通信的类继承 SerialPortActivity.

继续阅读

这夏未眠.简介

书整体分为三部分《夏之过往》,《夏之流年》,《夏之未至》。整本书讲的是男主人公顾艾哲(小艾)与莫晨(晨晨)之间的故事,从初中到高中再到大学,从相遇到相知再到相离。 两人同在陌乘一中念初中,同班同学,在中考来临的那段日子,两人相互鼓励,于是顾艾哲(小艾)考上了他从来都没有想过能考上的孟川一高,而莫晨(晨晨)呢,考上了预料之中的平阳一高,而她在这之前却从来没告诉过顾艾哲(小艾)她要去平阳,就这样,两个人分开了,一些都看起来那么顺理成章,一切又看起来那么暗淡失望。 在经历过高中的二年之后,顾艾哲(小艾)终于联系上了莫晨(晨晨),那天晚上,他用妈妈的电话给莫晨(晨晨)通了两个小时的电话,似乎要把两人两年里没有说的话都说完,可是有太多的话是无法用言语表达的,就这样电话欠费了,终止了聊天,可是那天晚上,小艾高兴的一宿没睡,那一晚上,他的笑容都是幸福的。 可是事情永远不会那么顺利,在香山公园里,当他拿起他买的情侣戒指送给晨晨时,晨晨没有接受,说了一堆他也没有听进去的话,就这样,又开始了分离,而谁也不知道这次分离竟然时一辈子的再也不见。 后来的后来,他又遇见了别的女孩,不知道是不是因为后来的女孩都像小艾记忆里的莫晨。只知道,他都很珍惜。

继续阅读

这夏未眠.序

这本书的整体构思是小主大学一年级时刚去的时候的一个想法,当时刚刚步入大学的我们,心里是那么的迷茫与懵懂,开学前两周,除了军训还是军训,晚上偶尔有个空闲时间,我想大概也许是无聊的,记得那个时候坐在图书馆靠窗的位置,看着窗外,没有明月,没有佳人,有的只是一望无际的黑暗。 那个时候,还没有遇到你所想遇到的人,或许回忆还沉淀在高中的时光里,或是幸福,或是苦涩,或是幸福之后的苦涩,回过头来,看着满屋子的学长学姐,心里是及其复杂的,有种说不出的难过,那时候我是不是在想,现在的你(们)会在哪里念大学呢? 想着想着眼角便淌出了泪水,我想我的大学要完成一件至少我自己觉得满意的事,于是便有了你现在看到的这个序,不知道是不是受郭敬明的影响,因为我看过他的唯一一本小说,也是我看过的唯一一本小说——《夏至未至》,我想写一本书,或者更准确的说,我想写一个人的青春。 在13年军训结束之后,我构思了整个体系,定了这本书的名字——《这夏未眠》,熟悉我的朋友,也知道这是我的QQ网名,QQ作为那个时代的记忆,总会残留一些悲伤的故事,于是我到现在四年了,我从没换过QQ网名,或许是害怕,害怕那些好久不联系的朋友,找不到我吧。

继续阅读

OpenCV+JavaCV实现人脸识别

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN OpenCV主要实现人脸检测功能 JavaCV主要实现人脸对比功能 具体的就不啰嗦了,本来最近很忙,主要是因为好多人私信我要 Android使用OpenCV实现「人脸检测」和「人脸识别」 的Demo,今天特意抽出时间写了一下。 效果图 源码 KqwFaceDetectionDemo 感觉有用的话,就给个star吧,谢谢!! 注意 最后啰嗦一点,如果你的程序是跑在手机、pad等设备上,一般没有什么问题。 但是如果你是在自己的开发板上跑,可能会有一些小插曲。 比如我司的机器人是定制的Android板子,对系统做了裁剪,很多摄像头的方法可能就用不了 例如这样一个错误 AndroidRuntime: java.lang.RuntimeException: setParameters failed 当打开程序的时候,OpenCV会提示,没有找到可用摄像头或者摄像头被锁住(大概这个意思,我就不截图了),一种可能是设备真的没有接摄像头,也有可能是摄像头定制过,导致某些方法用不了,比如上面的错误就是我遇到的其中一个。

继续阅读

Android自定义摇杆

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 源码 KqwRockerDemo 喜欢就给个star,谢谢! 功能 支持自适应大小 支持2个方向、4个方向、8个方向的摇动监听 支持摇动角度获取 可选回调模式 支持可摇动区域自定义 支持摇杆自定义 支持设置图片、色值、Shape图形 使用 <kong.qingwei.rockerlibrary.RockerView android:id="@+id/rockerView_center" android:layout_width="100dp" android:layout_height="100dp" android:layout_centerHorizontal="true" kongqw:areaBackground="#FF333333" kongqw:rockerBackground="#FF987654" kongqw:rockerRadius="15dp" /> 参数 参数 是否必须 描述 areaBackground 可选 可摇动区域的背景 rockerBackground 可选 摇杆的背景 rockerRadius 可选 摇杆半径 设置回调方式 setCallBackMode(CallBackMode mode) 参数 回调方式 描述 CALL_BACK_MODE_MOVE 有移动就立刻回调 CALL_BACK_MODE_STATE_CHANGE 状态有变化的时候回调 监听摇动角度 返回角度的取值范围:[0°,360°)

继续阅读

Android输出正弦波音频信号(左右声道对称)

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 需求:左右声道分别输出不同的音频数据,波形要是一个正弦波,左右声道还要对称! 对硬件不是很了解,说是要通过音波避障。 效果图 之前已经介绍了如何在左右声道输出不同的音频数据。 那么这里主要介绍如何模拟出波形是正弦波的音频数据。 模拟正弦波 /** * 模拟正弦波音频数据 * @param isLeft 左右声道 * @return 音频数据 */ private short[] initData(boolean isLeft) { double phase = 0.0; int amp = 10000; short[] data = new short[bufferSize]; double phaseIncrement = (2 * Math.PI * mFrequency) / mSampleRateInHz; for (int i = 0; i < bufferSize; i++) { if (isLeft) { data[i] = (short) (amp * Math.sin(phase)); } else { data[i] = (short) (-amp * Math.

继续阅读

Android左右声道的控制

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 效果图 源码 AndroidSoundManagerDemo 我这里主要是用到了AudioTrack实现的左右声道的控制,手机一般都只有两个声道,即左声道和右声道,我们在输出的时候可以选择单声道,也可以选择双声道(立体声)。 查看了AudioTrack的API,提供了play()、pause()、stop()、write()等一系列的方法。 通过write()方法,可以实现将音频数据发送出去(播放出来)。 AudioTrack对象的构造 有三个构造方法 AudioTrack (int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode) AudioTrack (int streamType, int sampleRateInHz, int channelConfig, int audioFormat, int bufferSizeInBytes, int mode, int sessionId) AudioTrack (AudioAttributes attributes, AudioFormat format, int bufferSizeInBytes, int mode, int sessionId) 主要参数有如下几个 streamType:以什么形式播放 STREAM_VOICE_CALL STREAM_SYSTEM STREAM_RING STREAM_MUSIC STREAM_ALARM STREAM_NOTIFICATION sampleRateInHz:采样率 channelConfig:声道 AudioFormat.CHANNEL_OUT_MONO:输出单声道音频数据 AudioFormat.

继续阅读

环信即时通讯在Android平台的部署

转载请说明出处! 作者:kqw攻城狮 出处:个人站 | CSDN 官网 环信 下载SDK 创建一个工程 如果想要封装性好一点,也可以在工程里再创建一个环信的Library,然后将SDK里的jar和.so,都导入到工程 清单文件 下面是环信Library库里面的清单文件,包含了权限的设置、APPKEY的设置和服务的声明等。 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="……"> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.USE_CREDENTIALS" /> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.

继续阅读