Autore Topic: Errore nel bluetooth  (Letto 547 volte)

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Errore nel bluetooth
« il: 12 Dicembre 2014, 11:18:30 CET »
0
Ciao a tutti, a volte quando lancio l'activity del bluetooth ricevo questo errore:

Codice: [Seleziona]
12-12 11:13:44.615: D/AndroidRuntime(8035): Shutting down VM
12-12 11:13:44.615: W/dalvikvm(8035): threadid=1: thread exiting with uncaught exception (group=0x4162ece0)
12-12 11:13:44.615: E/AndroidRuntime(8035): FATAL EXCEPTION: main
12-12 11:13:44.615: E/AndroidRuntime(8035): Process: com.thelikes.thegot2run, PID: 8035
12-12 11:13:44.615: E/AndroidRuntime(8035): java.lang.RuntimeException: Error receiving broadcast Intent { act=android.bluetooth.device.action.FOUND flg=0x10 (has extras) } in com.thelikes.thegot2run.Bluetooth$1@428a06c0
12-12 11:13:44.615: E/AndroidRuntime(8035):         at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:776)
12-12 11:13:44.615: E/AndroidRuntime(8035):         at android.os.Handler.handleCallback(Handler.java:733)
12-12 11:13:44.615: E/AndroidRuntime(8035):         at android.os.Handler.dispatchMessage(Handler.java:95)
12-12 11:13:44.615: E/AndroidRuntime(8035):         at android.os.Looper.loop(Looper.java:136)
12-12 11:13:44.615: E/AndroidRuntime(8035):         at android.app.ActivityThread.main(ActivityThread.java:5146)
12-12 11:13:44.615: E/AndroidRuntime(8035):         at java.lang.reflect.Method.invokeNative(Native Method)
12-12 11:13:44.615: E/AndroidRuntime(8035):         at java.lang.reflect.Method.invoke(Method.java:515)
12-12 11:13:44.615: E/AndroidRuntime(8035):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
12-12 11:13:44.615: E/AndroidRuntime(8035):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
12-12 11:13:44.615: E/AndroidRuntime(8035):         at dalvik.system.NativeStart.main(Native Method)
12-12 11:13:44.615: E/AndroidRuntime(8035): Caused by: java.lang.NullPointerException
12-12 11:13:44.615: E/AndroidRuntime(8035):         at com.thelikes.thegot2run.Bluetooth$1.onReceive(Bluetooth.java:119)
12-12 11:13:44.615: E/AndroidRuntime(8035):         at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:766)
12-12 11:13:44.615: E/AndroidRuntime(8035):         ... 9 more

Solo che non capisco il perchè non avvenga sempre ma a "random". Di seguito posto anche la mia activity per lanciare il bluetooth:
Codice (Java): [Seleziona]
public class Bluetooth extends Activity implements OnItemClickListener{

        public static void disconnect(){
                if (connectedThread != null) {
                        connectedThread.cancel();
                        connectedThread = null;
                }
        }

        public static void gethandler(Handler handler){//Bluetooth handler
                mHandler = handler;
        }
        static Handler mHandler = new Handler();

