Java 请在android studio中帮助我解决此错误
我想做一台可移动的扫描仪 启动此应用程序没有问题,但我希望启动扫描并按下启动扫描按钮,然后关闭此应用程序 这是错误代码Java 请在android studio中帮助我解决此错误,java,android,nullpointerexception,Java,Android,Nullpointerexception,我想做一台可移动的扫描仪 启动此应用程序没有问题,但我希望启动扫描并按下启动扫描按钮,然后关闭此应用程序 这是错误代码 E/BoostFramework: BoostFramework() : Exception_1 = java.lang.ClassNotFoundException: Didn't find class "com.qualcomm.qti.Performance" on path: DexPathList[[],nativeLibraryDirectories=[/syste
E/BoostFramework: BoostFramework() : Exception_1 = java.lang.ClassNotFoundException: Didn't find class "com.qualcomm.qti.Performance" on path: DexPathList[[],nativeLibraryDirectories=[/system/lib64, /vendor/lib64]]
V/BoostFramework: BoostFramework() : mPerf = null
D/ViewRootImpl@d967e4a[MainActivity]: ViewPostImeInputStage processPointer 1
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 15923
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.bluetooth.le.BluetoothLeScanner.startScan(java.util.List, android.bluetooth.le.ScanSettings, android.bluetooth.le.ScanCallback)' on a null object reference
at com.example.myapplication.MainActivity.startScan(MainActivity.java:182)
at com.example.myapplication.MainActivity.lambda$onCreate$0$MainActivity(MainActivity.java:141)
at com.example.myapplication.-$$Lambda$MainActivity$mssl4La-mhhX0ttBjD5v7QdktdI.onClick(lambda)
at android.view.View.performClick(View.java:6205)
at android.widget.TextView.performClick(TextView.java:11103)
at android.view.View$PerformClick.run(View.java:23653)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6682)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)
这是我在main活动中的代码
//// GUI variables
// text view for status
private TextView tv_status_;
// text view for read
private TextView tv_read_;
// button for start scan
private Button btn_scan_;
// button for stop connection
private Button btn_stop_;
// button for send dataenter code here
private Button btn_send_;
// button for show paired devices
private Button btn_show_;
// Tag name for Log message
private final static String TAG="Central";
// used to identify adding bluetooth names
private final static int REQUEST_ENABLE_BT= 1;
// used to request fine location permission
private final static int REQUEST_FINE_LOCATION= 2;
// scan period in milliseconds
private final static int SCAN_PERIOD= 5000;
// ble adapter
private BluetoothAdapter ble_adapter_;
// flag for scanning
private boolean is_scanning_= false;
// flag for connection
private boolean connected_= false;
// scan results
private Map<String, BluetoothDevice> scan_results_;
// scan callback
private ScanCallback scan_cb_;
// ble scanner
private BluetoothLeScanner ble_scanner_;
// scan handler
private Handler scan_handler_;
public final static String MAC_ADDR="18:62:E4:3C:2A:1B";
//BLE Scan Callback class
private class BLEScanCallback extends ScanCallback {
private Map<String, BluetoothDevice> cb_scan_results_;
//Constructor
BLEScanCallback(Map<String, BluetoothDevice> _scan_results ){
}
public void onScanResult(int _callback_type, ScanResult _result) {
Log.d(TAG, "onScanResult");
addScanResult(_result);
}
public void onScanFailed(int _error) {
Log.e(TAG,"BLE scan failed with code "+_error);
}
//add scan result
private void addScanResult(ScanResult _result) {
//get scanned device
BluetoothDevice device = _result.getDevice();
//get scanned device Mac address
String device_address = device.getAddress();
//add the device to the result list
cb_scan_results_.put(device_address, device);
//log
Log.d(TAG, "scan results device: " + device);
tv_status_.setText("add scanned device: "+ device_address);
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//// get instances of gui objects
// status textview
tv_status_= findViewById( R.id.tv_status );
// read textview
tv_read_= findViewById( R.id.tv_read );
// scan button
btn_scan_= findViewById( R.id.btn_scan );
// stop button
btn_stop_= findViewById( R.id.btn_stop );
// send button
btn_send_= findViewById( R.id.btn_send );
// show button
btn_show_= findViewById( R.id.btn_show );
// ble manager
BluetoothManager ble_manager;
ble_manager = (BluetoothManager)getSystemService(Context.BLUETOOTH_SERVICE);
// set ble adapter
ble_adapter_ = ble_manager.getAdapter();
btn_scan_.setOnClickListener((v) -> {startScan(v); });
}
//start scan
private void startScan(View v) {
tv_status_.setText("Scanning...");
// check ble adapter and ble enabled
if(ble_adapter_ == null || !ble_adapter_.isEnabled()){
requestEnableBLE();
tv_status_.setText("Scanning Failed: ble not enabled");
return;
}
//Set scanfilter
//creat filter list
List<ScanFilter> filters = new ArrayList<>();
// create a scan filter with device mac address
ScanFilter scan_filter = new ScanFilter.Builder().setDeviceAddress(MAC_ADDR).build();
// add filter to list
filters.add(scan_filter);
//// scan settings
// set low power scan mode
ScanSettings settings= new ScanSettings.Builder().setScanMode( ScanSettings.SCAN_MODE_LOW_POWER ).build();
// Scan callback
scan_results_ = new HashMap<>();
scan_cb_= new BLEScanCallback(scan_results_);
//now ready to scan
//start scan
ble_scanner_.startScan(filters, settings, scan_cb_);
//set scanning flag
is_scanning_ = true;
}
// Request BLE enable
private void requestEnableBLE() {
Intent ble_enable_intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(ble_enable_intent, REQUEST_ENABLE_BT);
}
// Request Fine Location permission
private void requestLocationPermission() {
requestPermissions( new String[]{ Manifest.permission.ACCESS_FINE_LOCATION}, REQUEST_FINE_LOCATION );
}
protected void onResume() {
super.onResume();
//finish app if the BLE is not supported
if( !getPackageManager().hasSystemFeature( PackageManager.FEATURE_BLUETOOTH_LE ) ) {
finish();
}
}
}
///GUI变量
//状态的文本视图
私密文本查看电视节目状态;
//用于阅读的文本视图
私人文本查看电视\u读取\u;
//开始扫描按钮
专用按钮btn\u扫描;
//停止连接按钮
专用按钮btn\u stop\u;
//在此处输入发送数据代码的按钮
私人按钮btn\u发送;
//显示配对设备的按钮
私人按钮显示;
//日志消息的标记名
私有最终静态字符串TAG=“Central”;
//用于识别添加的蓝牙名称
私有最终静态整数请求\启用\ BT=1;
//用于请求精细位置权限
私有最终静态int请求\u FINE\u位置=2;
//扫描周期(毫秒)
专用最终静态整数扫描周期=5000;
//可编程适配器
专用蓝牙适配器ble_u适配器uu;
//扫描标志
私有布尔值为\u扫描\u=false;
//连接标志
私有布尔连接=false;
//扫描结果
私人地图扫描结果;
//扫描回调
专用扫描回叫扫描\u cb;
//可编程扫描仪
私人蓝牙扫描仪;
//扫描处理器
专用处理程序扫描\u处理程序\u;
公共最终静态字符串MAC_ADDR=“18:62:E4:3C:2A:1B”;
//可扩展扫描回调类
私有类BLEScanCallback扩展了ScanCallback{
私有地图cb\u扫描结果\u;
//建造师
BLEScanCallback(映射扫描结果){
}
public void onScanResult(int\u回调类型,ScanResult\u结果){
Log.d(标签“onScanResult”);
addScanResult(_result);
}
公共void onscan失败(int\u错误){
Log.e(标记“BLE扫描失败,代码为”+_错误);
}
//添加扫描结果
私有void addScanResult(ScanResult\u结果){
//获取扫描设备
BluetoothDevice=_result.getDevice();
//获取扫描的设备Mac地址
字符串device_address=device.getAddress();
//将设备添加到结果列表中
cb_扫描结果_uu.put(设备地址,设备);
//日志
Log.d(标签,“扫描结果设备:”+设备);
tv_status_uuu.setText(“添加扫描设备:+设备地址”);
}
}
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
////获取gui对象的实例
//状态文本视图
tv_状态=findViewById(R.id.tv_状态);
//阅读文本视图
tv\u read=findviewbyd(R.id.tv\u read);
//扫描按钮
btn\u扫描=findViewById(R.id.btn\u扫描);
//停止按钮
btn\u停止=findViewById(R.id.btn\u停止);
//发送按钮
btn_send=findviewbyd(R.id.btn_send);
//显示按钮
btn\u show=findViewById(R.id.btn\u show);
//ble经理
蓝牙经理;
ble_管理器=(BluetoothManager)getSystemService(Context.BLUETOOTH_服务);
//设置可编程适配器
ble_适配器=ble_管理器.getAdapter();
btn_scan_uu.setOnClickListener((v)->{startScan(v);});
}
//开始扫描
专用void startScan(视图五){
电视状态设置文本(“扫描…”);
//检查ble适配器并启用ble
如果(ble_适配器==null | |!ble_适配器u.isEnabled()){
requestEnable();
tv_status_uuu.setText(“扫描失败:未启用ble”);
返回;
}
//设置扫描过滤器
//创建筛选器列表
列表过滤器=新的ArrayList();
//使用设备mac地址创建扫描筛选器
ScanFilter scan_filter=new ScanFilter.Builder().setDeviceAddress(MAC_ADDR.build();
//将筛选器添加到列表中
过滤器。添加(扫描过滤器);
////扫描设置
//设置低功耗扫描模式
ScanSettings settings=new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).build();
//扫描回调
扫描结果=新建HashMap();
scan\u cb\uu=新的BLEScanCallback(扫描结果);
//现在准备好扫描了吗
//开始扫描
ble_scanner_uu.startScan(过滤器、设置、扫描_ucb_uu);
//设置扫描标志
是否为u扫描u=真;
}
//请求可撤销启用
私有void requestEnable(){
Intent ble\u enable\u Intent=新的Intent(BluetoothAdapter.ACTION\u REQUEST\u enable);
startActivityForResult(可启用意图、请求启用意图);
}
//请求精细定位许可
私有void requestLocationPermission(){
requestPermissions(新字符串[]{Manifest.permission.ACCESS\u FINE\u LOCATION},REQUEST\u FINE\u LOCATION);
}
受保护的void onResume(){
super.onResume();
//如果不支持BLE,请完成应用程序
如果(!getPackageManager().hasSystemFeature(PackageManager.FEATURE\u BLUETOOTH\u LE)){
完成();
}
}
}
请给我一些帮助您使用ble\u scanner\uu
作为BluetoothLeScanner
并在global上初始化它
private BluetoothLeScanner ble_scanner_;
但你从不打电话
ble_scanner_ = ble_adapter_.getBluetoothLeScanner();
因此,您的ble\u扫描器
为空,并为您提供NullPointerException
将上面的行添加到onCreate
中,如下所示
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//other codes...
ble_adapter_ = ble_manager.getAdapter();
ble_scanner_ = ble_scanner_ = ble_adapter_.getBluetoothLeScanner();
btn_scan_.setOnClickListener((v) -> {startScan(v); });
}
谢谢你的回答。我试过了,但是ble_扫描器=新的BLEUTOTHLESCANNER();这一行告诉我“BluetoothLeScanner()在android中不公开。bluetooth.le.BluetoothLeScanner无法从外部软件包访问”错误。我怎样才能修好它@서영진 检查我编辑的回答谢谢。我修复了这个错误。我有一个问题,这个错误的原因是什么,以及如何修复它@서영진 当您得到NullPointerException时