我一直在尝试实现一个单选对话框,您可以在其中选择TxPower选项之一,并根据您选择的选项(-23dBm)-
下面是单选对话框的代码:
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();
}
}
});
下面是函数parseHextStringToBytes,它转换返回最终字节值:
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;
}
最后,这是错误本身的日志:
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)
注意:当selectposition==1时,第171行对应于调用ParseHextStringToBytes,第102行是函数ParseHextStringToBytes中的字符串tmp。
如果您需要任何进一步的信息,请让我知道,但我真的需要有人帮助我解决这个问题
您的字节[]似乎太小,因此无法处理您试图输入的内容。我建议你仔细检查一下允许的尺寸。
此外,你检查过这个答案吗?
你可以试着用
byte[] bytes = hexStringToByteArray(yourString);
其中,链接中所述的功能定义为:
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;
}
告诉我它是否有帮助=)
我知道,如果我们对字节值执行算术运算,那么隐式地将其提升为int值,结果将是int值,因此我们需要显式地将其转换为byte,以便将结果存储在byte变量中。但我想问- 从字节到int的转换是在声明它的时候发生的,还是在我们在算术运算中使用它的时候发生的?因为我使用的java反编译器在声明时将它从字节转换为int。所以,这是反编译器的问题还是真的是这样。 如果它真的发生在声明时,那么为什么存储超出字
问题内容: 实际上,我需要将值与过孔一起转移。.现在我的问题是我需要将a。转移为 单个 值.. tat是否可以 转换 为 单个 值..并在那里检索它…我尝试了 铸造 的事情,但它不是有用。如果我的做法是正确的只是帮助我这个,或者说一些其他的方式。 (每次使用铸造时,返回的都是65535) 问题答案: 那这个呢? 和
如何将字符串值转换为int?我正在获取。 结果应该类似于。
问题内容: 在Java中将a转换boolean为an 的最常用方法是什么int? 问题答案: ^^ PS : true = 1 and false = 0
问题内容: s是“ E”,但我想要的是“ 123” 请告诉我如何获得“ 123”。 在Java中,我可以这样进行: 如何在Go中输入两个字符串? 问题答案: 使用包的功能。 例如: 您可以简单地通过添加字符串或使用包的功能来连接字符串。
我想将字符串转换为int。 例如: 如果是,则应将其转换为与相同的 为什么我需要这个。因为我要将unicode int转换为表情符号,所以我使用的是这段代码。 你能让我知道我该怎么做吗?