        static ConnectedThread connectedThread;
        public static final UUID MY_UUID = UUID.fromString("00001101-0000-1000-8000-00805F9B34FB");
        protected static final int SUCCESS_CONNECT = 0;
        protected static final int MESSAGE_READ = 1;
        ArrayAdapter<String> listAdapter;
        ListView listView;
        static BluetoothAdapter btAdapter;
        Set<BluetoothDevice> devicesArray;
        ArrayList<String> pairedDevices;
        ArrayList<BluetoothDevice> devices;
        IntentFilter filter;
        BroadcastReceiver receiver;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_bluetooth);
                init();
                if (btAdapter==null){
                        Toast.makeText(getApplicationContext(), "No bluetooth detected", 0).show();
                        finish();
                }else{
                        if (!btAdapter.isEnabled()){
                                turnOnBT();
                        }
                        getPairedDevices();
                        startDiscovery();
                }

        }


        private void startDiscovery() {
                // TODO Auto-generated method stub
                btAdapter.cancelDiscovery();
                btAdapter.startDiscovery();
        }

        private void turnOnBT() {
                Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
                startActivityForResult(intent, 1);
        }

        private void getPairedDevices() {
                devicesArray = btAdapter.getBondedDevices();
                if (devicesArray.size()>0){
                        for(BluetoothDevice device:devicesArray){
                                pairedDevices.add(device.getName());
                        }
                }
        }

        private void init(){
                listView = (ListView)findViewById(R.id.listView);
                listView.setOnItemClickListener(this);
                listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,0);
                listView.setAdapter(listAdapter);
                btAdapter = BluetoothAdapter.getDefaultAdapter();
                pairedDevices = new ArrayList<String>();
                filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
                devices = new ArrayList<BluetoothDevice>();    
                receiver = 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);
                                        String s = "";
                                        for(int a=0;a<pairedDevices.size();a++){
                                                if (device.getName().equals(pairedDevices.get(a))){
                                                        //append
                                                        s = "(Paired)";
                                                        break;
                                                }
                                        }
                                        listAdapter.add(device.getName()+" "+s+" "+"\n"+device.getAddress());

                                }else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)){

                                }else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){

                                }else if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)){
                                        if (btAdapter.getState() == btAdapter.STATE_OFF){
                                                turnOnBT();
                                        }
                                }  
                        }

                };

                registerReceiver(receiver, filter);
                IntentFilter filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
                registerReceiver(receiver, filter);
                filter = new IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
                registerReceiver(receiver, filter);
                filter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
        }

        @Override
        protected void onPause() {
            // TODO Auto-generated method stub
            super.onPause();
            try {
                unregisterReceiver(receiver);
            } catch (IllegalArgumentException e) {
                // ignored    
            }
        }

        protected void onActivityResult(int requestCode, int resultCode, Intent data){
                super.onActivityResult(requestCode, resultCode, data);
                if (resultCode == RESULT_CANCELED){
                        Toast.makeText(getApplicationContext(), "Bluetooth must be enabled to continue", Toast.LENGTH_SHORT).show();
                        finish();
                }
        }

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
                // TODO Auto-generated method stub
                if (btAdapter.isDiscovering()){
                        btAdapter.cancelDiscovery();
                }
                if (listAdapter.getItem(arg2).contains("(Paired)")){

                        BluetoothDevice selectedDevice = devices.get(arg2);
                        ConnectThread connect = new ConnectThread(selectedDevice);
                        connect.start();
                }else {
                        Toast.makeText(getApplicationContext(), "device is not paired", 0).show();
                }
        }

        private class ConnectThread extends Thread {
                private final BluetoothSocket mmSocket;
                private final BluetoothDevice mmDevice;

                public ConnectThread(BluetoothDevice device) {
                        // Use a temporary object that is later assigned to mmSocket,
                        // because mmSocket is final
                        BluetoothSocket tmp = null;
                        mmDevice = device;

                        // Get a BluetoothSocket to connect with the given BluetoothDevice
                        try {
                                // MY_UUID is the app's UUID string, also used by the server code
                                tmp = device.createRfcommSocketToServiceRecord(MY_UUID);
                        } catch (IOException e) { }
                        mmSocket = tmp;
                }

                public void run() {
                        // Cancel discovery because it will slow down the connection
                        btAdapter.cancelDiscovery();

                        try {
                                // Connect the device through the socket. This will block
                                // until it succeeds or throws an exception
                                mmSocket.connect();
                                //connectedThread = new ConnectedThread(mmSocket);
                        } catch (IOException connectException) {
                                // Unable to connect; close the socket and get out
                                try {
                                        mmSocket.close();
                                } catch (IOException closeException) { }
                                return;
                        }

                        // Do work to manage the connection (in a separate thread)
                        mHandler.obtainMessage(SUCCESS_CONNECT, mmSocket).sendToTarget();
                }

                /** Will cancel an in-progress connection, and close the socket */
                public void cancel() {
                        try {
                                mmSocket.close();
                        } catch (IOException e) { }
                }
        }

        static class ConnectedThread extends Thread {
                private final BluetoothSocket mmSocket;
                private final InputStream mmInStream;
                private final OutputStream mmOutStream;

                public ConnectedThread(BluetoothSocket socket) {
                        mmSocket = socket;
                        InputStream tmpIn = null;
                        OutputStream tmpOut = null;

                        // Get the input and output streams, using temp objects because
                        // member streams are final
                        try {
                                tmpIn = socket.getInputStream();
                                tmpOut = socket.getOutputStream();
                        } catch (IOException e) { }

                        mmInStream = tmpIn;
                        mmOutStream = tmpOut;
                }
                StringBuffer sbb = new StringBuffer();
                public void run() {

                        byte[] buffer;  // buffer store for the stream
                        int bytes; // bytes returned from read()

                        // Keep listening to the InputStream until an exception occurs
                        while (true) {
                                try {
                                        try {
                                                sleep(30);
                                        } catch (InterruptedException e) {
                                                // TODO Auto-generated catch block
                                                e.printStackTrace();
                                        }

                                        buffer = new byte[1024];
                                        // Read from the InputStream
                                        bytes = mmInStream.read(buffer);
                                        // Send the obtained bytes to the UI activity
                                        mHandler.obtainMessage(MESSAGE_READ, bytes, -1, buffer).sendToTarget();
                                } catch (IOException e) {
                                        break;
                                }
                        }
                }

                /* Call this from the main activity to send data to the remote device */
                public void write(String income) {

                        try {
                                mmOutStream.write(income.getBytes());
                                for(int i=0;i<income.getBytes().length;i++)
                                Log.v("outStream"+Integer.toString(i),Character.toString((char)(Integer.parseInt(Byte.toString(income.getBytes()[i])))));
                                try {
                                        Thread.sleep(20);
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        } catch (IOException e) { }
                }
               
                 public void write(byte[] buffer) {
                         
                                 try {
                         
                                     mmOutStream.write(buffer);
                         
                                 } catch (IOException e) { }
                         
                             }

               
                /* Call this from the main activity to shutdown the connection */
                public void cancel() {
                        try {
                                mmSocket.close();
                        } catch (IOException e) { }
                }
       
        }

       
}

