1

Java コンパイラの動作と Android のさまざまな API に関する質問があります。

Bluetooth LE接続を表すクラスがあります。そして、このクラスの API のバージョンをチェックして、使用する必要があるデバイスをスキャンするメソッドを確認します。ここにあります:

public class BleConnector{

    private MyScanCallback _scanCallback;


private LeScanHandle _leScanHndl;
private BluetoothAdapter _bluetoothAdapter;

/**
 * Initializes new instance of BLE connector
 */
public BleConnector()
{
    //Creating handle for device scan callback;
    _leScanHndl = new LeScanHandle();

    //Check version of android api
    //If it is bigger of equal to 21
    //create scan callback for higher versions
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        _scanCallback = new ScanCallback(_leScanHndl);
    }
}


public void startScan(Context context) throws PermissoinException
{
    final BluetoothManager bluetoothManager = (BluetoothManager) context.getSystemService(Context.BLUETOOTH_SERVICE);
    _bluetoothAdapter = bluetoothManager.getAdapter();

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    {
        if (ContextCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED)
        {
            _bluetoothAdapter.getBluetoothLeScanner().startScan(_scanCallback);
        }
        else
        {
             throw new PermissoinException("Location permission does not allowed");
        }
    }
    else
    {
        _bluetoothAdapter.startLeScan(_leScanHndl);
    }
    //TODO notify
}

public void stopScan()
{
    if (_bluetoothAdapter != null)
    {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
        {
           _bluetoothAdapter.getBluetoothLeScanner().stopScan(_scanCallback);
        } else
        {
            _bluetoothAdapter.stopLeScan(_leScanHndl);
        }
    }

    //TODO notify
}

private void connectToDevice(BluetoothDevice device)
{
    //TODO notify

   //TODO connect gatt
}

クラス MyScanCallback は @TargetAPI 21 でマークされています。もちろん、デバイスのバージョンが 21 未満の場合は使用したくありません。

ご覧のとおり、 _scanCallbackのすべての使用法と初期化はifステートメント内にあります。だから私の質問は:

初期化と_scanCallbackprivate MyScanCallback _scanCallback;の使用がない場合、api<21 のデバイスで宣言に問題が発生し たり、コンパイラによって削除されたりすることはありますか?

ありがとうございました!

UDT

ああ、MyScanCallback が 21 API レベルからの ScanCallback を継承するとは言いませんでしたpublic class MyScanCallback extends ScanCallback

4

1 に答える 1