简体   繁体   English

蓝牙应用在启动时崩溃

[英]Bluetooth App crashes on launch

I am an absolute beginner in android development. 我是android开发的绝对初学者。 I tried making a Bluetooth app and it crashes on launch. 我尝试制作一个蓝牙应用,但在启动时崩溃。 The app is supposed to search and connect to a specific device whose name is entered by the user. 该应用程序应搜索并连接到用户输入名称的特定设备。 I've caught every exception but I am clueless. 我已经捕获了所有异常,但我一无所知。 Any help would be appreciated. 任何帮助,将不胜感激。 The Complete code is attached. 随附完整代码。 Thanks. 谢谢。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.bluetooth.*;
import android.widget.*;
import android.util.*;
import android.content.*;
import android.view.View;
import java.io.*;
import java.util.*;


public class MainActivity extends AppCompatActivity {

public BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
UUID newUUID = UUID.randomUUID();
InputStream inStream;
byte[] buffer = new byte[1024];
public ArrayList<BluetoothDevice> devices = new ArrayList<>();
public TextView text = findViewById(R.id.textView);
public String incomingMessage;
private final BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // When discovery finds a device
        if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
            final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);

            switch (state) {
                case BluetoothAdapter.STATE_OFF:
                    Log.d("", "onReceive: STATE OFF");
                    break;
                case BluetoothAdapter.STATE_TURNING_OFF:
                    Log.d("", "mBroadcastReceiver1: STATE TURNING OFF");
                    break;
                case BluetoothAdapter.STATE_ON:
                    Log.d("", "mBroadcastReceiver1: STATE ON");
                    break;
                case BluetoothAdapter.STATE_TURNING_ON:
                    Log.d("", "mBroadcastReceiver1: STATE TURNING ON");
                    break;
            }
        }
    }
};

private final BroadcastReceiver mBroadcastReceiver2 = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();

        if (BluetoothAdapter.ACTION_SCAN_MODE_CHANGED.equals(action)) {

            int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, BluetoothAdapter.ERROR);

            switch (mode) {
                //Device is in Discoverable Mode
                case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
                    Log.d("", "mBroadcastReceiver2: Discoverability Enabled.");
                    break;
                //Device not in discoverable mode
                case BluetoothAdapter.SCAN_MODE_CONNECTABLE:
                    Log.d("", "mBroadcastReceiver2: Discoverability Disabled. Able to receive connections.");
                    break;
                case BluetoothAdapter.SCAN_MODE_NONE:
                    Log.d("", "mBroadcastReceiver2: Discoverability Disabled. Not able to receive connections.");
                    break;
                case BluetoothAdapter.STATE_CONNECTING:
                    Log.d("", "mBroadcastReceiver2: Connecting....");
                    break;
                case BluetoothAdapter.STATE_CONNECTED:
                    Log.d("", "mBroadcastReceiver2: Connected.");
                    break;
            }

        }
    }
};
private BroadcastReceiver mBroadcastReceiver3 = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        Log.d("", "onReceive: ACTION FOUND.");

        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            devices.add(device);
            Log.d("", "onReceive: " + device.getName() + ": " + device.getAddress());
        }

    }
};
private final BroadcastReceiver mBroadcastReceiver4 = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();

        if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
            BluetoothDevice mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            if (mDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
                Log.d("", "BroadcastReceiver: BOND_BONDED.");
            }
            if (mDevice.getBondState() == BluetoothDevice.BOND_BONDING) {
                Log.d("", "BroadcastReceiver: BOND_BONDING.");
            }
            if (mDevice.getBondState() == BluetoothDevice.BOND_NONE) {
                Log.d("", "BroadcastReceiver: BOND_NONE.");
            }
        }
    }
};

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

