Search code examples
androidiossocketscan

Setting sound configuration for Socket device


Using the following code to attempt setting the sound on/off for a Socket 8ci...not quite working for me. Can you suggest a proper command? As you can see in the code I set the Sound frequency based on a preference boolean. Thanks!

DeviceInfo device = (DeviceInfo) _scanApiHelper.getDevicesList().lastElement();
short[] soundConfig = new short[3];
// default the sound to On
if(getBRSharedPreferenceBoolean(PreferencesActivity.PREF_SOCKET_SCANNER_BEEP, true)) {
    soundConfig[0] = ISktScanProperty.values.soundFrequency.kSktScanSoundFrequencyHigh;
} else {
    soundConfig[0] = ISktScanProperty.values.soundFrequency.kSktScanSoundFrequencyNone;
}
soundConfig[1] = 200;
soundConfig[2] = 100;

// set the scanner sound config
_scanApiHelper.postSetSoundConfigDevice(
        device,
        ISktScanProperty.values.soundActionType.kSktScanSoundActionTypeGoodScan,
        soundConfig,
        _onSetScanApiConfiguration);

Solution

  • The Problem

    Sound Config Device

    The sound config allows you to set 4 different "actions": kSktScanSoundActionTypeGoodScan, kSktScanSoundActionTypeGoodScanLocal, kSktScanSoundActionTypeBadScan, kSktScanSoundActionTypeBadScanLocal. The difference between GoodScan and BadScan is self-explanatory, but the difference between GoodScan and GoodScanLocal isn't very clear.

    GoodScanLocal, by default, is the sound emitted when a barcode is scanned

    GoodScan is only emitted when the host (e.g. Android, iOS, Windows) sends the scanner a GoodScan or BadScan notification (via kSktScanPropIdDataConfirmationDevice)

    Note: If you are using GoodScan/BadScan to verify decoded data, you probably want to change the confirmation mode (see kSktScanPropIdDataConfirmationMode in the docs). Otherwise the scanner will beep/flash/vibrate twice per scan

    The code snippet your snippet is based on uses the latter to demonstrate that the tone is both configurable and can be triggered by the host.

    You select a tone, hit the confirm button and the scanner emits that tone. It's not clear at first glance, but if you change the tone using the dropdown in SingleEntry and hit confirm, the three tones are very distinct. However, if you change the tone using that same dropdown, the tone you hear when you scan a barcode should not change.

    The Solution

    The best and simplest way to achieve what you are trying to achieve is to set the Local Decode Action with the beep disabled

    Local Decode Action

    // import static com.socketmobile.scanapi.ISktScanProperty.values.localDecodeAction.*;
    
    DeviceInfo device = (DeviceInfo) _scanApiHelper.getDevicesList().lastElement();
    int decodeAction = kSktScanLocalDecodeActionFlash | kSktScanLocalDecodeActionRumble;
    if(getBRSharedPreferenceBoolean(PreferencesActivity.PREF_SOCKET_SCANNER_BEEP, true)) {
        decodeAction |= kSktScanLocalDecodeActionBeep;
    }
    _scanApiHelper.postSetDecodeAction(device, decodeAction)
    

    For completeness sake, to achieve a similar result using the code you posted, you'd only need to change kSktScanSoundActionTypeGoodScan to kSktScanSoundActionTypeGoodScanLocal. Although I would not recommend it.