Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/15: Рейтинг темы: голосов - 15, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 50

Отправка данных по bluetooth

04.10.2022, 10:48. Показов 4019. Ответов 29

Студворк — интернет-сервис помощи студентам
Разрабатываю проект по примеру:
https://maxfad.ru/programmer/a... ast-1.html

Мейн выглядит так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
package com.example.mashinetest;
 
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothSocket;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CompoundButton;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.Toast;
 
import androidx.appcompat.app.AppCompatActivity;
 
import com.google.android.material.slider.RangeSlider;
 
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Set;
import java.util.UUID;
 
import static android.R.layout.simple_list_item_1;
 
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
 
    private static final int REQUEST_ENABLE_BT = 1;
    Button btnActTwo, del_x1_up, del_x1_down, el_up_plus, el_up_minus, del_x0_up, del_x0_down, el_down_plus, el_down_minus, x1_plus, x1_minus, pause_play, x0_plus, x0_minus, stoping;
    EditText editTextTextPersonName4, editTextTextPersonName3, editTextTextPersonName, editTextTextPersonName2;
    RangeSlider slider;
    SeekBar seekBar, seekBar2;
    public TextView textinfo;
    BluetoothAdapter bluetoothAdapter;
    FrameLayout ButPanel;
    ArrayList<String> pairedDeviceArrayList;
    ListView listViewPairedDevice;
    ArrayAdapter<String> pairedDeviceAdapter;
    ThreadConnectBTdevice myThreadConnectBTdevice;
    ThreadConnected myThreadConnected;
    private UUID myUUID;
    private StringBuilder sb = new StringBuilder();
 
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//Инициализация кнопки перехода
        btnActTwo = (Button) findViewById(R.id.btnActTwo);
 
        btnActTwo.setOnClickListener(this);
