android - एपीआई के साथ एंड्रॉइड ब्लूटूथ लो एनर्जी कोड संगत>=21 और एपीआई<21




bluetooth bluetooth-lowenergy (2)

आपका कोड दुर्घटनाग्रस्त है क्योंकि यह गुमनाम आंतरिक वर्ग बना रहा है इसलिए चलाने के समय में यह नहीं लगता कि sCanCallback वर्ग।

नीचे की कोशिश करें और परिणाम साझा करें। इससे पहले कि आप यह प्रयास करें, सुनिश्चित करें कि आप कॉलबैक (स्कैन-कॉलबैक) पर टिप्पणी करते हैं।

 if (Build.VERSION.SDK_INT >= 21) {
            mLEScanner.startScan(filters, settings, new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
              BluetoothDevice btDevice = result.getDevice();
              connectToDevice(btDevice);
         }
         public void connectToDevice(BluetoothDevice device) {
              if (mGatt == null) {
                   mGatt = device.connectGatt(context, false, btleGattCallback);
                   if (Build.VERSION.SDK_INT < 21) {
                        btAdapter.stopLeScan(leScanCallback);
                   } else {
                        mLEScanner.stopScan(mScanCallback);
                   }
               }
         }
    };
        } else {
            btAdapter.startLeScan(leScanCallback);
        }

मैं एक ऐप्लीकेशन विकसित कर रहा हूं जिसे एक BLE डिवाइस से कनेक्ट करना है, मेरे कोड में मैं एपीआई 21 (एंड्रॉइड 5) से कार्यान्वित BLE के लिए नए स्कैन और स्कैन-कॉलबैक का उपयोग करना चाहता हूं लेकिन मुझे एंड्रॉइड 4.3 और इसके बाद के संस्करण के साथ संगतता बनाए रखना होगा।

इसलिए मैंने कोड लिखा है, उदाहरण के लिए, इस तरह से:

        if (Build.VERSION.SDK_INT >= 21) {
            mLEScanner.startScan(filters, settings, mScanCallback);
        } else {
            btAdapter.startLeScan(leScanCallback);
        }

और मैंने 2 कॉलबैक को परिभाषित किया है, एक एपीआई 21 और उससे ऊपर और एपीआई 18 से 20 के लिए:

    //API 21
private ScanCallback mScanCallback = new ScanCallback() {
        @Override
        public void onScanResult(int callbackType, ScanResult result) {
              BluetoothDevice btDevice = result.getDevice();
              connectToDevice(btDevice);
         }
         public void connectToDevice(BluetoothDevice device) {
              if (mGatt == null) {
                   mGatt = device.connectGatt(context, false, btleGattCallback);
                   if (Build.VERSION.SDK_INT < 21) {
                        btAdapter.stopLeScan(leScanCallback);
                   } else {
                        mLEScanner.stopScan(mScanCallback);
                   }
               }
         }
    };


//API 18 to 20
        private BluetoothAdapter.LeScanCallback leScanCallback = new BluetoothAdapter.LeScanCallback() {
        @Override
        public void onLeScan(final BluetoothDevice device, final int rssi, final byte[] scanRecord) {

        btAdapter.stopLeScan(leScanCallback);
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mBluetoothGatt = device.connectGatt(context, false, btleGattCallback);
            }
        });


    }
};

मैंने भी एनोटेशन जोड़ा

@TargetApi(21)

लेकिन जब मैं एंड्रॉइड 4.x पर ऐप लॉन्च करता हूं तो यह त्रुटि को तुरंत समझाता है कि क्लास स्कैनकेलबैक नहीं पाया जा सकता है (केवल जिसे एंड्रॉइड 5 और उसके बाद का इस्तेमाल किया जा सकता है)।

इसे कैसे हल किया जा सकता है?

आपका बहुत बहुत धन्यवाद। डेनियल।


  1. IBleScanCallback क्लास और IBleScanCallback इंटरफ़ेस बनाएँ। IBleScanCallback इंटरफ़ेस एक मार्कर इंटरफ़ेस है IBleScanCallback दूसरे शब्दों में, कोई भी तरीकों के साथ एक अंतरफलक नहीं। यदि आप की आवश्यकता होती है तो आप अंतरफलक के तरीकों को भी जोड़ सकते हैं। ये पद्धति सभी प्रकार की स्कैन कॉलबैक अर्थात जैसे GetListOfFoundBleDevices (), स्पष्ट ListOfFoundBleDevices () इत्यादि के लिए समान कार्यक्षमता करेंगे।
  2. BluetootLeLollipop , और BluetoothLeJellyBean कक्षाएं बनाएं, जो AbstractBluetoothLe क्लास का विस्तार करती हैं। BluetootLeMarshmallow वर्ग जो भी BluetootLeMarshmallow वर्ग प्रदान करता है बनाएँ। mIBleScanCallback क्लास ने mIBleScanCallback फ़ील्ड सुरक्षित कर दिया है जो एक IBleScanCallback ऑब्जेक्ट है IBleScanCallback
  3. BleScanCallbackBase क्लास बनाएं जो IBleScanCallback लागू IBleScanCallback
  4. ScanCallback क्लास बनाएं जो ScanCallback वर्ग को बढ़ाता है और IBleScanCallback इंटरफ़ेस लागू IBleScanCallback है। इस वर्ग में एक सुरक्षित फ़ील्ड scanCallback जिसे BleScanCallbackBase ऑब्जेक्ट के रूप में BleScanCallbackBase किया जाएगा। MarshmallowScanCallback क्लास भी बनाएं, जो MarshmallowScanCallback वर्ग को बढ़ाता है।
  5. JellyBeanScanCallback क्लास बनाएं जो BleScanCallbackBase बढ़ाता है और BluetoothAdapter.LeScanCallback लागू BluetoothAdapter.LeScanCallback
  6. BleScanCallbackBase में विधि ओवरराइड करें: onScanCallback(...)
  7. LollipoScanCallback override onScanResult(int callbackType, ScanResult result) और इस पद्धति के भीतर scanCallback ऑब्जेक्ट के onScanCallback(...) पर विधि को कॉल करें।
  8. onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) ओवरराइड onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) और इस पद्धति के अंदर onScanCallback(...) कॉल करें
  9. अंत में, जो कुछ भी करने की आवश्यकता होती है, जब किसी डिवाइस को BleScanCallbackBase क्लास के onScanCallback(...) विधि में पाया जाता है

संक्षेप में, विरासत पर संरचना के बारे में पढ़ें- मुझे पता है कि यह आपके प्रश्न का उत्तर नहीं है, लेकिन यह अंत में आपको क्या हासिल करना है, यह एक साफ तरीका है। यहां क्लास आरेख है:







android-bluetooth