Всем привет! Реализую один небольшой проектик на Arduino, с управлением через Bluetooth из мобильного приложения на Java. Сначала написал его как шаблон в AppInventor'е . всё работало. Сейчас пытаюсь написать через Android Studio и встала загвоздка, сначала не мог отправлять команды поочереди, например 1, 2, 3..., с одной кнопки, это сделал, теперь проблема в том что команды не передаются вообще... ЧАсть кода честно взята с интернетов. Короче, беда... Помогите чем сможете, ПОЖАЛУЙСТА!!! Код (Java): package com.example.***.myapplication; import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.Toast; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity implements View.OnClickListener{ //Сокет, с помощью которого мы будем отправлять данные на Arduino BluetoothSocket clientSocket; //Эта функция запускается автоматически при запуске приложения @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Включаем bluetooth. Если он уже включен, то ничего не произойдет String enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE; startActivityForResult(new Intent(enableBT), 0); //Мы хотим использовать тот bluetooth-адаптер, который задается по умолчанию BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); //Пытаемся проделать эти действия try{ //Устройство с данным адресом - наш Bluetooth Bee //Адрес опредеяется следующим образом: установите соединение //между ПК и модулем (пин: 1234), а затем посмотрите в настройках //соединения адрес модуля. Скорее всего он будет аналогичным. BluetoothDevice device = bluetooth.getRemoteDevice("98:D3:31:FC:50:7A"); //Инициируем соединение с устройством Method m = device.getClass().getMethod( "createRfcommSocket", new Class[] {int.class}); clientSocket = (BluetoothSocket) m.invoke(device, 1); clientSocket.connect(); //В случае появления любых ошибок, выводим в лог сообщение } catch (IOException e) { Log.d("BLUETOOTH", e.getMessage()); } catch (SecurityException e) { Log.d("BLUETOOTH", e.getMessage()); } catch (NoSuchMethodException e) { Log.d("BLUETOOTH", e.getMessage()); } catch (IllegalArgumentException e) { Log.d("BLUETOOTH", e.getMessage()); } catch (IllegalAccessException e) { Log.d("BLUETOOTH", e.getMessage()); } catch (InvocationTargetException e) { Log.d("BLUETOOTH", e.getMessage()); } //Выводим сообщение об успешном подключении Toast.makeText(getApplicationContext(), "CONNECTED", Toast.LENGTH_LONG).show(); } public static class ExampleActivity extends AppCompatActivity { private Button myButton; private List<Command> commands = new ArrayList<>(); private int commandPos; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); myButton = (Button) findViewById(R.id.btn1); commands.add(() -> sendBluetoothCommand("Command 1")); commands.add(() -> sendBluetoothCommand("Command 2")); commands.add(() -> sendBluetoothCommand("Command 3")); myButton.setOnClickListener(v -> { if (commands.size() == 0) { return; } else if (commandPos <= commands.size()) { commandPos = 0; } commands.get(commandPos).execute(); commandPos++; }); } private void sendBluetoothCommand(String command) { System.out.println(command); } private interface Command { void execute(); } } }
Вот отправка по нажатия Код (Java): public void onButtonClick (View view) { EditText num = (EditText)findViewById(R.id.editText); int value = Integer.parseInt(num.getText().toString()); OutputStream outStream = null; try { outStream = clientSocket.getOutputStream(); Toast.makeText(getApplicationContext(), "Подключение успешно", Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); } try { if (outStream != null) { outStream.write(value); } Toast.makeText(getApplicationContext(), "Данные успешно переданы", Toast.LENGTH_LONG).show(); } catch (IOException e) { e.printStackTrace(); } } }
Тоже самое) Только в функцию по нажатию на кнопку добавить переменную изначально number = 0; По нажатию number++ И отправить number Неа?
Пример щас попробую. Кстати он клик листенер мне кажется не лучший способ. Удобнее привязать любую функцию к кнопке. В графическом редакторе у кнопки есть свойство он клик
В начале где-то добавляете глобальную переменную click = 0; А по нажатию на кнопку оно будет отправлять Код (Java): public void onButtonClick (View view) { click++; outStream = null; try { outStream = clientSocket.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } try { if (outStream != null) { outStream.write(click); } } catch (IOException e) { e.printStackTrace(); } } }
С Вашего позволения попробовал ваш код, из вашего топика, короче вот лог ошибок, которые я не могу понять Код (C++): 01-20 21:41:00.426 3727-3727/com.example.shkolkins.a1111 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.shkolkins.a1111, PID: 3727 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.shkolkins.a1111/com.example.shkolkins.a1111.MainActivity}: java.lang.IllegalArgumentException: null is not a valid Bluetooth address at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3160) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275) at android.app.ActivityThread.access$1000(ActivityThread.java:218) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:7007) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) Caused by: java.lang.IllegalArgumentException: null is not a valid Bluetooth address at android.bluetooth.BluetoothDevice.<init>(BluetoothDevice.java:861) at android.bluetooth.BluetoothAdapter.getRemoteDevice(BluetoothAdapter.java:618) at com.example.shkolkins.a1111.MainActivity.onCreate(MainActivity.java:49) at android.app.Activity.performCreate(Activity.java:6609) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3113) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3275) at android.app.ActivityThread.access$1000(ActivityThread.java:218) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1744) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:7007) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)
Код (Java): 1-20 22:57:45.953 8010-8010/com.example.shkolkins.myapplication E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.shkolkins.myapplication, PID: 8010 java.lang.IllegalStateException: Could not find a method onClickBut1(View) in the activity class com.example.shkolkins.myapplication.MainActivity for onClick handler on view class android.widget.Button with id 'btn1' at android.view.View$1.onClick(View.java:4277) at android.view.View.performClick(View.java:5246) at android.widget.TextView.performClick(TextView.java:10620) at android.view.View$PerformClick.run(View.java:21256) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:7007) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) Caused by: java.lang.NoSuchMethodException: onClickBut1 [class android.view.View] at java.lang.Class.getMethod(Class.java:671) at android.view.View$1.onClick(View.java:4270) at android.view.View.performClick(View.java:5246) at android.widget.TextView.performClick(TextView.java:10620) at android.view.View$PerformClick.run(View.java:21256) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:145) at android.app.ActivityThread.main(ActivityThread.java:7007) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199) 01-20 22:57:46.003 752-8074/? E/android.os.Debug: ro.product_ship = true 01-20 22:57:46.003 752-8074/? E/android.os.Debug: ro.debug_level = 0x4f4c 01-20 22:57:46.053 172-172/? E/BufferQueueCore: [Application Error: com.example.shkolkins.myapplication] setDefaultMaxBufferCount: setting count to 3, previous is 2 01-20 22:57:46.544 172-172/? E/BufferQueueCore: [com.sec.android.app.launcher/com.android.launcher2.Launcher] setDefaultMaxBufferCount: setting count to 3, previous is 2 01-20 22:57:50.728 752-1082/? E/Watchdog: !@Sync 1945 [01-20 22:57:50.735] Ошибки ещё раз и сам код Код (Java): import android.app.Activity; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Toast; import java.io.IOException; import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class MainActivity extends Activity implements View.OnClickListener { //Сокет, с помощью которого мы будем отправлять данные на Arduino BluetoothSocket clientSocket; private OutputStream outStream; //Эта функция запускается автоматически при запуске приложения @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //Включаем bluetooth. Если он уже включен, то ничего не произойдет String enableBT = BluetoothAdapter.ACTION_REQUEST_ENABLE; startActivityForResult(new Intent(enableBT), 0); //Мы хотим использовать тот bluetooth-адаптер, который задается по умолчанию BluetoothAdapter bluetooth = BluetoothAdapter.getDefaultAdapter(); //Пытаемся проделать эти действия try { //Устройство с данным адресом - наш Bluetooth Bee //Адрес опредеяется следующим образом: установите соединение //между ПК и модулем (пин: 1234), а затем посмотрите в настройках //соединения адрес модуля. Скорее всего он будет аналогичным. BluetoothDevice device = bluetooth.getRemoteDevice("98:D3:31:FC:50:7A"); //Инициируем соединение с устройством Method m = device.getClass().getMethod( "createRfcommSocket", new Class[]{int.class}); clientSocket = (BluetoothSocket) m.invoke(device, 1); clientSocket.connect(); //В случае появления любых ошибок, выводим в лог сообщение } catch (IOException e) { Log.d("BLUETOOTH", e.getMessage()); } catch (SecurityException e) { Log.d("BLUETOOTH", e.getMessage()); } catch (NoSuchMethodException e) { Log.d("BLUETOOTH", e.getMessage()); } catch (IllegalArgumentException e) { Log.d("BLUETOOTH", e.getMessage()); } catch (IllegalAccessException e) { Log.d("BLUETOOTH", e.getMessage()); } catch (InvocationTargetException e) { Log.d("BLUETOOTH", e.getMessage()); } //Выводим сообщение об успешном подключении Toast.makeText(getApplicationContext(), "CONNECTED", Toast.LENGTH_LONG).show(); } @Override public void onClick(View view) { int click = 0; click++; outStream = null; try { outStream = clientSocket.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } try { if (outStream != null) { outStream.write(click); } } catch (IOException e) { e.printStackTrace(); } } }