Grazie per l'aiuto!

Offline wlf

  • Utente normale
  • ***
  • Post: 335
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Errore nel bluetooth
« Risposta #1 il: 12 Dicembre 2014, 14:36:58 CET »
0
Ciao a tutti, a volte quando lancio l'activity del bluetooth ricevo questo errore:
Codice: [Seleziona]
11:13:44.615: E/AndroidRuntime(8035): Caused by: java.lang.NullPointerException
12-12 11:13:44.615: E/AndroidRuntime(8035):         at com.thelikes.thegot2run.Bluetooth$1.onReceive(Bluetooth.java:119)
Solo che non capisco il perchè non avvenga sempre ma a "random".

La segnalazione di errore ti sta dicendo sia il motivo (NullPointerException) che dove si è verificato l'errore (onReceive), addirittura ti dice la riga (119) del tuo codice!
Molto probabilmente a tale riga avrai la device.getName(); con tutta probabilità è questa che ti da errore.
Presumo che stai provando in un posto dove ci sono dei PC portatili, è questa è la concausa. Si verifica random perché dipende se questi portatili broadcastano mentre tu testi la tua App Android.  :)

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Errore nel bluetooth
« Risposta #2 il: 12 Dicembre 2014, 14:48:33 CET »
0
Ah ecco ora capisco! Ma c'è un modo per evitare questo disagio?

Offline wlf

  • Utente normale
  • ***
  • Post: 335
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Errore nel bluetooth
« Risposta #3 il: 12 Dicembre 2014, 15:37:18 CET »
+1
Ah ecco ora capisco! Ma c'è un modo per evitare questo disagio?

Si, hai più modi:
1) Disabilitare il bluetooth da tutti i notebook che hai nelle vicinanze. Normalmente è necessario disabilitare anche il wifi dato che l'accensione del modulo radio frequentemente è univoco.
2) Far partire il programma del bluetooth a tutti i notebook, ti dovrebbe apparire l'icona del bluetooth in basso a dx a fianco dell'orario, in questo modo ogni macchina avrà un nome e non un nome "null".
3) Modificare il codice dell'App inserendo una condizione prima di ogni confronto di device.getName() per controllare che non sia null.

Codice: [Seleziona]
                                                if (device.getName() != null && device.getName().equals(pairedDevices.get(a))){
                                                        //append
                                                        s = "(Paired)";
                                                        break;
                                                }
« Ultima modifica: 12 Dicembre 2014, 15:40:23 CET da wlf »

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Errore nel bluetooth
« Risposta #4 il: 16 Dicembre 2014, 10:23:21 CET »
0
Scusa se ti rispondo solo ora. Io nel mio codice ho questa parte:
Codice (Java): [Seleziona]
if (device.getName().equals(pairedDevices.get(a))){
                                                        //append
                                                        s = "(Paired)";
                                                        break;
                                                }

che dovrei modificare con quella che mi hai scritto te? ;)

Offline wlf

  • Utente normale
  • ***
  • Post: 335
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Errore nel bluetooth
« Risposta #5 il: 16 Dicembre 2014, 21:06:46 CET »
+1
che dovrei modificare con quella che mi hai scritto te? ;)

Devi semplicemente scegliere tra uno dei tre punti del mio post precedente; se scegli di modificare la tua app devi fare la modifica che ti ho indicato! ;)

Pensavo di essere stato chiaro, ma se non lo sono stato e se hai ancora dubbi prova ad esporli! :)


--- edit ---
Gentilmente potresti farmi sapere se con la modifica non hai più il problema? :)
« Ultima modifica: 17 Dicembre 2014, 10:18:00 CET da wlf »

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Errore nel bluetooth
« Risposta #6 il: 17 Dicembre 2014, 13:31:10 CET »
0
Sì perfetto grazie mille! :)

Offline wlf

  • Utente normale
  • ***
  • Post: 335
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Xperia
Re:Errore nel bluetooth
« Risposta #7 il: 17 Dicembre 2014, 14:39:18 CET »
0
Ti è chiaro perché hai la device.getName() che in alcuni casi ti restituisce un null causandoti la NullPointerException?

Offline davix10

  • Utente normale
  • ***
  • Post: 159
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Lg G4
  • Play Store ID:
    davix10
  • Sistema operativo:
    Windows 10
Re:Errore nel bluetooth
« Risposta #8 il: 17 Dicembre 2014, 14:43:08 CET »
0
Sì tutto chiaro. Grazie ancora :)