#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-Запрещать
Так что проблема заключалась в следующем. Теперь, добавив эти разрешения, моя проблема решена.