Προς το περιεχόμενο

Android Studio και Bluetooth Connection


poofklats

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα σε όλους,

Εδώ και 2 μέρες παλεύω να βρω συσκευές paired ή και όχι, μέσω μιας dummy εφαρμογής δίχως αποτέλεσμα. Πιο συγκεκριμένα έχω τρέξει ότι σχετικό κώδικα μπόρεσα να βρω και έχω βάλει όλα τα permissions που θεωριτικά χρειάζεται η εφαρμογή για να δουλέψει 

<uses-permission android:name="android.permission.BLUETOOTH" />
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>

Κι ενώ το bluetooth των κινητών που δοκίμασα την εφαρμογή δουλεύουν απροβλημάτιστα, η εφαρμογή μου δίνει 0 συσκευές στα .getBondedDevices  και .startDiscovery.

Παρακάτω ο κώδικας που χρησιμοποιώ:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:padding="16dp"
    tools:context=".MainActivity">

    <CheckBox
        android:id="@+id/enable"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Enable bt!"
        android:textStyle="bold"
        android:layout_centerHorizontal="true"/>

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listview"
        android:layout_below="@id/enable"
        />
</RelativeLayout>
package com.example.myapplication;

import android.Manifest;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Set;

public class MainActivity extends AppCompatActivity {

    CheckBox enable;
    ListView listView;

    BluetoothAdapter btAdapter;

    BroadcastReceiver broadcastReceiver;
    ArrayList<String> devices;
    ArrayAdapter arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        enable = (CheckBox) findViewById(R.id.enable);
        listView = (ListView) findViewById(R.id.listview);
        devices = new ArrayList<String>();
        btAdapter = BluetoothAdapter.getDefaultAdapter();

        if (btAdapter == null) {
            Toast.makeText(this, "Bluetooth not available", Toast.LENGTH_SHORT).show();
            finish();
        }

        if (btAdapter.isEnabled()) {
            enable.setChecked(true);
        }

        enable.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (!isChecked) {
                    btAdapter.disable();
                    Toast.makeText(MainActivity.this, "Turned off", Toast.LENGTH_SHORT).show();
                } else {

                    int MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION = 1;
                    ActivityCompat.requestPermissions(MainActivity.this,
                            new String[]{Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION},
                            MY_PERMISSIONS_REQUEST_ACCESS_COARSE_LOCATION);


                    Intent intentOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                    startActivityForResult(intentOn, 0);
                    Toast.makeText(MainActivity.this, "Turned On", Toast.LENGTH_SHORT).show();

                    Intent getVisible = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
                    startActivityForResult(getVisible, 0);
                    Toast.makeText(MainActivity.this, "Visibility On", Toast.LENGTH_SHORT).show();

                    btAdapter.startDiscovery();

                    broadcastReceiver = new BroadcastReceiver() {
                        @Override
                        public void onReceive(Context context, Intent intent) {
                            String action = intent.getAction();
                            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                                devices.add(device.getName());
                                arrayAdapter.notifyDataSetChanged();
                            }
                        }
                    };

                    IntentFilter intentFilter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                    registerReceiver(broadcastReceiver, intentFilter);

                    arrayAdapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, devices);
                    listView.setAdapter(arrayAdapter);
                }
            }
        });

    }
}

 

Έχετε καμία ιδέα; Σας έχει τύχει κάτι παρόμοιο;

Επεξ/σία από poofklats
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν έχω εγκατεστημένο το android studio για να το δοκιμάσω, ούτε έχω ασχοληθεί στο android με bluetooth, αλλά πιθανόν, έτσι όπως είδα τον κώδικά σου και ψάχνοντας στα γρήγορα:

Βάλε τις παρακάτω εντολές αμέσως μόλις ανοίγει η else (στην onCheckedChanged)

if(!btAdapter.isEnabled()) 
{  
  btAdapter.enable(); 
}

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στις 16/8/2019 στις 10:02 ΜΜ, marios28 είπε

Δεν έχω εγκατεστημένο το android studio για να το δοκιμάσω, ούτε έχω ασχοληθεί στο android με bluetooth, αλλά πιθανόν, έτσι όπως είδα τον κώδικά σου και ψάχνοντας στα γρήγορα:

Βάλε τις παρακάτω εντολές αμέσως μόλις ανοίγει η else (στην onCheckedChanged)


if(!btAdapter.isEnabled()) 
{  
  btAdapter.enable(); 
}
Intent intentOn = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                    startActivityForResult(intentOn, 0);

Αυτό το κομμάτι αναλαμβάνει να κάνει enable. 

Εν τέλει αφαιρόντας το enable (προϋποθέτει να είναι ήδη ανοιχτό το bluetooth),  ο κώδικας τρέχει κανονικά οπότε 'όλα καλά'.

Για όποιον τυχόν ενδιαφέρεται, υποθέτω ότι το όλο πρόβλημα προκύπτει από κάποια καθυστέρηση του bluetoothAdapter να συνδεθεί, οπότε και επιστρέφει null στις 2 λίστες (discovery και pairedDevices)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...