//Инициализация кнопок управления
        del_x1_up = (Button) findViewById(R.id.button28);
        del_x1_down = (Button) findViewById(R.id.button26);
        el_up_plus = (Button) findViewById(R.id.button24);
        el_up_minus = (Button) findViewById(R.id.button25);
        del_x0_up = (Button) findViewById(R.id.button22);
        del_x0_down = (Button) findViewById(R.id.button23);
        el_down_plus = (Button) findViewById(R.id.button20);
        el_down_minus = (Button) findViewById(R.id.button21);
        x1_plus = (Button) findViewById(R.id.button5);
        x1_minus = (Button) findViewById(R.id.button6);
        pause_play = (Button) findViewById(R.id.button);
        x0_plus = (Button) findViewById(R.id.button3);
        x0_minus = (Button) findViewById(R.id.button4);
        stoping = (Button) findViewById(R.id.button17);
 
        del_x1_up.setOnClickListener(this);
        del_x1_down.setOnClickListener(this);
        el_up_plus.setOnClickListener(this);
        el_up_minus.setOnClickListener(this);
        del_x0_up.setOnClickListener(this);
        del_x0_down.setOnClickListener(this);
        el_down_plus.setOnClickListener(this);
        el_down_minus.setOnClickListener(this);
        x1_plus.setOnClickListener(this);
        x1_minus.setOnClickListener(this);
        pause_play.setOnClickListener(this);
        x0_plus.setOnClickListener(this);
        x0_minus.setOnClickListener(this);
        stoping.setOnClickListener(this);
 
        final String UUID_STRING_WELL_KNOWN_SPP = "00001101-0000-1000-8000-00805F9B34FB";
        textinfo = (TextView)findViewById(R.id.textinfo);
        listViewPairedDevice = (ListView)findViewById(R.id.list);
        ButPanel = (FrameLayout) findViewById(R.id.panel);
        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)){
            Toast.makeText(this, "BLUETOOTH NOT support", Toast.LENGTH_LONG).show();
            finish();
            return;
        }
        myUUID = UUID.fromString(UUID_STRING_WELL_KNOWN_SPP);
        bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
        if (bluetoothAdapter == null) {
            Toast.makeText(this, "Bluetooth is not supported on this hardware platform", Toast.LENGTH_LONG).show();
            finish();
            return;
        }
        String stInfo = bluetoothAdapter.getName() + " " + bluetoothAdapter.getAddress();
        textinfo.setText(String.format("Это устройство: %s", stInfo));
    }
 
    @Override
    protected void onStart() { // Запрос на включение Bluetooth
        super.onStart();
        if (!bluetoothAdapter.isEnabled()) {
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
        }
        setup();
    }
 
    private void setup() { // Создание списка сопряжённых Bluetooth-устройств
        Set< BluetoothDevice> pairedDevices = bluetoothAdapter.getBondedDevices();
        if (pairedDevices.size() > 0) { // Если есть сопряжённые устройства
            pairedDeviceArrayList = new ArrayList<>();
            for (BluetoothDevice device : pairedDevices) { // Добавляем сопряжённые устройства - Имя + MAC-адресс
                pairedDeviceArrayList.add(device.getName() + "\n" + device.getAddress());
            }
            pairedDeviceAdapter = new ArrayAdapter<>(this, simple_list_item_1, pairedDeviceArrayList);
            listViewPairedDevice.setAdapter(pairedDeviceAdapter);
            listViewPairedDevice.setOnItemClickListener(new AdapterView.OnItemClickListener() { // Клик по нужному устройству
 
                @Override
                public void onItemClick(AdapterView< ?> parent, View view, int position, long id) { //тут пробел после скобки !!!!
                    listViewPairedDevice.setVisibility(View.GONE); // После клика скрываем список
                    String  itemValue = (String) listViewPairedDevice.getItemAtPosition(position);
                    String MAC = itemValue.substring(itemValue.length() - 17); // Вычленяем MAC-адрес
                    BluetoothDevice device2 = bluetoothAdapter.getRemoteDevice(MAC);
                    myThreadConnectBTdevice = new ThreadConnectBTdevice(device2);
                    myThreadConnectBTdevice.start();  // Запускаем поток для подключения Bluetooth
                }
            });
        }
    }
 
 
    @Override
    protected void onDestroy() { // Закрытие приложения
        super.onDestroy();
        if(myThreadConnectBTdevice!=null) myThreadConnectBTdevice.cancel();
    }
 
 
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_ENABLE_BT) { // Если разрешили включить Bluetooth, тогда void setup()
            if (resultCode == Activity.RESULT_OK) {
                setup();
            } else { // Если не разрешили, тогда закрываем приложение
                Toast.makeText(this, "BlueTooth не включён", Toast.LENGTH_SHORT).show();
                finish();
            }
        }
    }
 
    private class ThreadConnectBTdevice extends Thread { // Поток для коннекта с Bluetooth
        private BluetoothSocket bluetoothSocket = null;
        private ThreadConnectBTdevice(BluetoothDevice device) {
            try {
                bluetoothSocket = device.createRfcommSocketToServiceRecord(myUUID);
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
 
 
        @Override
        public void run() { // Коннект
            boolean success = false;
            try {
                bluetoothSocket.connect();
                success = true;
            }
            catch (IOException e) {
                e.printStackTrace();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "Нет коннекта, проверьте Bluetooth-устройство с которым хотите соединица!", Toast.LENGTH_LONG).show();
                        listViewPairedDevice.setVisibility(View.VISIBLE);
                    }
                });
                try {
                    bluetoothSocket.close();
                }
                catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            if(success) {  // Если законнектились, тогда открываем панель с кнопками и запускаем поток приёма и отправки данных
                runOnUiThread(new Runnable() {
 
                    @Override
                    public void run() {
                        ButPanel.setVisibility(View.VISIBLE); // открываем панель с кнопками
                    }
                });
 
                myThreadConnected = new ThreadConnected(bluetoothSocket);
                myThreadConnected.start(); // запуск потока приёма и отправки данных
            }
        }
 
        public void cancel() {
            Toast.makeText(getApplicationContext(), "Close - BluetoothSocket", Toast.LENGTH_LONG).show();
            try {
                bluetoothSocket.close();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
 
    } // END ThreadConnectBTdevice:
 
 
    private class ThreadConnected extends Thread {    // Поток - приём и отправка данных
        private final InputStream connectedInputStream;
        private final OutputStream connectedOutputStream;
        private String sbprint;
 
        public ThreadConnected(BluetoothSocket socket) {
            InputStream in = null;
            OutputStream out = null;
            try {
                in = socket.getInputStream();
                out = socket.getOutputStream();
            } catch (IOException e) {
                e.printStackTrace();
            }
            connectedInputStream = in;
            connectedOutputStream = out;
        }
 
    @Override
    public void run() { // Приём данных
        while (true) {
            try {
                byte[] buffer = new byte[1];
                int bytes = connectedInputStream.read(buffer);
                String strIncom = new String(buffer, 0, bytes);
                sb.append(strIncom); // собираем символы в строку
                int endOfLineIndex = sb.indexOf("\r\n"); // определяем конец строки
                if (endOfLineIndex > 0) {
                    sbprint = sb.substring(0, endOfLineIndex);
                    sb.delete(0, sb.length());
                    runOnUiThread(new Runnable() { // Вывод данных
 
                        @Override
                        public void run() {
                            switch (sbprint) {
 
                                case "D10 ON":
                                    Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();
                                    break;
 
                                case "D10 OFF":
                                    Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();
                                    break;
 
                                case "D11 ON":
                                    Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();
                                    break;
 
                                case "D11 OFF":
                                    Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();
                                    break;
 
                                case "D12 ON":
                                    Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();
                                    break;
 
                                case "D12 OFF":
                                    Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();
                                    break;
 
                                case "D13 ON":
                                    Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();
                                    break;
 
                                case "D13 OFF":
                                    Toast.makeText(MainActivity.this, sbprint, Toast.LENGTH_SHORT).show();
                                    break;
 
                                default:
                                    break;
                            }
                        }
                    });
                }
            } catch (IOException e) {
                break;
            }
        }
    }
 
 
    public void write(byte[] buffer) {
        try {
            connectedOutputStream.write(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
}
 
    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
        switch (compoundButton.getId()) {
            case R.id.toggleButton1:
                if(isChecked){
                    if(myThreadConnected!=null) {
                        byte[] bytesToSend = "a".getBytes();
                        myThreadConnected.write(bytesToSend );
                    }
                    Toast.makeText(MainActivity.this, "D10 ON", Toast.LENGTH_SHORT).show();
                }else{
                    if(myThreadConnected!=null) {
                        byte[] bytesToSend = "A".getBytes();
                        myThreadConnected.write(bytesToSend );
                    }
                    Toast.makeText(MainActivity.this, "D10 OFF", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.toggleButton2:
                if(isChecked){
                    if(myThreadConnected!=null) {
 
                        byte[] bytesToSend = "b".getBytes();
                        myThreadConnected.write(bytesToSend );
                    }
 
                    Toast.makeText(MainActivity.this, "D11 ON", Toast.LENGTH_SHORT).show();
                }else{
                    if(myThreadConnected!=null) {
 
                        byte[] bytesToSend = "B".getBytes();
                        myThreadConnected.write(bytesToSend );
                    }
 
                    Toast.makeText(MainActivity.this, "D11 OFF", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.toggleButton3:
                if(isChecked){
                    if(myThreadConnected!=null) {
 
                        byte[] bytesToSend = "c".getBytes();
                        myThreadConnected.write(bytesToSend );
                    }
 
                    Toast.makeText(MainActivity.this, "D12 ON", Toast.LENGTH_SHORT).show();
                }else{
                    if(myThreadConnected!=null) {
 
                        byte[] bytesToSend = "C".getBytes();
                        myThreadConnected.write(bytesToSend );
                    }
 
                    Toast.makeText(MainActivity.this, "D12 OFF", Toast.LENGTH_SHORT).show();
                }
                break;
            case R.id.toggleButton4:
                if(isChecked){
                    if(myThreadConnected!=null) {
 
                        byte[] bytesToSend = "d".getBytes();
                        myThreadConnected.write(bytesToSend );
                    }
 
                    Toast.makeText(MainActivity.this, "D13 ON", Toast.LENGTH_SHORT).show();
                }else{
                    if(myThreadConnected!=null) {
 
                        byte[] bytesToSend = "D".getBytes();
                        myThreadConnected.write(bytesToSend );
                    }
 
                    Toast.makeText(MainActivity.this, "D13 OFF", Toast.LENGTH_SHORT).show();
                }
                break;
        }
    }
 
        @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.btnActTwo:
                Intent intent = new Intent(this, Stoyka.class);
                startActivity(intent);
                break;
            default:
                break;
        }
    }
}
Манифест такой:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
<uses-permission android:name="android.permission.ACCEPT_HANDOVER"/>
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Mashinetest"
        tools:targetApi="31">
        <activity
            android:name=".Stoyka"
            android:exported="false">
            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
 
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
 
            <meta-data
                android:name="android.app.lib_name"
                android:value="" />
        </activity>
    </application>
 
</manifest>
Ошибки Мейн такие:
Code
1
Call requires permission which may be rejected by user: code should explicitly check to see if permission is available (with `checkPermission`) or explicitly handle a potential `SecurityException`
Такая ошибка на строки: 109,118,124,128,172,184.

В манифесте вроде все прописал. Не знаю в чем дело.
Вложения
Тип файла: zip mashinetest.zip (112.0 Кб, 3 просмотров)
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.10.2022, 10:48
Ответы с готовыми решениями:

Пример кода отправка и прием данных по bluetooth в сервисе, в фоне
Есть задача соединение по bluetooth в сервисе, прием и передача данных. В интернете есть примеры реализации соединения по bluetooth, но они...

Вычисление байта по цифрам hex(bin) из поля ввода и отправка его по bluetooth в MIT App Inventor
Можно ли (вместо кодов цифр) преобразовать в байт данные, введенные по цифрам по цифрам hex(bin) из поля ввода и отправить его по...

Отправка команды по bluetooth
Здравствуйте! В андроид студио хочу написать небольшую програмку, которая бы отправляла команду по блютуз Сейчас у меня здесь...

29
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 50
10.10.2022, 17:37  [ТС]
Студворк — интернет-сервис помощи студентам
С этим разобрался. Все работает. Спасибо. Теперь интересно узнать как мне управлять Rangeslider при помощи кнопок.
Т.к. имеется 2 ползунка, не совсем понятно как регулировать эти два параметра.

Добавлено через 3 минуты
Я создал arrays.xml в value. Но не могу понять как добавить не фиксированные цифры, а переменный, управляемые через MainActivity.
XML
1
2
3
4
5
6
<resources>
  <array name="initial_slider_values">
    <item>20.0</item>
    <item>70.0</item>
  </array>
</resources>
Добавлено через 2 часа 55 минут
Вот интересно, каким образом можно работать с этой функией.
0
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 50
12.10.2022, 14:14  [ТС]
Эту проблему я так и не решил и вылез какой то глюк. У меня в файле Thread.java выходят ошибки типа:
Cannot resolve symbol 'EmptyArray'

Добавлено через 31 минуту
В этом файле в общей сложности 36 ошибок.
В частности ругается на импорт библиотек:
Java
1
2
3
4
5
6
import dalvik.annotation.optimization.FastNative;
import sun.nio.ch.Interruptible;
import sun.reflect.CallerSensitive;
import dalvik.system.VMStack;
import libcore.util.EmptyArray;
import jdk.internal.HotSpotIntrinsicCandidate;
Добавлено через 6 минут
Thread.java у меня располагается по пути: C:\Users\Jonik\AppData\Local\Android\Sdk \sources\android-33\java\lang\Thread.java
0
93 / 66 / 27
Регистрация: 23.06.2019
Сообщений: 483
13.10.2022, 05:22
Лучший ответ Сообщение было отмечено Mestniy24 как решение

Решение

Цитата Сообщение от Mestniy24 Посмотреть сообщение
как добавить не фиксированные цифры, а переменный, управляемые через MainActivity
Куда добавить "не фиксированные цифры"?
Что значит "не фиксированные цифры"?
Что значит "управляемый через MainActivity"?

Ползунки ездят. И тапая экран меняется положение. И программно меняется. Ничего фиксированного нет.

Добавлено через 13 минут
Цитата Сообщение от Mestniy24 Посмотреть сообщение
В этом файле в общей сложности 36 ошибок.
Я не вижу на гитхабе этих строчек с импортом.

Добавлено через 58 минут
В слайдере есть листенеры. В частости листенер, который отслеживает изменения.
Java
1
2
3
4
5
 slider=findViewById(R.id.slider);
        slider.addOnChangeListener((slider, value, fromUser) -> {
            ((TextView) findViewById(R.id.textView)).setText(getResources()
                    .getString(R.string.x0_x1f,slider.getValues().get(0) ,slider.getValues().get(1)));
        });
XML
1
    <string name="x0_x1f">Диапазон штока X0-X1 %.0f-%.0f</string>
И можно устанавливать положение ползунков

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
        
        } else if (id == R.id.button4) {
            List<Float> floatList = slider.getValues();
            if(floatList.get(0)!=0f){
                floatList.set(0,floatList.get(0)-10f);
                slider.setValues(floatList);
            }
        } else if (id == R.id.button3) {
            List<Float> floatList = slider.getValues();
            if (floatList.get(0) != 100f) {
                floatList.set(0, floatList.get(0) + 10f);
                slider.setValues(floatList);
            }
        }else if (id == R.id.button6) {
            List<Float> floatList = slider.getValues();
            if(floatList.get(1)!=0f){
                floatList.set(1,floatList.get(1)-10f);
                slider.setValues(floatList);
            }
        } else if (id == R.id.button5) {
            List<Float> floatList = slider.getValues();
            if (floatList.get(1) != 100f) {
                floatList.set(1, floatList.get(1) + 10f);
                slider.setValues(floatList);
            }
        }
Я там сделал pull request. Может что-то подойдет из него.

Добавлено через 2 минуты
Но это ужасные id вьюшек. Приходится смотреть раскладку постоянно, что там уменьшает, что там увеличивает.
Ну и сама раскладка. Вьюшки ж друг от друга позиционироваться должны, а не все от края экрана.

Добавлено через 6 минут
Кстати, зачем EditText и setKeyListener(null) этим ЕдитТекстам делать? Почему нельзя просто TextView использовать и не будет запускаться клавиатура.

Добавлено через 7 минут
И что там с поворотом экрана?
Во-первых ничего не влезает вертикально в горизонтальном положении.
Во-вторых. При повороте экрана (configuration change) пересоздается Активити и все изменения переменных пропадают.
И тут на сцену входит ViewModel. Которая не пересоздается при смене конфигурации (повороте экрана).
В общем, все надо делать по-другому.

Или сохранять в onSaveInstanceState. Но мне так кажется, там слишком много всего сохранять и можно запутаться.
Проще отдельный класс. ViewModel сделать. И в нем все переменные держать.
1
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 50
13.10.2022, 22:41  [ТС]
Спасибо огромное. Видимо что то я натыкал. Изменил код по вашим примерам - все заработало.
В итоге осталось организовать отправку по блт - буду копать в эту сторону. Спасибо, еще раз.
0
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 50
15.10.2022, 17:21  [ТС]
Ну вот и снова я. Решил добавить пару элементов(Slider). Их индикация работает, но не могу понять как сделать обработку.
Делаю так:
Java
1
2
3
4
   slider3.addOnChangeListener((slider3, value, fromUser)->{
            slider3.setEnabled(false);
            myHandler.postDelayed(pause, 1000);
        });
И при компиляции приложение даже не запускается, и выдает ошибки, ссылаясь на addOnChangeListener по отношению к slider.
Я так понимаю что то не так я сделал в самом обработчике выше.

Обновленный проект тут
Ошибка при открытии:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mashinetest/com.example.mashinetest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View com.google.android.material.slider.Slider.findViewById(int)' on a null object reference
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3539)
 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3699)
 at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
 at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
 at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2135)
 at android.os.Handler.dispatchMessage(Handler.java:106)
 at android.os.Looper.loop(Looper.java:236)
 at android.app.ActivityThread.main(ActivityThread.java:8037)
 at java.lang.reflect.Method.invoke(Native Method)
 at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:656)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:967)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View com.google.android.material.slider.Slider.findViewById(int)' on a null object reference
 at com.example.mashinetest.MainActivity.onCreate(MainActivity.java:77)
 at android.app.Activity.performCreate(Activity.java:8157)
 at android.app.Activity.performCreate(Activity.java:8129)
 at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1310)
 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3512)
 ... 11 more