public void onCLick(View button) {
    IntentFilter m4 = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
    registerReceiver(mBroadcastReceiver4,m4);
    if(adapter==null)
    {
        Log.d("","Bluetooth is null");
        onDestroy();
    }
    EditText deviceName = findViewById(R.id.editText);
    String name = deviceName.getText().toString();
    BluetoothDevice targetDevice = null;
    if (!adapter.isEnabled()) {
        Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
        startActivityForResult(enableIntent, 1);

        IntentFilter BTIntent = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
        registerReceiver(mBroadcastReceiver1,BTIntent);

        Toast.makeText(getApplicationContext(),"BT TURNED ON",Toast.LENGTH_LONG).show();

        Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
        discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
        startActivity(discoverableIntent);

        IntentFilter intentFilter = new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
        registerReceiver(mBroadcastReceiver2,intentFilter);

    }
    Set<BluetoothDevice> paired_devices = adapter.getBondedDevices();
    Toast.makeText(getApplicationContext(),"GETTING BONDED DEVICES",Toast.LENGTH_LONG).show();
    if (paired_devices.size() > 0) {
        for (BluetoothDevice mdevice : paired_devices) {
            if (mdevice.getName().equals("name")) {
                Toast.makeText(getApplicationContext(),"FOUND DEVICE",Toast.LENGTH_LONG).show();
                targetDevice = mdevice;
                break;
            }
        }

    }
    else
    {
        Toast.makeText(getApplicationContext(),"SEARCHING DEVICES",Toast.LENGTH_LONG).show();
        if(adapter.isDiscovering())
            adapter.cancelDiscovery();
        adapter.startDiscovery();
        IntentFilter deviceFound = new IntentFilter(BluetoothDevice.ACTION_FOUND);
        registerReceiver(mBroadcastReceiver3,deviceFound);
        for(BluetoothDevice mdevice:devices)
        {
            if(name.equalsIgnoreCase(mdevice.getName()))
            {
                targetDevice = mdevice;
            }
        }
        if(devices.size()==0)
        {
            Toast.makeText(getApplicationContext(),"NO DEVICE FOUND... QUITTING",Toast.LENGTH_LONG).show();
        }
    }

    BluetoothSocket mSocket = null;
    try {
        assert targetDevice != null;
        mSocket = targetDevice.createInsecureRfcommSocketToServiceRecord(newUUID);
    } catch (IOException | AssertionError e) {
        Toast.makeText(getApplicationContext(),"COULD NOT BE CONNECTED",Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }

    try {
        assert mSocket != null;
        mSocket.connect();
    } catch (IOException|AssertionError e) {
        e.printStackTrace();
        Toast.makeText(getApplicationContext(),"COULD NOT MAKE CONNECTION",Toast.LENGTH_LONG).show();
    }

    try {
        assert mSocket != null;
        inStream = mSocket.getInputStream();
    } catch (IOException|AssertionError | NullPointerException e) {
        Toast.makeText(getApplicationContext(),"PROBLEM CONNECTING",Toast.LENGTH_LONG).show();
        e.printStackTrace();
    }
    while(true)
    {
        try {
            int bytes = inStream.read(buffer);
             incomingMessage = new String(buffer,0,bytes);

        } catch (IOException e) {
            e.printStackTrace();
            break;
        }
    }
    text.setText(incomingMessage);
    Toast.makeText(getApplicationContext(),"END OF PROGRAM",Toast.LENGTH_LONG).show();
}

}

