Как получить данные с клавиатуры bluetooth с помощью xamarin andriod C#
Здравствуйте, мой друг с прошлой недели, я изо всех сил стараюсь сделать эту работу, я сделал много вещей, но в конце концов я получаю ошибку, мне нужно ваше внимание, чтобы решить ее для меня, пожалуйста.
моя ошибка, которую я получаю, когда запускаю ее на своем компьютере:
Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
в строке с номером 92: bluetoothManager.в CS
и если я использую свое настоящее android-устройство, приложение вылетает
Пожалуйста, помогите мне, как я могу получить данные в виде уведомления о нажатии клавиши с клавиатуры bluetooth с помощью моего приложения для android
Что я уже пробовал:
Это мое main.xml исходный код
<pre><?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:text="Visible Bluetooth Devices" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/title" /> <Button android:text="Turn On Bluetooth" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/trunOn" /> <Button android:text="Turn Off BlueTooth" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/turnOff" /> <Button android:text="Show Paired Devices" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/pairedDevices" /> <ListView android:minWidth="25px" android:minHeight="25px" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/showDevices" /> <TextView android:text="Yet! No Any Key Pressed" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/keyPressedTextShow" /> </LinearLayout>
Это мой исходный код mainActivity.cs
using Android.App; using Android.Widget; using Android.OS; using Android.Bluetooth; using Android.Views; using Android.Content; using System.Collections; using System; using Java.Lang; namespace FiverrBluetoothProject { [Activity(Label = "FiverrBluetoothProject", MainLauncher = true)] public class MainActivity : Activity, Android.Views.View.IOnClickListener { //These are button variables which i used for the GUI Button trunOn, turnOff, pairedDevices, keyPressed; //This is the list, which we will use to contain list of devices either paired or not ListView showDevices; //This is the TextView, which will show if any key pressed from the paired bluetooth device TextView keyPressedTextShow; //This is the adapter of the bluetooth class adapter BluetoothAdapter bluetooth; //Store data if any keyboard or device sent data private string data = null; BluetoothManager manager = new BluetoothManager(); ArrayList listNearBy = new ArrayList(); protected override void OnCreate(Bundle savedInstanceState) { base.OnCreate(savedInstanceState); // Set our view from the "main" layout resource SetContentView(Resource.Layout.Main); //It's the function which will initialize all the delared Button, ListView and TextView variables once the device is start initialize(); //The adapter is initialized once the app activity is started bluetooth = BluetoothAdapter.DefaultAdapter; try { BluetoothManager manager = new BluetoothManager(); manager.getAllPairedDevices(); System.Threading.Thread thread = new System.Threading.Thread(() => { while (true) { data = manager.getDataFromDevice(); if (data != null) { keyPressedTextShow.Text = data; } else { keyPressedTextShow.Text = "Sorry! No any key detected"; } } }); thread.IsBackground = true; thread.Start(); } catch (InvalidOperationException e) { Toast.MakeText(this, e.Message, ToastLength.Long).Show(); } catch (ArrayIndexOutOfBoundsException e) { Toast.MakeText(this, e.Message, ToastLength.Long).Show(); } } public void initialize() { //Here all variabls are now initialized once the OnCreate functions is called during the startActivity trunOn = (Button)FindViewById(Resource.Id.trunOn); turnOff = (Button)FindViewById(Resource.Id.turnOff); pairedDevices = (Button)FindViewById(Resource.Id.pairedDevices); showDevices = (ListView)FindViewById(Resource.Id.showDevices); keyPressedTextShow = (TextView)FindViewById(Resource.Id.keyPressedTextShow); //These are the functions call with This keyword to get the User functions trunOn.SetOnClickListener(this); turnOff.SetOnClickListener(this); pairedDevices.SetOnClickListener(this); // keyPressed.SetOnClickListener(this); showDevices.ItemClick += showDevices_DeviceConnect; } public void showDevices_DeviceConnect(object sender, AdapterView.ItemClickEventArgs e) { BluetoothDevice device = (BluetoothDevice)listNearBy[e.Position]; manager.openDeviceConnection(device); } public void OnClick(View v) { switch (v.Id) { case Resource.Id.trunOn: if (!bluetooth.Enable()) { Intent o = new Intent(BluetoothAdapter.ActionRequestEnable); StartActivityForResult(o, 0); } Toast.MakeText(this, "Your Mobile BlueTooth is Enabled", ToastLength.Short).Show(); break; case Resource.Id.turnOff: if (bluetooth.Enable()) { bluetooth.Disable(); Toast.MakeText(this, "Your Mobile BlueTooth is Disabled", ToastLength.Short).Show(); } break; case Resource.Id.pairedDevices: ArrayList list = new ArrayList(); foreach (BluetoothDevice bt in bluetooth.BondedDevices) { list.Add(bt.Name); } ArrayAdapter adapter = new ArrayAdapter(this, Android.Resource.Layout.SimpleListItem1, list); showDevices.SetAdapter(adapter); break; } } } }
Это мой исходный код bluetoothManager.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Android.App; using Android.Bluetooth; using Android.Content; using Android.OS; using Android.Runtime; using Android.Views; using Android.Widget; using Java.IO; using Java.Util; namespace FiverrBluetoothProject { class BluetoothManager { //unique ID which helps us connec to to any device private const string UuidUniverseProfile = "00001101-0000-1000-8000-00805F9B34FB"; //represent bluetooth data coming from UART // private BluetoothDevice result; //get input/output stream of this communication private Android.Bluetooth.BluetoothSocket mSocket; //convert byte[] to readable strings private BufferedReader reader; private System.IO.Stream mStream; private InputStreamReader mReader; public BluetoothManager() { reader = null; } private UUID getUUIDFromString() { return UUID.FromString(UuidUniverseProfile); } private void close(IDisposable aConnectedObject) { if (aConnectedObject == null) return; try { aConnectedObject.Dispose(); } catch (Exception) { throw; } aConnectedObject = null; } public void openDeviceConnection(BluetoothDevice btDevice) { try { //getting socket from specific device mSocket = btDevice.CreateRfcommSocketToServiceRecord(getUUIDFromString()); //blocking operation, please note mSocket.Connect(); //input stream mStream = mSocket.InputStream; //output stream //mSocket.OutputStream; mReader = new InputStreamReader(mStream); reader = new BufferedReader(mReader); } catch (IOException e) { //close all close(mSocket); //ruft die Funktion close auf und schließt die Verbindung close(mStream); close(mReader); throw e; } } public String getDataFromDevice() { return reader.ReadLine(); } public void getAllPairedDevices() { //your android phone bluetooth device BluetoothAdapter bluetooth = BluetoothAdapter.DefaultAdapter; if (bluetooth.IsEnabled) { var devices = bluetooth.BondedDevices; if (devices != null && devices.Count > 0) { //search threw all paired devices foreach (BluetoothDevice mDevice in devices) { //mDevice.Name.Split(' '); openDeviceConnection(mDevice); } } } } } }
Kornfeld Eliyahu Peter
Клавиатура Bluetooth-это просто клавиатура, почему вы должны ходить по кругу, а не позволять ОС говорить...
Faisal_Abdullah
я знаю, но я хочу сделать это с помощью своего приложения ... но как?
проблема или вопрос заключается в приложении: оно должно показывать все устройства bluetooth, а затем подключаться к одному из них. если подключенное устройство является клавиатурой bluetooth и любая клавиша нажата с этого устройства, то приложение должно показать это в текстовом поле, сказав ie. Клавиша X нажата или любая другая.