蓝牙应用程序不能在运行在棒棒糖上的设备上工作

我做了一个蓝牙应用程序。 它在NougatMarshmallowJelly BeanKitKat运行良好,但出于KitKat原因,当Discoverbutton(发现所有可发现设备)被点击时,它会在Android Lollipop崩溃。

这里是点击Discoverbutton触发的方法 –

 private void discoverDevices() { Log.d(TAG, "btnDiscover: Looking for unpaired devices."); if(mBluetoothAdapter.isDiscovering()){ mBluetoothAdapter.cancelDiscovery(); Log.d(TAG, "btnDiscover: Canceling discovery."); //check BT permissions in manifest checkBTPermissions(); mBluetoothAdapter.startDiscovery(); IntentFilter discoverDevicesIntent = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mBroadcastReceiver3, discoverDevicesIntent); } if(!mBluetoothAdapter.isDiscovering()){ //check BT permissions in manifest checkBTPermissions(); mBluetoothAdapter.startDiscovery(); IntentFilter discoverDevicesIntent = new IntentFilter(BluetoothDevice.ACTION_FOUND); registerReceiver(mBroadcastReceiver3, discoverDevicesIntent); } } 

CheckBTPermissions() –

 private void checkBTPermissions() { if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP){ int permissionCheck = this.checkSelfPermission("Manifest.permission.ACCESS_FINE_LOCATION"); permissionCheck += this.checkSelfPermission("Manifest.permission.ACCESS_COARSE_LOCATION"); if (permissionCheck != 0) { this.requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 1001); //Any number } }else{ Log.d(TAG, "checkBTPermissions: No need to check permissions. SDK version =< LOLLIPOP."); } } 

Manifest文件中的权限 –

 <uses-feature android:name="android.hardware.bluetooth" /> <uses-permission android:name="android.permission.BLUETOOTH" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" /> 

build.gradle-

 apply plugin: 'com.android.application' android { compileSdkVersion 25 buildToolsVersion "25.0.0" defaultConfig { applicationId "com.example.hpi5.bluetooth" minSdkVersion 16 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:25.3.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' testCompile 'junit:junit:4.12' } 

我还没有在棒棒糖上testing过这个应用程序,因为我没有任何Android L上运行的设备。我知道我的一个朋友的崩溃。

编辑:我设法安排日志。

 07-07 19:29:00.219 30852-30852/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.hpi5.bluetooth, PID: 30852 java.lang.NoSuchMethodError: No virtual method checkSelfPermission(Ljava/lang/String;)I in class Lcom/example/hpi5/bluetooth/MainActivity; or its super classes (declaration of 'com.example.hpi5.bluetooth.MainActivity' appears in /data/app/com.example.hpi5.bluetooth-1/base.apk) at com.example.hpi5.bluetooth.MainActivity.checkBTPermissions(MainActivity.java:243) at com.example.hpi5.bluetooth.MainActivity.discoverDevices(MainActivity.java:230) at com.example.hpi5.bluetooth.MainActivity.access$100(MainActivity.java:24) at com.example.hpi5.bluetooth.MainActivity$7.onClick(MainActivity.java:189) at android.view.View.performClick(View.java:4923) at android.view.View$PerformClick.run(View.java:20341) at android.os.Handler.handleCallback(Handler.java:815) at android.os.Handler.dispatchMessage(Handler.java:104) at android.os.Looper.loop(Looper.java:194) at android.app.ActivityThread.main(ActivityThread.java:5717) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754) 

Related of "蓝牙应用程序不能在运行在棒棒糖上的设备上工作"

exception说明了这一点,checkSelfPermission方法只能在API 23以上版本中使用。 如果要使用API​​ 21检查权限,请使用Android支持库和ContextCompat.checkSelfPermission

编辑:此外,蓝牙的位置权限只需要API 23以上。

所以我安排了日志不知何故,甚至发现运行在棒棒糖设备下面的条件评估为真

 if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP){ //code here } 

正因为如此,该应用程序崩溃点击发现button。

所以,我只是改变了以上的情况 –

 if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){ } 

该应用程序现在正在棒棒糖设备上正常工作。

为什么早些时候在棒棒糖设备上崩溃?

所以,我的朋友的设备运行在Android 5.1.1版本,这就是为什么条件评估为真。 而且由于checkSelfPermission是在API级别23(Android M)中引入的,所以应用程序找不到它并因此崩溃。

在API 23中添加了运行时权限系统,因此您不应该检查该API下的权限。 logcat告诉你它找不到API 21中不存在的方法。