使用Recyclerview JAVA android应用程序分段进行蓝牙扫描

使用Recyclerview JAVA android应用程序分段进行蓝牙扫描,java,android,android-fragments,android-recyclerview,bluetooth,Java,Android,Android Fragments,Android Recyclerview,Bluetooth,我想写一个应用程序,使用户可以通过按下按钮进入第一页并使用意图进入第二页。在第二页上,您必须请求用户的蓝牙许可,然后打开按钮扫描蓝牙设备。蓝牙信息应以recyclerview格式在第二页列出。 然而,我写了以下代码,当进入第二个页面时,应用程序将崩溃,没有任何错误 第一页---欢迎页 第二页——扫描页 第二页的活动 enter code here public class BTScan_page extends AppCompatActivity { @Override prot

我想写一个应用程序,使用户可以通过按下按钮进入第一页并使用意图进入第二页。在第二页上,您必须请求用户的蓝牙许可,然后打开按钮扫描蓝牙设备。蓝牙信息应以recyclerview格式在第二页列出。
然而,我写了以下代码,当进入第二个页面时,应用程序将崩溃,没有任何错误

第一页---欢迎页
第二页——扫描页

第二页的活动

enter code here
public class BTScan_page extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b_t_scan_page);
        Intent intentThatStartedThisActivity = getIntent();
     
    }
enter code here

public class ScanFragment extends Fragment implements View.OnClickListener {

    private Button buttonSCAN;
    boolean is_enable = true;
    private Switch SwitchScan;
    private static final int Permission_Code = 666;
    private BluetoothAdapter mBluetoothAdapter;
    private bthAdapter mResultAdapter;
    private BluetoothLeScanner mBluetoothLeScanner;

    public ScanFragment() {
        // Required empty public constructor
    }


    // TODO: Rename and change types and number of parameters
    public static ScanFragment newInstance(String param1, String param2) {
        ScanFragment fragment = new ScanFragment();
        Bundle args = new Bundle();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_scan, container, false);
        buttonSCAN = (Button) rootView.findViewById(R.id.buttonSCAN);
        SwitchScan = (Switch) rootView.findViewById(R.id.switch_Below);
        buttonSCAN.setOnClickListener(this);
        SwitchScan.setOnClickListener(this);
        boolean on = SwitchScan.isChecked();

        return rootView;
    }


    @Override
    public void onClick(View v) {
        if (is_enable == true) {
            is_enable = false;
            buttonSCAN.setText("SCAN OFF");
            SwitchScan.setChecked(true);
            boolean on = true;
            if (on) {
                mBluetoothLeScanner.startScan(startScanCallback);
            }
        } else {
            is_enable = true;
            buttonSCAN.setText("SCAN ON");
            boolean on = false;
            SwitchScan.setChecked(false);
            if (!on) {
                mBluetoothLeScanner.stopScan(startScanCallback);
            }
            SwitchScan.setEnabled(is_enable);
        }

    }

    /**
     * 檢查藍芽許可權
     */
    public void checkBlePermission() {
        if (ActivityCompat.checkSelfPermission(getActivity(),
                Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(getActivity(),
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                    1);
        } else {
            Log.i("tag","已申請許可權");
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1: {
                // 如果請求被取消,則結果陣列為空。
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.i("tag","同意申請");
                } else {
                    Log.i("tag","拒絕申請");
                }
                return;
            }
        }
    }

    /**
     * 判斷是否支援藍芽,並開啟藍芽
     * 獲取到BluetoothAdapter之後,還需要判斷是否支援藍芽,以及藍芽是否開啟。
     * 如果沒開啟,需要讓使用者開啟藍芽:
     */
    private void startBluetooth() {
        //首先獲取mBluetoothAdapter
        boolean success=false;
        mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
        if(mBluetoothAdapter!=null&&mBluetoothAdapter.isEnabled()){
            BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
            BluetoothLeScanner mBluetoothLeScanner;
            if(mBluetoothAdapter!=null)
                mBluetoothLeScanner =mBluetoothAdapter.getBluetoothLeScanner();
            Toast.makeText(getActivity(),"Bluetooth scan started",Toast.LENGTH_SHORT).show();
            success=true;

        }
        if(!success) {
            Toast.makeText(getActivity(),"Bluetooth scan cannot be turned off.",Toast.LENGTH_SHORT).show();

        }
    }

    private final ScanCallback startScanCallback = new ScanCallback() {

        @Override
        public void onScanResult(int callbackType, ScanResult result) {

            BluetoothDevice device = result.getDevice();
            ScanRecord mScanRecord = result.getScanRecord();
            String address = device.getAddress();
            byte[] content = mScanRecord.getBytes();
            int mRssi = result.getRssi();
            String mRssi1=Integer.toString(mRssi);
            String ContentMessage=ByteArrayToHexString(content);
            if(address==null||address.trim().length()==0){

                mResultAdapter.addbth(address,mRssi1,ContentMessage);
                //public void addbth(String mac,String rssi, String content)
                mResultAdapter.notifyDataSetChanged();
                return;
            }

        }

    };

    public static String ByteArrayToHexString(byte[] bytes) {
        final char[] hexArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        char[] hexChars = new char[bytes.length * 2]; // Each byte has two hex characters (nibbles)
        int v;
        for (int j = 0; j < bytes.length; j++) {
            v = bytes[j] & 0xFF; // Cast bytes[j] to int, treating as unsigned value
            hexChars[j * 2] = hexArray[v >>> 4]; // Select hex character from upper nibble
            hexChars[j * 2 + 1] = hexArray[v & 0x0F]; // Select hex character from lower nibble
        }
        return new String(hexChars);
    }


}
第二页的XML 在这里输入代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    tools:context=".BTScan_page">
    <fragment
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/nav_container"
        android:name="com.example.mybluetooth.ScanFragment"
        />

