使用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) 个答案