Как сгенерировать и сохранить UUID локально на телефоне пользователя? - PullRequest
0 голосов
/ 03 августа 2020

Я хочу сгенерировать UUID для пользователя и сохранить его локально для использования во время передачи сигнала Bluetooth с низким энергопотреблением.

Вот что я пробовал:

Класс для генерации UUID для пользователя:

public class Installation{
    private static String uniqueID = null;
    private static final String PREF_UNIQUE_ID = "PREF_UNIQUE_ID";
    public synchronized static String id(Context context) {
        if (uniqueID == null) {
            SharedPreferences sharedPrefs = context.getSharedPreferences(
                    PREF_UNIQUE_ID, Context.MODE_PRIVATE);
            uniqueID = sharedPrefs.getString(PREF_UNIQUE_ID, null);
            if (uniqueID == null) {
                uniqueID = UUID.randomUUID().toString();
                SharedPreferences.Editor editor = sharedPrefs.edit();
                editor.putString(PREF_UNIQUE_ID, uniqueID);
                editor.commit();
            }
        }    return uniqueID;
    }
}

А вот код передачи:

AdvertisingSetParameters parameters = new AdvertisingSetParameters.Builder()
                .setInterval(advInterval)
                .setTxPowerLevel(AdvertisingSetParameters.TX_POWER_MEDIUM)
                .setConnectable(true)
                .build();

        deviceId = Installation.id ( this );
        ParcelUuid pUuid = new ParcelUuid( UUID.fromString( deviceId ) );
        AdvertiseData data = new AdvertiseData.Builder()
                .addServiceUuid( pUuid )
                .addServiceData( pUuid, "Data".getBytes( StandardCharsets.UTF_8 ) )
                .build();

        mAdvertiseCallback = new AdvertisingSetCallback () {

            @Override
            public void onAdvertisingSetStarted(AdvertisingSet advertisingSet,
                                                int txPower,
                                                int status) {
                super.onAdvertisingSetStarted (advertisingSet, txPower, status);
                count += 1 ;
                mPacketsSent.setText ( count );
                Toast.makeText( BluetoothActivity.this, "Started "+ status, Toast.LENGTH_LONG ).show ();

            }

Но я продолжаю получать ошибки: Unknown bits set in runtime_flags: 0x28000

2020-08-03 12:30:52.871 31040-31040/? E/PswFrameworkFactory:  Reflect exception getInstance: java.lang.ClassNotFoundException: com.oppo.common.PswFrameworkFactoryImpl
2020-08-03 12:30:52.990 31040-31076/com.example.beacondistance E/Perf: Fail to get file list com.example.beacondistance
2020-08-03 12:30:52.990 31040-31076/com.example.beacondistance E/Perf: getFolderSize() : Exception_1 = java.lang.NullPointerException: Attempt to get length of null array

Что я делаете что-то неправильно в приведенном выше блоке кода? Для меня не имеет значения, что UUID будет меняться для каждой установки, я просто хочу, чтобы он создавался и рекламировался в сигнале.

1 Ответ

1 голос
/ 03 августа 2020

В случае рекламы Bluetooth LE вы можете отправить 31 байт данных. Если вы добавите Tx power / Service UUID / Service data, это также займет места. И это также может быть аппаратная проблема, поэтому я рекомендую вам также протестировать на разных устройствах. Я сделал приложение Contact Tracer, поэтому я знаю, с какими ситуациями вы можете столкнуться. Я делюсь рекламным кодом, который у меня сработал.

private void advertise() {
        advertiser = bluetoothAdapter.getBluetoothLeAdvertiser();

        AdvertiseSettings settings = new AdvertiseSettings.Builder()
                .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
                .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
                .setConnectable(false)
                .setTimeout(0)
                .build();

        ParcelUuid pUuid = new ParcelUuid(your_uuid);

        final AdvertiseData data = new AdvertiseData.Builder()
                .setIncludeDeviceName(false)
                .setIncludeTxPowerLevel(false)
                .addServiceUuid(pUuid)
                .addManufacturerData(DATA_MARKER, DATA_VALUE)
                .build();

        advertiser.startAdvertising( settings, data, advertisingCallback );
}

Несколько вещей, которые я хочу упомянуть, когда вы добавляли UUID, вы уже использовали 16 байтов. Так что для DATA_MARKER и DATA_VALUE вы можете выбрать int, который не будет превышать размер пакета.

...