android 10 启动蓝牙服务时崩溃

android 10 is crashed when starting bluetooth service

几天前,我写了几行代码通过服务将应用程序连接到 HC-05(蓝牙模块)。我知道一个简单的服务不能在 android 8+ 中存活。所以我使用 YouTube 频道上提供的一些免费教程修改了我的服务,如下所示:

https://www.youtube.com/watch?v=BXwDM5VVuKA

android 7- 没有任何问题,但是 android 10 当我点击“启动服务”按钮时崩溃。

我为您带来了我的部分代码。

服务中的 onStartCommand:

public int onStartCommand(Intent intent, int flags, int startId) {
    createNotificationChannel();
    Intent intent1=new Intent(this,MainActivity.class);
    PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent1,0);
    Notification notification=new NotificationCompat.Builder(this,"ChannelId1").setContentTitle("mY TITLE")
            .setContentText("our app").setSmallIcon(R.drawable.and).setContentIntent(pendingIntent).build();


    Log.d("PrinterService", "Onstart Command");
    mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
    if (mBluetoothAdapter != null) {
        
        deviceName=intent.getStringExtra("deviceName");

        Set<BluetoothDevice> bt=mBluetoothAdapter.getBondedDevices();
        Log.i("3","thread id:\n"+"service CONNECTED"+" "+ bt.size());
        if (bt.size()>0){
            for (BluetoothDevice device:bt){
                if(device.getName().equals(deviceName)){
                    String macAddress=device.getAddress();
                    if (macAddress != null && macAddress.length() > 0) {
                        connectToDevice(macAddress);
                        Log.i("3","thread id:\n"+"service CONNECTED");
                    } else {
                        stopSelf();

                        startForeground(1,notification);
                        return START_STICKY;
                    }
                }
            }

        }

    }
    String stopservice = intent.getStringExtra("stopservice");
    if (stopservice != null && stopservice.length() > 0) {
        stop();
    }
    startForeground(1,notification);
    return START_STICKY;
}

和'createNotificationChannel()'函数定义在这里:

private void createNotificationChannel() {
    if(Build.VERSION.SDK_INT>Build.VERSION_CODES.O){
        NotificationChannel notificationChannel=new NotificationChannel("ChannelId1","Foreground notification", NotificationManager.IMPORTANCE_DEFAULT);
        NotificationManager manager=getSystemService(NotificationManager.class);
        manager.createNotificationChannel(notificationChannel);
    }
}

buttonIn 的 onClick 方法(为了启动服务)在这里:

public void onClick(View v) {
    //first
    if (v.getId()==R.id.buttonIn){
        buttinEnter.setEnabled(false);
        if(Build.VERSION.SDK_INT>Build.VERSION_CODES.O){
            startForegroundService(intentService);
        }else {
            startService(intentService);
        }
        mStopLoop=true;
        //second
        bind_service();
        //third
        

        Handler handler2 = new Handler();
        handler2.postDelayed(new Runnable() {
            @Override
            public void run() {
                if (PrinterService.started==1) {
                    goto_next();//going to the next activity
                }else {
                    buttinEnter.setEnabled(true);
                    Toast.makeText(getApplicationContext(),"you are not connected. turn on your bluetooth on your phone and POWER on device.",Toast.LENGTH_LONG).show();
                    isServiceBound=false;
                }
            }
        }, 5000);
        
    }
    
    }

所以谁能用android 10.

解决这个问题

Android 10 对实现蓝牙有一些限制。 例如,您需要允许一些与位置相关的权限。 以下文字摘自以下网站:

https://www.journaldev.com/28028/android-10-location-permissions

Android 10 个位置权限

随着 Android10 的推出,除了对话框 UI 之外,处理位置权限的方式也发生了变化。 现在,当应用程序处于后台时,用户可以选择是否需要位置更新。 为此,需要在清单文件中声明新权限:

与 COARSE_LOCATION 一起调用它会弹出一个包含三个选项的对话框:

1-总是允许 2-仅在使用应用程序时允许 3-拒绝

所以问题是。现在通过添加这些权限,我的问题就解决了。