[ https://i.stack.imgur.com/3v3qI.png] [ https://i.stack.imgur.com/42Ge5.png ] [ https://i.stack.imgur.com/3v3qI.png] [ https://i.stack.imgur.com/42Ge5.png ]

Second link for logcat crash after button press 按下按钮后logcat崩溃的第二个链接

You can not find a view by id, until it is rendered. 在渲染视图之前,您无法通过ID查找视图。 If you write findViewById at global level, then activity tries to load that View before setting layout. 如果您在全局级别编写findViewById ,则活动将尝试在设置布局之前加载该View。

Put your findViewById code after setContentView() . 将您的findViewById代码放在setContentView()

package in.ks.widgetClock.defaultClasses.webservice;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.bluetooth.*;
import android.widget.*;
import android.util.*;
import android.content.*;
import android.view.View;
import java.io.*;
import java.util.*;

import in.ks.widgetClock.R;


public class MainActivity extends AppCompatActivity {

    public BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
    UUID newUUID = UUID.randomUUID();
    InputStream inStream;
    byte[] buffer = new byte[1024];
    public ArrayList<BluetoothDevice> devices = new ArrayList<>();
    public TextView text;

    public String incomingMessage;
    private final BroadcastReceiver mBroadcastReceiver1 = new BroadcastReceiver() {
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            // When discovery finds a device
            if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
                final int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);

                switch (state) {
                    case BluetoothAdapter.STATE_OFF:
                        Log.d("", "onReceive: STATE OFF");
                        break;
                    case BluetoothAdapter.STATE_TURNING_OFF:
                        Log.d("", "mBroadcastReceiver1: STATE TURNING OFF");
                        break;
                    case BluetoothAdapter.STATE_ON:
                        Log.d("", "mBroadcastReceiver1: STATE ON");
                        break;
                    case BluetoothAdapter.STATE_TURNING_ON:
                        Log.d("", "mBroadcastReceiver1: STATE TURNING ON");
                        break;
                }
            }
        }
    };

    private final BroadcastReceiver mBroadcastReceiver2 = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();

            if (BluetoothAdapter.ACTION_SCAN_MODE_CHANGED.equals(action)) {

                int mode = intent.getIntExtra(BluetoothAdapter.EXTRA_SCAN_MODE, BluetoothAdapter.ERROR);

                switch (mode) {
                    //Device is in Discoverable Mode
                    case BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE:
                        Log.d("", "mBroadcastReceiver2: Discoverability Enabled.");
                        break;
                    //Device not in discoverable mode
                    case BluetoothAdapter.SCAN_MODE_CONNECTABLE:
                        Log.d("", "mBroadcastReceiver2: Discoverability Disabled. Able to receive connections.");
                        break;
                    case BluetoothAdapter.SCAN_MODE_NONE:
                        Log.d("", "mBroadcastReceiver2: Discoverability Disabled. Not able to receive connections.");
                        break;
                    case BluetoothAdapter.STATE_CONNECTING:
                        Log.d("", "mBroadcastReceiver2: Connecting....");
                        break;
                    case BluetoothAdapter.STATE_CONNECTED:
                        Log.d("", "mBroadcastReceiver2: Connected.");
                        break;
                }

            }
        }
    };
    private BroadcastReceiver mBroadcastReceiver3 = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();
            Log.d("", "onReceive: ACTION FOUND.");

            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                devices.add(device);
                Log.d("", "onReceive: " + device.getName() + ": " + device.getAddress());
            }

        }
    };
    private final BroadcastReceiver mBroadcastReceiver4 = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            final String action = intent.getAction();

            if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
                BluetoothDevice mDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                if (mDevice.getBondState() == BluetoothDevice.BOND_BONDED) {
                    Log.d("", "BroadcastReceiver: BOND_BONDED.");
                }
                if (mDevice.getBondState() == BluetoothDevice.BOND_BONDING) {
                    Log.d("", "BroadcastReceiver: BOND_BONDING.");
                }
                if (mDevice.getBondState() == BluetoothDevice.BOND_NONE) {
                    Log.d("", "BroadcastReceiver: BOND_NONE.");
                }
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        text = findViewById(R.id.textView);
    }

    public void onCLick(View button) {
        IntentFilter m4 = new IntentFilter(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
        registerReceiver(mBroadcastReceiver4,m4);
        if(adapter==null)
        {
            Log.d("","Bluetooth is null");
            onDestroy();
        }
        EditText deviceName = findViewById(R.id.editText);
        String name = deviceName.getText().toString();
        BluetoothDevice targetDevice = null;
        if (!adapter.isEnabled()) {
            Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
            startActivityForResult(enableIntent, 1);

            IntentFilter BTIntent = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
            registerReceiver(mBroadcastReceiver1,BTIntent);

            Toast.makeText(getApplicationContext(),"BT TURNED ON",Toast.LENGTH_LONG).show();

            Intent discoverableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
            discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 0);
            startActivity(discoverableIntent);

            IntentFilter intentFilter = new IntentFilter(BluetoothAdapter.ACTION_SCAN_MODE_CHANGED);
            registerReceiver(mBroadcastReceiver2,intentFilter);

        }
        Set<BluetoothDevice> paired_devices = adapter.getBondedDevices();
        Toast.makeText(getApplicationContext(),"GETTING BONDED DEVICES",Toast.LENGTH_LONG).show();
        if (paired_devices.size() > 0) {
            for (BluetoothDevice mdevice : paired_devices) {
                if (mdevice.getName().equals("name")) {
                    Toast.makeText(getApplicationContext(),"FOUND DEVICE",Toast.LENGTH_LONG).show();
                    targetDevice = mdevice;
                    break;
                }
            }

        }
        else
        {
            Toast.makeText(getApplicationContext(),"SEARCHING DEVICES",Toast.LENGTH_LONG).show();
            if(adapter.isDiscovering())
                adapter.cancelDiscovery();
            adapter.startDiscovery();
            IntentFilter deviceFound = new IntentFilter(BluetoothDevice.ACTION_FOUND);
            registerReceiver(mBroadcastReceiver3,deviceFound);
            for(BluetoothDevice mdevice:devices)
            {
                if(name.equalsIgnoreCase(mdevice.getName()))
                {
                    targetDevice = mdevice;
                }
            }
            if(devices.size()==0)
            {
                Toast.makeText(getApplicationContext(),"NO DEVICE FOUND... QUITTING",Toast.LENGTH_LONG).show();
            }
        }

        BluetoothSocket mSocket = null;
        try {
            assert targetDevice != null;
            mSocket = targetDevice.createInsecureRfcommSocketToServiceRecord(newUUID);
        } catch (IOException | AssertionError e) {
            Toast.makeText(getApplicationContext(),"COULD NOT BE CONNECTED",Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }

        try {
            assert mSocket != null;
            mSocket.connect();
        } catch (IOException|AssertionError e) {
            e.printStackTrace();
            Toast.makeText(getApplicationContext(),"COULD NOT MAKE CONNECTION",Toast.LENGTH_LONG).show();
        }

        try {
            assert mSocket != null;
            inStream = mSocket.getInputStream();
        } catch (IOException|AssertionError | NullPointerException e) {
            Toast.makeText(getApplicationContext(),"PROBLEM CONNECTING",Toast.LENGTH_LONG).show();
            e.printStackTrace();
        }
        while(true)
        {
            try {
                int bytes = inStream.read(buffer);
                incomingMessage = new String(buffer,0,bytes);

            } catch (IOException e) {
                e.printStackTrace();
                break;
            }
        }
        text.setText(incomingMessage);
        Toast.makeText(getApplicationContext(),"END OF PROGRAM",Toast.LENGTH_LONG).show();
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM