有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我想写一个应用程序,使用户可以通过按下按钮进入第一页并使用意图进入第二页。在第二页上,您必须请求用户的蓝牙许可,然后打开按钮扫描蓝牙设备。蓝牙信息应以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();
     
    }

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:安卓="http://schemas.安卓.com/apk/res/安卓"
    xmlns:app="http://schemas.安卓.com/apk/res-auto"
    xmlns:tools="http://schemas.安卓.com/tools"
    安卓:layout_width="match_parent"
    安卓:layout_height="match_parent"
    tools:context=".BTScan_page">
    <fragment
        安卓:layout_width="match_parent"
        安卓:layout_height="match_parent"
        安卓:id="@+id/nav_container"
        安卓:name="com.example.mybluetooth.ScanFragment"
        />

</LinearLayout>

第二页的片段

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);
    }


}

我的适配器

enter code here

public class bthAdapter extends RecyclerView.Adapter<bthAdapter.bthDeviceViewHolder> {


private ArrayList<BLEdevice> list;
private HashMap<String, BLEdevice> hashMap;
private int mNumberItems;
final private ListItemClickListener mOnClickListener;

public interface ListItemClickListener {
    void onListItemClick(int clickedItemIndex);
}

public bthAdapter(ListItemClickListener mOnClickListener){
    this.mOnClickListener = mOnClickListener;
    list=new ArrayList<BLEdevice>();
    hashMap=new HashMap<String, BLEdevice>();

}
public bthAdapter(int numberOfItems, ListItemClickListener listener) {

    mNumberItems = numberOfItems;
    mOnClickListener = listener;

}

public void addbth(String mac,String rssi, String content){
    if(hashMap.containsKey(mac)){
        return;
    }

    BLEdevice device=new BLEdevice();
    device.deviceName=mac;
    device.RSSI=rssi;
    device.content=content;
    Log.d("BLE",device.deviceName);
    list.add(0,device);


}
@Override
public bthDeviceViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
    Context context = viewGroup.getContext();
    int layoutIdForListItem = R.layout.numberlist;
    LayoutInflater inflater = LayoutInflater.from(context);
    boolean shouldAttachToParentImmediately = false;

    View view1 = inflater.inflate(layoutIdForListItem, viewGroup, shouldAttachToParentImmediately);
    bthDeviceViewHolder viewHolder = new bthDeviceViewHolder(view1);


    return viewHolder;
}



public void onBindViewHolder(bthDeviceViewHolder holder, int position) {
    Log.d("BLE", "#" + position);
    holder.bind(position);
}

@Override
public int getItemCount() {
    return list.size();
}


class bthDeviceViewHolder extends RecyclerView.ViewHolder
        implements View.OnClickListener {
    TextView deviceNameView;
    TextView RssiView;
    TextView contentView;



    public bthDeviceViewHolder(@NonNull View itemView) {
        super(itemView);

        deviceNameView=(TextView)itemView.findViewById(R.id.mac1);
        RssiView=(TextView)itemView.findViewById(R.id.rssi1);
        contentView=(TextView)itemView.findViewById(R.id.content1);

        itemView.setOnClickListener(this);
    }

    void bind(int listIndex) {
        BLEdevice blEdevice=list.get(listIndex);
        deviceNameView.setText(blEdevice.deviceName);
        RssiView.setText(blEdevice.RSSI);
        contentView.setText(blEdevice.content);
    }

    @Override
    public void onClick(View v) {
        int clickedPosition = getAdapterPosition();
        mOnClickListener.onListItemClick(clickedPosition);

    }

}

}


共 (0) 个答案