0
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 50
17.10.2022, 18:09  [ТС]
Разобрался с ошибкой - честно так и не понял что там было..
Но так и не разобрался с обработчиком Slider.

Добавлено через 4 часа 9 минут
Добавляю в onCraete:
Java
1
2
3
4
5
6
7
        slider.addOnSliderTouchListener(object : Slider.OnSliderTouchListener {
            override fun onStartTrackingTouch(slider: Slider) {
            }
 
            override fun onStopTrackingTouch(slider: Slider) {
            }
        });
Ругается на override fun и на object

Добавлено через 4 часа 5 минут
И с этой проблемой тоже разобрался.
У меня появился вопрос по seekbar. У меня их 2. Я хочу при отпускании бегунка на каждом из них отдельно отправлять его показания. Но пока имею только эту функцию:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    private final SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        }
 
        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {
 
        }
 
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            seekBar1.setEnabled(false);
            seekBar2.setEnabled(false);
            myHandler.postDelayed(pause, 1000);
 
        }
    };
...которая ищет обработку данных на всех seekbar
0
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 50
06.11.2022, 17:19  [ТС]
Здравствуйте. Проект хорошо работает! Теперь появилась сложность в том что на версиях до 12 все работает. Но на версиях выше 12 выводится сообщение:
Code
1
Need android.permission.BLUETOOTH_CONNECT permission for android.content.AttributionSource@9d28cecf: getName
0
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 50
08.11.2022, 13:48  [ТС]
Добавил в манифест:
Java
1
2
3
4
5
<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
Когда перед функциями вызова BLT пишу:
Java
1
2
3
4
5
6
7
8
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.BLUETOOTH_CONNECT) == PackageManager.PERMISSION_DENIED)
                {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
                    {
                        ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.BLUETOOTH_CONNECT}, 2);
                        return;
                    }
                }
