Prefacio
Recientemente encontrado una paradoja del problema, el desarrollo de la aplicación en la gloria de Huawei V20 encontró imposible escanear las pruebas de dispositivos Bluetooth. El sistema de teléfono móvil Bluetooth se puede escanear. Interrumpió la depuración y descubrió que su devolución de llamada de escaneo no se ejecutó ... Los intentos repetidos fallaron.
Al principio pensé que era un problema específico de este modelo, y luego lo vi accidentalmente Android10
. Este es también el único teléfono móvil actualmente disponible para pruebas, considerando el Android cada vez más subdividido y el estricto control de permisos. Abrí el cambio de privacidad y finalmente me liberé. Android 10
la razón
Las funciones de Bluetooth son las siguientes, puede encontrar que se requieren escaneos comunes ...
Solución
Modificar la versión de destino
解决不了问题,就解决提出问题的人。
Dado que es la subdivisión de permisos provocada por la actualización de la versión, entonces la modificamos directamente build.gradle
y la cambiamos targetSdkVersion
a 27, y el problema está resuelto.
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.felicitysolar_debug"
minSdkVersion 21
targetSdkVersion 29
versionCode 2
versionName "3.6"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
lintOptions {
checkReleaseBuilds false
abortOnError false
}
}
Por supuesto, ¡esto es obviamente una inclinación hacia adelante!
Solicite un permiso de posicionamiento preciso
Aquí viene el enfoque ortodoxo:
Primero, debe AndroidManifest.xml
agregar los siguientes permisos:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
Además, debe solicitar permisos dinámicamente. Aquí hay una muestra de Huawei:
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
Log.i(TAG, "sdk < 28 Q");
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
String[] strings =
{
Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION};
ActivityCompat.requestPermissions(this, strings, 1);
}
} else {
if (ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED
|| ActivityCompat.checkSelfPermission(this,
"android.permission.ACCESS_BACKGROUND_LOCATION") != PackageManager.PERMISSION_GRANTED) {
String[] strings = {
android.Manifest.permission.ACCESS_FINE_LOCATION,
android.Manifest.permission.ACCESS_COARSE_LOCATION,
"android.permission.ACCESS_BACKGROUND_LOCATION"};
ActivityCompat.requestPermissions(this, strings, 2);
}
}
Dado que no hay forma de forzar la activación del posicionamiento GPS, aquí hay un recordatorio suave:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P){
LocationManager alm = (LocationManager)BLEActivity.this.getSystemService(Context.LOCATION_SERVICE);
if (!alm.isProviderEnabled(android.location.LocationManager.GPS_PROVIDER)){
Toast.makeText(this, "请开启GPS!", Toast.LENGTH_SHORT).show();
}
}
Un conjunto de golpes combinados cae y el problema se resuelve.