{"id":793265,"date":"2024-07-26T23:00:13","date_gmt":"2024-07-26T15:00:13","guid":{"rendered":"https:\/\/docs.pingcode.com\/ask\/ask-ask\/793265.html"},"modified":"2024-07-26T23:00:16","modified_gmt":"2024-07-26T15:00:16","slug":"%e7%a7%bb%e5%8a%a8%e7%ab%af%e5%bc%80%e5%8f%91%e6%80%8e%e4%b9%88%e8%b0%83%e7%a1%ac%e4%bb%b6","status":"publish","type":"post","link":"https:\/\/docs.pingcode.com\/ask\/793265.html","title":{"rendered":"\u79fb\u52a8\u7aef\u5f00\u53d1\u600e\u4e48\u8c03\u786c\u4ef6"},"content":{"rendered":"<p style=\"text-align:center\"><img decoding=\"async\" src=\"https:\/\/cdn-kb.worktile.com\/kb\/wp-content\/uploads\/2024\/04\/25142819\/5bb91c72-581e-4fcd-8927-d068cb075022.webp\" alt=\"\u79fb\u52a8\u7aef\u5f00\u53d1\u600e\u4e48\u8c03\u786c\u4ef6\" \/><\/p>\n<p><p>\u79fb\u52a8\u7aef\u5f00\u53d1\u8c03\u8bd5\u786c\u4ef6\u7684\u65b9\u6cd5\u5305\u62ec\uff1a\u4f7f\u7528\u539f\u751fAPI\u3001\u5229\u7528\u7b2c\u4e09\u65b9\u5e93\u3001\u901a\u8fc7\u84dd\u7259\u6216USB\u8fde\u63a5\u8bbe\u5907\u3001\u4f7f\u7528\u6a21\u62df\u5668\u548c\u865a\u62df\u673a\u3002\u5176\u4e2d\uff0c\u4f7f\u7528\u539f\u751fAPI\u662f\u6700\u4e3a\u5e38\u89c1\u548c\u76f4\u63a5\u7684\u65b9\u6cd5\uff0c\u56e0\u4e3a\u5b83\u63d0\u4f9b\u4e86\u5bf9\u786c\u4ef6\u529f\u80fd\u7684\u5168\u9762\u8bbf\u95ee\u548c\u63a7\u5236\u3002<\/p>\n<\/p>\n<p><p>\u4f7f\u7528\u539f\u751fAPI\u662f\u79fb\u52a8\u7aef\u5f00\u53d1\u4e2d\u8c03\u8bd5\u786c\u4ef6\u6700\u4e3a\u5e38\u89c1\u7684\u65b9\u6cd5\u3002\u539f\u751fAPI\u662f\u7531\u79fb\u52a8\u64cd\u4f5c\u7cfb\u7edf\u63d0\u4f9b\u7684\u4e00\u7ec4\u63a5\u53e3\uff0c\u5141\u8bb8\u5f00\u53d1\u8005\u8bbf\u95ee\u548c\u63a7\u5236\u8bbe\u5907\u7684\u786c\u4ef6\u529f\u80fd\u3002\u901a\u8fc7\u8fd9\u4e9bAPI\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u76f4\u63a5\u4e0e\u8bbe\u5907\u7684\u4f20\u611f\u5668\u3001\u6444\u50cf\u5934\u3001\u9ea6\u514b\u98ce\u3001GPS\u7b49\u786c\u4ef6\u4ea4\u4e92\u3002\u539f\u751fAPI\u901a\u5e38\u5177\u6709\u9ad8\u6548\u548c\u7a33\u5b9a\u7684\u7279\u70b9\uff0c\u53ef\u4ee5\u5145\u5206\u5229\u7528\u8bbe\u5907\u7684\u786c\u4ef6\u6027\u80fd\u3002\u6b64\u5916\uff0c\u539f\u751fAPI\u8fd8\u5177\u5907\u826f\u597d\u7684\u6587\u6863\u652f\u6301\u548c\u793e\u533a\u8d44\u6e90\uff0c\u4f7f\u5f00\u53d1\u8005\u80fd\u591f\u5feb\u901f\u4e0a\u624b\u5e76\u89e3\u51b3\u95ee\u9898\u3002<\/p>\n<\/p>\n<p><h2>\u4e00\u3001\u539f\u751fAPI\u7684\u4f7f\u7528<\/h2>\n<\/p>\n<p><h3>1. \u5b89\u5353\u539f\u751fAPI<\/h3>\n<\/p>\n<p><p>\u5b89\u5353\u7cfb\u7edf\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684API\u6765\u8bbf\u95ee\u8bbe\u5907\u7684\u786c\u4ef6\u529f\u80fd\u3002\u5e38\u89c1\u7684\u786c\u4ef6\u5305\u62ec\u6444\u50cf\u5934\u3001\u4f20\u611f\u5668\u3001GPS\u3001\u84dd\u7259\u7b49\u3002<\/p>\n<\/p>\n<p><h4>\u6444\u50cf\u5934<\/h4>\n<\/p>\n<p><p>\u4f7f\u7528\u5b89\u5353\u539f\u751fAPI\u6765\u8bbf\u95ee\u6444\u50cf\u5934\u529f\u80fd\uff0c\u53ef\u4ee5\u901a\u8fc7Camera\u7c7b\u548cCamera2 API\u6765\u5b9e\u73b0\u3002Camera\u7c7b\u662f\u8f83\u4e3a\u57fa\u7840\u7684API\uff0c\u800cCamera2 API\u662f\u66f4\u4e3a\u9ad8\u7ea7\u548c\u7075\u6d3b\u7684\u9009\u62e9\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-java\">Camera camera = Camera.open();<\/p>\n<p>Camera.Parameters params = camera.getParameters();<\/p>\n<p>params.setPictureSize(1920, 1080);<\/p>\n<p>camera.setParameters(params);<\/p>\n<p>camera.startPreview();<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h4>\u4f20\u611f\u5668<\/h4>\n<\/p>\n<p><p>\u5b89\u5353\u8bbe\u5907\u4e0a\u7684\u4f20\u611f\u5668\u53ef\u4ee5\u901a\u8fc7SensorManager\u7c7b\u6765\u7ba1\u7406\u3002\u5e38\u89c1\u7684\u4f20\u611f\u5668\u5305\u62ec\u52a0\u901f\u5ea6\u8ba1\u3001\u9640\u87ba\u4eea\u3001\u78c1\u529b\u8ba1\u7b49\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-java\">SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);<\/p>\n<p>Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);<\/p>\n<p>sensorManager.registerListener(sensorEventListener, accelerometer, SensorManager.SENSOR_DELAY_NORMAL);<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>2. iOS\u539f\u751fAPI<\/h3>\n<\/p>\n<p><p>iOS\u7cfb\u7edf\u540c\u6837\u63d0\u4f9b\u4e86\u4e30\u5bcc\u7684API\u6765\u8bbf\u95ee\u8bbe\u5907\u7684\u786c\u4ef6\u529f\u80fd\u3002\u5e38\u89c1\u7684\u786c\u4ef6\u5305\u62ec\u6444\u50cf\u5934\u3001\u4f20\u611f\u5668\u3001GPS\u3001\u84dd\u7259\u7b49\u3002<\/p>\n<\/p>\n<p><h4>\u6444\u50cf\u5934<\/h4>\n<\/p>\n<p><p>\u4f7f\u7528iOS\u539f\u751fAPI\u6765\u8bbf\u95ee\u6444\u50cf\u5934\u529f\u80fd\uff0c\u53ef\u4ee5\u901a\u8fc7AVFoundation\u6846\u67b6\u6765\u5b9e\u73b0\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-swift\">let captureSession = AVCaptureSession()<\/p>\n<p>guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else { return }<\/p>\n<p>let videoInput: AVCaptureDeviceInput<\/p>\n<p>do {<\/p>\n<p>    videoInput = try AVCaptureDeviceInput(device: videoCaptureDevice)<\/p>\n<p>} catch {<\/p>\n<p>    return<\/p>\n<p>}<\/p>\n<p>if (captureSession.canAddInput(videoInput)) {<\/p>\n<p>    captureSession.addInput(videoInput)<\/p>\n<p>} else {<\/p>\n<p>    return<\/p>\n<p>}<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h4>\u4f20\u611f\u5668<\/h4>\n<\/p>\n<p><p>iOS\u8bbe\u5907\u4e0a\u7684\u4f20\u611f\u5668\u53ef\u4ee5\u901a\u8fc7CoreMotion\u6846\u67b6\u6765\u7ba1\u7406\u3002\u5e38\u89c1\u7684\u4f20\u611f\u5668\u5305\u62ec\u52a0\u901f\u5ea6\u8ba1\u3001\u9640\u87ba\u4eea\u3001\u78c1\u529b\u8ba1\u7b49\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-swift\">let motionManager = CMMotionManager()<\/p>\n<p>if motionManager.isAccelerometerAv<a href=\"https:\/\/docs.pingcode.com\/blog\/59162.html\" target=\"_blank\">AI<\/a>lable {<\/p>\n<p>    motionManager.accelerometerUpdateInterval = 0.1<\/p>\n<p>    motionManager.startAccelerometerUpdates(to: OperationQueue.main) { (data, error) in<\/p>\n<p>        if let accelerometerData = data {<\/p>\n<p>            print(accelerometerData.acceleration)<\/p>\n<p>        }<\/p>\n<p>    }<\/p>\n<p>}<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h2>\u4e8c\u3001\u5229\u7528\u7b2c\u4e09\u65b9\u5e93<\/h2>\n<\/p>\n<p><h3>1. \u5b89\u5353\u7b2c\u4e09\u65b9\u5e93<\/h3>\n<\/p>\n<p><p>\u5b89\u5353\u5e73\u53f0\u4e0a\u6709\u8bb8\u591a\u4f18\u79c0\u7684\u7b2c\u4e09\u65b9\u5e93\uff0c\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u8005\u66f4\u65b9\u4fbf\u5730\u8bbf\u95ee\u548c\u63a7\u5236\u8bbe\u5907\u7684\u786c\u4ef6\u529f\u80fd\u3002<\/p>\n<\/p>\n<p><h4>CameraX<\/h4>\n<\/p>\n<p><p>CameraX\u662f\u5b89\u5353\u63d0\u4f9b\u7684\u4e00\u4e2a\u65b0\u7684\u6444\u50cf\u5934\u5e93\uff0c\u65e8\u5728\u7b80\u5316\u6444\u50cf\u5934\u7684\u4f7f\u7528\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-kotlin\">val cameraProviderFuture = ProcessCameraProvider.getInstance(this)<\/p>\n<p>cameraProviderFuture.addListener(Runnable {<\/p>\n<p>    val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()<\/p>\n<p>    val preview = Preview.Builder().build().also {<\/p>\n<p>        it.setSurfaceProvider(viewFinder.createSurfaceProvider())<\/p>\n<p>    }<\/p>\n<p>    val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA<\/p>\n<p>    try {<\/p>\n<p>        cameraProvider.unbindAll()<\/p>\n<p>        cameraProvider.bindToLifecycle(this, cameraSelector, preview)<\/p>\n<p>    } catch(exc: Exception) {<\/p>\n<p>        Log.e(TAG, &quot;Use case binding failed&quot;, exc)<\/p>\n<p>    }<\/p>\n<p>}, ContextCompat.getMainExecutor(this))<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h4>Retrofit<\/h4>\n<\/p>\n<p><p>Retrofit\u662f\u4e00\u4e2a\u5f3a\u5927\u7684HTTP\u5ba2\u6237\u7aef\u5e93\uff0c\u867d\u7136\u5b83\u4e3b\u8981\u7528\u4e8e\u7f51\u7edc\u8bf7\u6c42\uff0c\u4f46\u4e5f\u53ef\u4ee5\u7528\u4e8e\u4e0e\u786c\u4ef6\u8bbe\u5907\u8fdb\u884c\u901a\u4fe1\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-kotlin\">val retrofit = Retrofit.Builder()<\/p>\n<p>    .baseUrl(&quot;https:\/\/api.example.com\/&quot;)<\/p>\n<p>    .addConverterFactory(GsonConverterFactory.create())<\/p>\n<p>    .build()<\/p>\n<p>val service = retrofit.create(DeviceService::class.java)<\/p>\n<p>val call = service.getDeviceStatus()<\/p>\n<p>call.enqueue(object : Callback&lt;DeviceStatus&gt; {<\/p>\n<p>    override fun onResponse(call: Call&lt;DeviceStatus&gt;, response: Response&lt;DeviceStatus&gt;) {<\/p>\n<p>        if (response.isSuccessful) {<\/p>\n<p>            val status = response.body()<\/p>\n<p>            \/\/ \u5904\u7406\u8bbe\u5907\u72b6\u6001<\/p>\n<p>        }<\/p>\n<p>    }<\/p>\n<p>    override fun onFailure(call: Call&lt;DeviceStatus&gt;, t: Throwable) {<\/p>\n<p>        \/\/ \u5904\u7406\u9519\u8bef<\/p>\n<p>    }<\/p>\n<p>})<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>2. iOS\u7b2c\u4e09\u65b9\u5e93<\/h3>\n<\/p>\n<p><p>iOS\u5e73\u53f0\u4e0a\u540c\u6837\u6709\u8bb8\u591a\u4f18\u79c0\u7684\u7b2c\u4e09\u65b9\u5e93\uff0c\u53ef\u4ee5\u5e2e\u52a9\u5f00\u53d1\u8005\u66f4\u65b9\u4fbf\u5730\u8bbf\u95ee\u548c\u63a7\u5236\u8bbe\u5907\u7684\u786c\u4ef6\u529f\u80fd\u3002<\/p>\n<\/p>\n<p><h4>Alamofire<\/h4>\n<\/p>\n<p><p>Alamofire\u662f\u4e00\u4e2a\u5f3a\u5927\u7684HTTP\u5ba2\u6237\u7aef\u5e93\uff0c\u4e3b\u8981\u7528\u4e8e\u7f51\u7edc\u8bf7\u6c42\uff0c\u4f46\u4e5f\u53ef\u4ee5\u7528\u4e8e\u4e0e\u786c\u4ef6\u8bbe\u5907\u8fdb\u884c\u901a\u4fe1\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-swift\">Alamofire.request(&quot;https:\/\/api.example.com\/device\/status&quot;).responseJSON { response in<\/p>\n<p>    if let json = response.result.value {<\/p>\n<p>        print(&quot;JSON: \\(json)&quot;) \/\/ \u5904\u7406\u8bbe\u5907\u72b6\u6001<\/p>\n<p>    }<\/p>\n<p>}<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h4>SwiftyJSON<\/h4>\n<\/p>\n<p><p>SwiftyJSON\u662f\u4e00\u4e2a\u7528\u4e8e\u5904\u7406JSON\u6570\u636e\u7684\u5e93\uff0c\u975e\u5e38\u9002\u5408\u4e0e\u8bbe\u5907\u8fdb\u884c\u901a\u4fe1\u65f6\u89e3\u6790\u54cd\u5e94\u6570\u636e\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-swift\">Alamofire.request(&quot;https:\/\/api.example.com\/device\/status&quot;).responseJSON { response in<\/p>\n<p>    if let data = response.data {<\/p>\n<p>        let json = try? JSON(data: data)<\/p>\n<p>        if let status = json?[&quot;status&quot;].string {<\/p>\n<p>            print(&quot;Device Status: \\(status)&quot;) \/\/ \u5904\u7406\u8bbe\u5907\u72b6\u6001<\/p>\n<p>        }<\/p>\n<p>    }<\/p>\n<p>}<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h2>\u4e09\u3001\u901a\u8fc7\u84dd\u7259\u6216USB\u8fde\u63a5\u8bbe\u5907<\/h2>\n<\/p>\n<p><h3>1. \u84dd\u7259\u8fde\u63a5<\/h3>\n<\/p>\n<p><p>\u84dd\u7259\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u65e0\u7ebf\u901a\u4fe1\u6280\u672f\uff0c\u5e7f\u6cdb\u5e94\u7528\u4e8e\u79fb\u52a8\u8bbe\u5907\u4e4b\u95f4\u7684\u901a\u4fe1\u3002<\/p>\n<\/p>\n<p><h4>\u5b89\u5353\u84dd\u7259\u8fde\u63a5<\/h4>\n<\/p>\n<p><p>\u4f7f\u7528\u5b89\u5353\u7684BluetoothAdapter\u7c7b\u53ef\u4ee5\u5b9e\u73b0\u84dd\u7259\u8fde\u63a5\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-java\">BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();<\/p>\n<p>if (bluetoothAdapter == null) {<\/p>\n<p>    \/\/ \u8bbe\u5907\u4e0d\u652f\u6301\u84dd\u7259<\/p>\n<p>}<\/p>\n<p>if (!bluetoothAdapter.isEnabled()) {<\/p>\n<p>    Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);<\/p>\n<p>    startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);<\/p>\n<p>}<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h4>iOS\u84dd\u7259\u8fde\u63a5<\/h4>\n<\/p>\n<p><p>\u4f7f\u7528iOS\u7684CoreBluetooth\u6846\u67b6\u53ef\u4ee5\u5b9e\u73b0\u84dd\u7259\u8fde\u63a5\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-swift\">import CoreBluetooth<\/p>\n<p>class ViewController: UIViewController, CBCentralManagerDelegate {<\/p>\n<p>    var centralManager: CBCentralManager!<\/p>\n<p>    override func viewDidLoad() {<\/p>\n<p>        super.viewDidLoad()<\/p>\n<p>        centralManager = CBCentralManager(delegate: self, queue: nil)<\/p>\n<p>    }<\/p>\n<p>    func centralManagerDidUpdateState(_ central: CBCentralManager) {<\/p>\n<p>        if central.state == .poweredOn {<\/p>\n<p>            centralManager.scanForPeripherals(withServices: nil, options: nil)<\/p>\n<p>        }<\/p>\n<p>    }<\/p>\n<p>}<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>2. USB\u8fde\u63a5<\/h3>\n<\/p>\n<p><p>USB\u8fde\u63a5\u662f\u4e00\u79cd\u5e38\u89c1\u7684\u6709\u7ebf\u901a\u4fe1\u6280\u672f\uff0c\u5e7f\u6cdb\u5e94\u7528\u4e8e\u79fb\u52a8\u8bbe\u5907\u4e0e\u5916\u90e8\u8bbe\u5907\u4e4b\u95f4\u7684\u901a\u4fe1\u3002<\/p>\n<\/p>\n<p><h4>\u5b89\u5353USB\u8fde\u63a5<\/h4>\n<\/p>\n<p><p>\u4f7f\u7528\u5b89\u5353\u7684UsbManager\u7c7b\u53ef\u4ee5\u5b9e\u73b0USB\u8fde\u63a5\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-java\">UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);<\/p>\n<p>HashMap&lt;String, UsbDevice&gt; deviceList = usbManager.getDeviceList();<\/p>\n<p>UsbDevice device = deviceList.get(&quot;deviceName&quot;);<\/p>\n<p>UsbDeviceConnection connection = usbManager.openDevice(device);<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h4>iOS USB\u8fde\u63a5<\/h4>\n<\/p>\n<p><p>iOS\u8bbe\u5907\u901a\u5e38\u4e0d\u76f4\u63a5\u901a\u8fc7USB\u8fdb\u884c\u5f00\u53d1\u8c03\u8bd5\uff0c\u800c\u662f\u901a\u8fc7Xcode\u8fdb\u884c\u8c03\u8bd5\u3002\u4e0d\u8fc7\uff0c\u53ef\u4ee5\u4f7f\u7528ExternalAccessory\u6846\u67b6\u6765\u4e0e\u652f\u6301MFi\u8ba4\u8bc1\u7684\u8bbe\u5907\u8fdb\u884c\u901a\u4fe1\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-swift\">import ExternalAccessory<\/p>\n<p>let accessoryManager = EAAccessoryManager.shared()<\/p>\n<p>let connectedAccessories = accessoryManager.connectedAccessories<\/p>\n<p>if let accessory = connectedAccessories.first {<\/p>\n<p>    let session = EASession(accessory: accessory, forProtocol: accessory.protocols.first!)<\/p>\n<p>    \/\/ \u5904\u7406\u4f1a\u8bdd<\/p>\n<p>}<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h2>\u56db\u3001\u4f7f\u7528\u6a21\u62df\u5668\u548c\u865a\u62df\u673a<\/h2>\n<\/p>\n<p><h3>1. \u5b89\u5353\u6a21\u62df\u5668<\/h3>\n<\/p>\n<p><p>\u5b89\u5353\u6a21\u62df\u5668\u662f\u5b89\u5353\u5f00\u53d1\u4e2d\u5e38\u7528\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u6a21\u62df\u591a\u79cd\u8bbe\u5907\u548c\u786c\u4ef6\u529f\u80fd\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\"># \u542f\u52a8\u6a21\u62df\u5668<\/p>\n<p>emulator -avd avd_name<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h3>2. iOS\u6a21\u62df\u5668<\/h3>\n<\/p>\n<p><p>iOS\u6a21\u62df\u5668\u662fiOS\u5f00\u53d1\u4e2d\u5e38\u7528\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u6a21\u62df\u591a\u79cd\u8bbe\u5907\u548c\u786c\u4ef6\u529f\u80fd\u3002<\/p>\n<\/p>\n<p><pre><code class=\"language-bash\"># \u542f\u52a8\u6a21\u62df\u5668<\/p>\n<p>xcrun simctl boot &quot;iPhone 11&quot;<\/p>\n<p><\/code><\/pre>\n<\/p>\n<p><h2>\u603b\u7ed3<\/h2>\n<\/p>\n<p><p>\u79fb\u52a8\u7aef\u5f00\u53d1\u8c03\u8bd5\u786c\u4ef6\u7684\u65b9\u6cd5\u6709\u5f88\u591a\uff0c\u5305\u62ec\u4f7f\u7528\u539f\u751fAPI\u3001\u5229\u7528\u7b2c\u4e09\u65b9\u5e93\u3001\u901a\u8fc7\u84dd\u7259\u6216USB\u8fde\u63a5\u8bbe\u5907\u3001\u4f7f\u7528\u6a21\u62df\u5668\u548c\u865a\u62df\u673a\u3002<strong>\u4f7f\u7528\u539f\u751fAPI\u662f\u6700\u4e3a\u5e38\u89c1\u548c\u76f4\u63a5\u7684\u65b9\u6cd5<\/strong>\uff0c\u56e0\u4e3a\u5b83\u63d0\u4f9b\u4e86\u5bf9\u786c\u4ef6\u529f\u80fd\u7684\u5168\u9762\u8bbf\u95ee\u548c\u63a7\u5236\u3002\u901a\u8fc7\u8fd9\u4e9b\u65b9\u6cd5\uff0c\u5f00\u53d1\u8005\u53ef\u4ee5\u66f4\u597d\u5730\u4e86\u89e3\u548c\u5229\u7528\u8bbe\u5907\u7684\u786c\u4ef6\u529f\u80fd\uff0c\u4ece\u800c\u5f00\u53d1\u51fa\u66f4\u52a0\u9ad8\u6548\u548c\u7a33\u5b9a\u7684\u5e94\u7528\u3002<\/p>\n<\/p>\n<p><p>\u5e0c\u671b\u672c\u6587\u5bf9\u4f60\u5728\u79fb\u52a8\u7aef\u5f00\u53d1\u4e2d\u8c03\u8bd5\u786c\u4ef6\u6709\u6240\u5e2e\u52a9\uff01\u5982\u679c\u6709\u4efb\u4f55\u7591\u95ee\u6216\u9700\u8981\u8fdb\u4e00\u6b65\u7684\u6307\u5bfc\uff0c\u8bf7\u968f\u65f6\u8054\u7cfb\u6211\u3002<\/p>\n<\/p>\n<h2><strong>\u76f8\u5173\u95ee\u7b54FAQs\uff1a<\/strong><\/h2>\n<p><strong>1. \u79fb\u52a8\u7aef\u5f00\u53d1\u4e2d\u5982\u4f55\u8c03\u7528\u624b\u673a\u6444\u50cf\u5934\uff1f<\/strong><br \/>\n\u5728\u79fb\u52a8\u7aef\u5f00\u53d1\u4e2d\uff0c\u53ef\u4ee5\u4f7f\u7528\u5404\u79cd\u5f00\u53d1\u6846\u67b6\u548cAPI\u6765\u8c03\u7528\u624b\u673a\u6444\u50cf\u5934\u3002\u4f8b\u5982\uff0c\u53ef\u4ee5\u4f7f\u7528HTML5\u7684<code>getUserMedia<\/code> API\uff0c\u6216\u8005\u4f7f\u7528React Native\u3001Flutter\u7b49\u8de8\u5e73\u53f0\u5f00\u53d1\u6846\u67b6\u63d0\u4f9b\u7684\u6444\u50cf\u5934\u6a21\u5757\u6765\u5b9e\u73b0\u3002\u5177\u4f53\u7684\u8c03\u7528\u65b9\u6cd5\u53ef\u4ee5\u53c2\u8003\u76f8\u5173\u6587\u6863\u548c\u793a\u4f8b\u4ee3\u7801\u3002<\/p>\n<p><strong>2. \u5982\u4f55\u5728\u79fb\u52a8\u5e94\u7528\u4e2d\u4f7f\u7528\u624b\u673a\u4f20\u611f\u5668\uff1f<\/strong><br \/>\n\u5728\u79fb\u52a8\u5e94\u7528\u5f00\u53d1\u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528\u624b\u673a\u4f20\u611f\u5668\u6765\u83b7\u53d6\u5404\u79cd\u4fe1\u606f\uff0c\u5982\u91cd\u529b\u3001\u52a0\u901f\u5ea6\u3001\u9640\u87ba\u4eea\u7b49\u3002\u53ef\u4ee5\u4f7f\u7528Android\u6216iOS\u63d0\u4f9b\u7684\u4f20\u611f\u5668API\uff0c\u6216\u8005\u4f7f\u7528\u8de8\u5e73\u53f0\u5f00\u53d1\u6846\u67b6\u4e2d\u7684\u4f20\u611f\u5668\u6a21\u5757\u6765\u5b9e\u73b0\u3002\u5f00\u53d1\u8005\u53ef\u4ee5\u6839\u636e\u5177\u4f53\u9700\u6c42\u9009\u62e9\u5408\u9002\u7684\u65b9\u6cd5\uff0c\u5e76\u53c2\u8003\u76f8\u5173\u6587\u6863\u548c\u793a\u4f8b\u4ee3\u7801\u8fdb\u884c\u8c03\u7528\u3002<\/p>\n<p><strong>3. \u79fb\u52a8\u5e94\u7528\u5982\u4f55\u4f7f\u7528\u624b\u673a\u7684\u5b9a\u4f4d\u529f\u80fd\uff1f<\/strong><br \/>\n\u5728\u79fb\u52a8\u5e94\u7528\u5f00\u53d1\u4e2d\uff0c\u53ef\u4ee5\u901a\u8fc7\u4f7f\u7528\u624b\u673a\u7684\u5b9a\u4f4d\u529f\u80fd\u6765\u83b7\u53d6\u7528\u6237\u7684\u4f4d\u7f6e\u4fe1\u606f\u3002\u53ef\u4ee5\u4f7f\u7528Android\u6216iOS\u63d0\u4f9b\u7684\u5b9a\u4f4dAPI\uff0c\u6216\u8005\u4f7f\u7528\u8de8\u5e73\u53f0\u5f00\u53d1\u6846\u67b6\u4e2d\u7684\u5b9a\u4f4d\u6a21\u5757\u6765\u5b9e\u73b0\u3002\u5f00\u53d1\u8005\u53ef\u4ee5\u6839\u636e\u9700\u6c42\u9009\u62e9\u5408\u9002\u7684\u65b9\u6cd5\uff0c\u5e76\u53c2\u8003\u76f8\u5173\u6587\u6863\u548c\u793a\u4f8b\u4ee3\u7801\u8fdb\u884c\u8c03\u7528\u3002\u5728\u8c03\u7528\u65f6\uff0c\u9700\u8981\u6ce8\u610f\u7528\u6237\u9690\u79c1\u95ee\u9898\uff0c\u5e76\u5728\u5e94\u7528\u4e2d\u8fdb\u884c\u5fc5\u8981\u7684\u6743\u9650\u7533\u8bf7\u548c\u63d0\u793a\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"\u79fb\u52a8\u7aef\u5f00\u53d1\u8c03\u8bd5\u786c\u4ef6\u7684\u65b9\u6cd5\u5305\u62ec\uff1a\u4f7f\u7528\u539f\u751fAPI\u3001\u5229\u7528\u7b2c\u4e09\u65b9\u5e93\u3001\u901a\u8fc7\u84dd\u7259\u6216USB\u8fde\u63a5\u8bbe\u5907\u3001\u4f7f\u7528\u6a21\u62df\u5668\u548c\u865a\u62df\u673a\u3002\u5176\u4e2d [&hellip;]","protected":false},"author":3,"featured_media":793269,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[37],"tags":[],"acf":[],"_links":{"self":[{"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/posts\/793265"}],"collection":[{"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/comments?post=793265"}],"version-history":[{"count":"1","href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/posts\/793265\/revisions"}],"predecessor-version":[{"id":793272,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/posts\/793265\/revisions\/793272"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/media\/793269"}],"wp:attachment":[{"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/media?parent=793265"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/categories?post=793265"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/docs.pingcode.com\/wp-json\/wp\/v2\/tags?post=793265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}