Но у меня ругается программа на все что только угодно. Не знаю как решить эту проблему.
0
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 50
11.11.2022, 18:31  [ТС]
Кто сталкивался с этой проблемой? Подскажете куда копать?
0
0 / 0 / 0
Регистрация: 13.08.2019
Сообщений: 50
21.11.2022, 12:15  [ТС]
Друзья, подскажите - весь мозг уже себе сломал=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.11.2022, 12:15

Qt Bluetooth, ошибка qt.bluetooth: Dummy backend running. Qt Bluetooth module is non-functional
Начал разбираться с Qt и Bluetooth, для этого запустил пример http://doc.qt.io/qt-5/qtbluetooth-btscanner-example.html. Скомпилил, все...

Отправка данных в форму и отправка формы
Я пишу бота на python, который будет заказывать такси. Я столкнулся со следующей проблемой, каким образом я могу заполнить данные формы и...

Обработка данных по Bluetooth
Всем привет, столкнулся с проблемой обработки данных на Android. Я отправляю строку данных, разделенную специальным символом&quot;, &quot;...

Передача данных по Bluetooth
Имеется приложение, написанное на JAVA оно отправляется по Bluetooth какие-то данные на плату, плата запрограммирована на BASIC. Отправляю...

Приём данных по Bluetooth
Из Arduino посылается строка xx|xx|xx|xx|xx,xxxx|\n, где х-любое число. На андроиде получаю: х| x| x| x| итд. Подскажи как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru