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时