Faisal_Abdullah Ответов: 0

Как получить данные с клавиатуры 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 нажата или любая другая.

0 Ответов