UAC音频设备测试
1,使用BuildLibUSB项目编译libusb为so文件
2,在Android Studio 4.1.1中,新建一个项目,选择empty activity
3,在app目录中,新建jniLibs\libusb-1.0\lib目录,拷贝第1步生成的so文件到jniLibs\libusb-1.0\lib目录,分cpu类型存放
4,在jniLibs\libusb-1.0目录中,新建include目录,从uildLibUSB项目中找到libusb.h并拷贝过来 5,在jniLibs\libusb-1.0目录中,新建Android.mk文件,内容为:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libusb-1.0
LOCAL_SRC_FILES := lib/$(TARGET_ARCH_ABI)/libusb-1.0.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include/libusb-1.0
LOCAL_EXPORT_LDLIBS := -llog
include $(PREBUILT_SHARED_LIBRARY)
6,在BuildLibUSB项目中找到freedv.zip,解压到app\jniLibs目录中
7,新建java文件,内容为:
public class UsbAudio {
static {
System.loadLibrary("usbaudio");
}
public native boolean setup();
public native void close();
public native void loop();
public native boolean stop();
public native int measure();
}
8,修改调用so文件的c语言文件,替换com_luoxi_uac,com.luoxi.uac,com/luoxi/uac等包含包名的字符串为自己的
9,新增MainActivity,并修改AndroidManifest.xml文件中的activity标签为:
android:name="com.luoxi.uacdemo.MainActivity"
android:label="@string/app_name">
10,修改app的build.gradle文件,在android域里面新增NDK相关设置
ndkPath "E:\\android-ndk-r21b"
sourceSets {
main {
jniLibs.srcDirs = ["jniLibs"]
}
}
externalNativeBuild {
ndkBuild {
path "jniLibs/Android.mk"
}
}
11,拷贝usbhelper到java目录下,usbhelper可以从BuildLibUSB项目根目录中找到
12,修改MainActivity的OnCreate方法,增加初始化代码,类似于:
mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap deviceList = mUsbManager.getDeviceList();
Iterator deviceIterator = deviceList.values().iterator();
while(deviceIterator.hasNext()){
UsbDevice device = deviceIterator.next();
UsbInterface intf = device.getInterface(0);
if (intf.getInterfaceClass() == UsbConstants.USB_CLASS_AUDIO) {
mAudioDevice = device;
}
}
System.loadLibrary("usb-1.0");
UsbHelper.useContext(getApplicationContext());
mUsbAudio = new UsbAudio();
AudioPlayback.setup();
13,在相应位置(例如在mainActivity的按钮事件侦听方法中)增加声音捕获代码,例如:
try{
if (mUsbAudio.setup() == true) {
}
}catch (Exception e){
e.printStackTrace();
}
new Thread(new Runnable() {
public void run() {
while (true) {
try {
mUsbAudio.loop();
}catch (Exception e){
e.printStackTrace();
}
}
}
}).start();
14,在相应位置增加声音捕获停止代码,例如:
mUsbAudio.stop();
mUsbAudio.close();
15,在相应位置增加Android操作系统的权限申请代码,例如:
mPermissionIntent = PendingIntent.getBroadcast(this, 0, new Intent(ACTION_USB_PERMISSION), 0);
IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
mUsbPermissionReciever = new UsbReciever();
registerReceiver(mUsbPermissionReciever, filter);
if (mAudioDevice != null && mPermissionIntent != null) {
mUsbManager.requestPermission(mAudioDevice, mPermissionIntent);
}
16,在相应位置增加注销代码,例如:
unregisterReceiver(mUsbPermissionReciever);
if (mUsbAudio != null) {
mUsbAudio.stop();
mUsbAudio.close();
}
17,在相应位置增加USB设备变动广播侦听器,例如:
private class UsbReciever extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
UsbDevice device = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
if (ACTION_USB_PERMISSION.equals(action)) {
if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
setDevice(device);
}
}
}
}
18,处理其他问题,后编译运行
源代码:https://gitee.com/radarfyh/multimedia-system/tree/master/TestUAC1