使用Recyclerview JAVA android应用程序分段进行蓝牙扫描
我想写一个应用程序,使用户可以通过按下按钮进入第一页并使用意图进入第二页。在第二页上,您必须请求用户的蓝牙许可,然后打开按钮扫描蓝牙设备。蓝牙信息应以recyclerview格式在第二页列出。使用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
然而,我写了以下代码,当进入第二个页面时,应用程序将崩溃,没有任何错误 第一页---欢迎页
第二页——扫描页 第二页的活动
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'