android 10 выходит из строя при запуске службы Bluetooth

#java #android #service #bluetooth #android-10.0

Вопрос:

за пару дней до этого я написал несколько строк кода для подключения приложения к HC-05(модулю Bluetooth) через сервис. Я знаю, что простой сервис не может быть живым в 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 amp;amp; 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 amp;amp; 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);
    }
}
 

Метод 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.

Комментарии:

1. Было бы полезно, если бы вы могли предоставить трассировку стека сбоя.

Ответ №1:

Android 10 имеет некоторые ограничения для реализации Bluetooth. Например, вам нужно разрешить некоторые разрешения, связанные с местоположением. Приведенный ниже текст взят со следующего веб-сайта:

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

Разрешения на местоположение Android 10

С появлением Android 10, помимо диалогового интерфейса, также изменился способ обработки разрешений на местоположение. Теперь пользователю разрешено выбирать, хотят ли они получать обновления местоположения, когда приложение находится в фоновом режиме. Для этого в файле манифеста необходимо объявить новое разрешение:

Вызов этого вместе с COARSE_LOCATION приведет к появлению диалогового окна с тремя вариантами:

1-Всегда разрешать 2-Разрешать только при использовании приложения 3-Запрещать

Так что проблема заключалась в следующем. Теперь, добавив эти разрешения, моя проблема решена.