0

I have been trying to implement an single choice dialog where you select one of the TxPower options and depending the option you select (-23dBm-> decimal=0) you'll have one value or other. What I want to do is to transform that int value to hex value and then call a function I created to transform it into byte and return the final value. I would like to call this function because it is generally called by the program.

Here is the code of the single choice dialog:

fields.writeBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                UUID uuid = mCharacteristic.getUuid();
                if (uuid.equals(BleDefinedUUIDs.Characteristic.TxPower)){
                    final CharSequence[] choice = {"-23dBm","-6dBm","0dBm","4dBm"};
                    new AlertDialog.Builder(v.getContext())
                    .setSingleChoiceItems(choice, 0, null)
                    .setPositiveButton("OK", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            dialog.dismiss();
                            int selectedPosition = ((AlertDialog)dialog).getListView().getCheckedItemPosition();
                            if (selectedPosition == 0) {
                                String hex = Integer.toHexString(selectedPosition).toLowerCase(Locale.getDefault());
                                byte[] dataToWrite = parseHexStringToBytes(hex);

                                mBleWrapper.writeDataToCharacteristic(mCharacteristic, dataToWrite);
                            }
                            if (selectedPosition == 1) {
                                String hex = Integer.toHexString(selectedPosition).toLowerCase(Locale.getDefault());
                                byte[] dataToWrite = parseHexStringToBytes(hex);

                                mBleWrapper.writeDataToCharacteristic(mCharacteristic, dataToWrite);
                            }
                            if (selectedPosition == 2) {
                                String hex = Integer.toHexString(selectedPosition).toLowerCase(Locale.getDefault());
                                byte[] dataToWrite = parseHexStringToBytes(hex);

                                mBleWrapper.writeDataToCharacteristic(mCharacteristic, dataToWrite);
                            }
                            if (selectedPosition == 3) {
                                String hex = Integer.toHexString(selectedPosition).toLowerCase(Locale.getDefault());
                                byte[] dataToWrite = parseHexStringToBytes(hex);

                                mBleWrapper.writeDataToCharacteristic(mCharacteristic, dataToWrite);
                            }
                        }
                    })
                    .show();

                }
            }

        });  

And here is the function parseHexStringToBytes which transforms the returns the final byte value:

public byte[] parseHexStringToBytes(final String hex) {
    String tmp = hex.substring(2).replaceAll("[^[0-9][a-f]]", "");
    byte[] bytes = new byte[tmp.length() / 2]; // every two letters in the string are one byte finally

    String part = "";

    for(int i = 0; i < bytes.length; ++i) {
        part = "0x" + tmp.substring(i*2, i*2+2);
        bytes[i] = Long.decode(part).byteValue();
    }

    return bytes;
}

And finally, this is the logcat of the error itself:

07-25 16:38:56.467: E/AndroidRuntime(7326): FATAL EXCEPTION: main
07-25 16:38:56.467: E/AndroidRuntime(7326): Process: org.bluetooth.bledemo, PID: 7326
07-25 16:38:56.467: E/AndroidRuntime(7326): java.lang.StringIndexOutOfBoundsException: length=1; index=2
07-25 16:38:56.467: E/AndroidRuntime(7326):     at java.lang.String.indexAndLength(String.java:584)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at java.lang.String.substring(String.java:1449)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at org.bluetooth.bledemo.CharacteristicDetailsAdapter.parseHexStringToBytes(CharacteristicDetailsAdapter.java:102)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at org.bluetooth.bledemo.CharacteristicDetailsAdapter$2$1.onClick(CharacteristicDetailsAdapter.java:171)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:167)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at android.os.Handler.dispatchMessage(Handler.java:102)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at android.os.Looper.loop(Looper.java:136)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at android.app.ActivityThread.main(ActivityThread.java:5579)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at java.lang.reflect.Method.invokeNative(Native Method)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at java.lang.reflect.Method.invoke(Method.java:515)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
07-25 16:38:56.467: E/AndroidRuntime(7326):     at dalvik.system.NativeStart.main(Native Method)

Note: The line 171 corresponds to calling the parseHexStringToBytes when the selectposition ==1 and the line 102 is the String tmp from the function parseHexStringToBytes.

If you require any further information, please let me know but I seriously need someone to help me out with this problem

user255357
  • 21
  • 6

1 Answers1

0

It seems like your byte[] is too small and therefore can't handle what you try to put in. I suggest you to double check the size you allow it.

Moreover, have you checked this answer ?

You could try to use

byte[] bytes = hexStringToByteArray(yourString);

Where that fonction, as described in the link is defined as :

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                         + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}

Tell me if it helped anyhow =)

Community
  • 1
  • 1
Kevin Gilles
  • 463
  • 1
  • 8
  • 23