</LinearLayout>

第二页的片段

enter code here
public class BTScan_page extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b_t_scan_page);
        Intent intentThatStartedThisActivity = getIntent();
     
    }
enter code here

public class ScanFragment extends Fragment implements View.OnClickListener {

    private Button buttonSCAN;
    boolean is_enable = true;
    private Switch SwitchScan;
    private static final int Permission_Code = 666;
    private BluetoothAdapter mBluetoothAdapter;
    private bthAdapter mResultAdapter;
    private BluetoothLeScanner mBluetoothLeScanner;

    public ScanFragment() {
        // Required empty public constructor
    }


    // TODO: Rename and change types and number of parameters
    public static ScanFragment newInstance(String param1, String param2) {
        ScanFragment fragment = new ScanFragment();
        Bundle args = new Bundle();
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.fragment_scan, container, false);
        buttonSCAN = (Button) rootView.findViewById(R.id.buttonSCAN);
        SwitchScan = (Switch) rootView.findViewById(R.id.switch_Below);
        buttonSCAN.setOnClickListener(this);
        SwitchScan.setOnClickListener(this);
        boolean on = SwitchScan.isChecked();

        return rootView;
    }


    @Override
    public void onClick(View v) {
        if (is_enable == true) {
            is_enable = false;
            buttonSCAN.setText("SCAN OFF");
            SwitchScan.setChecked(true);
            boolean on = true;
            if (on) {
                mBluetoothLeScanner.startScan(startScanCallback);
            }
        } else {
            is_enable = true;
            buttonSCAN.setText("SCAN ON");
            boolean on = false;
            SwitchScan.setChecked(false);
            if (!on) {
                mBluetoothLeScanner.stopScan(startScanCallback);
            }
            SwitchScan.setEnabled(is_enable);
        }

    }

    /**
     * 檢查藍芽許可權
     */
    public void checkBlePermission() {
        if (ActivityCompat.checkSelfPermission(getActivity(),
                Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(getActivity(),
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},
                    1);
        } else {
            Log.i("tag","已申請許可權");
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case 1: {
                // 如果請求被取消,則結果陣列為空。
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    Log.i("tag","同意申請");
                } else {
                    Log.i("tag","拒絕申請");
                }
                return;
            }
        }
    }

    /**
     * 判斷是否支援藍芽,並開啟藍芽
     * 獲取到BluetoothAdapter之後,還需要判斷是否支援藍芽,以及藍芽是否開啟。
     * 如果沒開啟,需要讓使用者開啟藍芽:
     */
    private void startBluetooth() {
        //首先獲取mBluetoothAdapter
        boolean success=false;
        mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
        if(mBluetoothAdapter!=null&&mBluetoothAdapter.isEnabled()){
            BluetoothAdapter mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
            BluetoothLeScanner mBluetoothLeScanner;
            if(mBluetoothAdapter!=null)
                mBluetoothLeScanner =mBluetoothAdapter.getBluetoothLeScanner();
            Toast.makeText(getActivity(),"Bluetooth scan started",Toast.LENGTH_SHORT).show();
            success=true;

        }
        if(!success) {
            Toast.makeText(getActivity(),"Bluetooth scan cannot be turned off.",Toast.LENGTH_SHORT).show();

        }
    }

    private final ScanCallback startScanCallback = new ScanCallback() {

        @Override
        public void onScanResult(int callbackType, ScanResult result) {

            BluetoothDevice device = result.getDevice();
            ScanRecord mScanRecord = result.getScanRecord();
            String address = device.getAddress();
            byte[] content = mScanRecord.getBytes();
            int mRssi = result.getRssi();
            String mRssi1=Integer.toString(mRssi);
            String ContentMessage=ByteArrayToHexString(content);
            if(address==null||address.trim().length()==0){

                mResultAdapter.addbth(address,mRssi1,ContentMessage);
                //public void addbth(String mac,String rssi, String content)
                mResultAdapter.notifyDataSetChanged();
                return;
            }

        }

    };

    public static String ByteArrayToHexString(byte[] bytes) {
        final char[] hexArray = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        char[] hexChars = new char[bytes.length * 2]; // Each byte has two hex characters (nibbles)
        int v;
        for (int j = 0; j < bytes.length; j++) {
            v = bytes[j] & 0xFF; // Cast bytes[j] to int, treating as unsigned value
            hexChars[j * 2] = hexArray[v >>> 4]; // Select hex character from upper nibble
            hexChars[j * 2 + 1] = hexArray[v & 0x0F]; // Select hex character from lower nibble
        }
        return new String(hexChars);
    }


}
在此处输入代码
公共类ScanFragment扩展了片段实现了View.OnClickListener{
私人按钮扫描;
布尔值为_enable=true;
专用开关扫描;
私有静态最终int权限\ U代码=666;
私人蓝牙适配器mBluetoothAdapter;
专用bthAdapter mResultAdapter;
私人BluetoothLeScanner mBluetoothLeScanner;
公共扫描片段(){
//必需的空公共构造函数
}
//TODO:重命名和更改参数的类型和数量
公共静态ScanFragment newInstance(字符串param1,字符串param2){
ScanFragment=新的ScanFragment();
Bundle args=新Bundle();
返回片段;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment\u扫描,容器,错误);
buttonSCAN=(Button)rootView.findviewbyd(R.id.buttonSCAN);
SwitchScan=(Switch)rootView.findviewbyd(下面的R.id.Switch_);
buttonSCAN.setOnClickListener(此);
SwitchScan.setOnClickListener(这个);
boolean on=SwitchScan.isChecked();
返回rootView;
}
@凌驾
公共void onClick(视图v){
if(is_enable==true){
is_enable=false;
按钮扫描设置文本(“扫描关闭”);
SwitchScan.setChecked(真);
布尔开=真;
如果(打开){
mbluetotherlescanner.startScan(startScanCallback);
}
}否则{
is_enable=true;
按钮扫描设置文本(“扫描打开”);
布尔开=假;
SwitchScan.setChecked(假);
如果(!on){
mBluetoothLeScanner.停止扫描(startScanCallback);
}
SwitchScan.setEnabled(是否启用);
}
}
/**
* 檢查藍芽許可權
*/
公共无效checkBlePermission(){
如果(ActivityCompat.checkSelfPermission)(getActivity(),
清单.权限.访问(位置)
!=PackageManager.权限(已授予){
ActivityCompat.requestPermissions(getActivity(),
新字符串[]{Manifest.permission.ACCESS\u\u LOCATION},
1);
}否则{
Log.i(“标记”已申請許可權");
}
}
@凌驾
public void onRequestPermissionsResult(int-requestCode,@NonNull-String[]permissions,@NonNull-int[]grantResults){
super.onRequestPermissionsResult(请求代码、权限、授权结果);
开关(请求代码){
案例1:{
// 如果請求被取消,則結果陣列為空。
如果(grantResults.length>0
&&grantResults[0]==PackageManager.PERMISSION\u已授予){
Log.i(“标记”同意申請");
}否则{
Log.i(“标记”拒絕申請");
}
返回;
}
}
}
/**
* 判斷是否支援藍芽,並開啟藍芽
* 獲取到蓝牙适配器之後,還需要判斷是否支援藍芽,以及藍芽是否開啟。
* 如果沒開啟,需要讓使用者開啟藍芽:
*/
私人无效startBluetooth(){
//首先獲取mBluetoothAdapter
布尔成功=假;
mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
if(mBluetoothAdapter!=null&&mBluetoothAdapter.isEnabled()){
BluetoothAdapter mBluetoothAdapter=BluetoothAdapter.getDefaultAdapter();
蓝牙扫描仪;
if(mBluetoothAdapter!=null)
mBluetoothLeScanner=mBluetoothAdapter.getBluetoothLeScanner();
Toast.makeText(getActivity(),“蓝牙扫描已启动”,Toast.LENGTH_SHORT.show();
成功=真实;
}
如果(!成功){
Toast.makeText(getActivity(),“蓝牙扫描无法关闭。”,Toast.LENGTH_SHORT).show();
}
}
private final ScanCallback startScanCallback=新建ScanCallback(){
@凌驾
公共void onScanResult(int callbackType、ScanResult){
BluetoothDevice=result.getDevice();
ScanRecord mScanRecord=result.getScanRecord();
字符串地址=device.getAddress();
byte[]content=mScanRecord.getBytes();
int mRssi=result.getRssi();
字符串mRssi1=整数.toString(mRssi);
String ContentMessage=ByteArrayToHexString(内容);
如果(地址==null | |地址.trim().length()==0){
addbth(地址,mRssi1,ContentMessage);
//公共void addbth(字符串mac、字符串rssi、字符串内容)
mResultAdapter.notifyDataSetChanged();
返回;
}
}
};
公共静态字符串ByteArrayToHexString(字节[]字节){
最终字符[]六边形={0','1','2','3','4','5','6','7','8','9','A','B','C','D','E'