UAC音频设备测试java
1,使用BuildLibUSB项目编译libusb为so文件android
2,在Android Studio 4.1.1中,新建一个项目,选择empty activitygit
3,在app目录中,新建jniLibs\libusb-1.0\lib目录,拷贝第1步生成的so文件到jniLibs\libusb-1.0\lib目录,分cpu类型存放app
4,在jniLibs\libusb-1.0目录中,新建include目录,从uildLibUSB项目中找到libusb.h并拷贝过来 5,在jniLibs\libusb-1.0目录中,新建Android.mk文件,内容为:ide
LOCAL_PATH := $(call my-dir)oop
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 := -lloggradle
include $(PREBUILT_SHARED_LIBRARY)
6,在BuildLibUSB项目中找到freedv.zip,解压到app\jniLibs目录中ui
7,新建java文件,内容为:this
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标签为:
<activity android:name="com.luoxi.uacdemo.MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>
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<String, UsbDevice> deviceList = mUsbManager.getDeviceList(); Iterator<UsbDevice> 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