我正在尝试使用ActivityResultLauncher#launch()
函数在Android程序中请求运行时用户权限。它应该创建一个权限对话框,请求用户授予所请求的权限。但在我的程序中,对话不到半秒就消失了。你能指出我错在哪里吗?
我使用以下代码片段在主Activity中请求权限:
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.BLUETOOTH_SCAN) != PackageManager.PERMISSION_GRANTED) {
Log.i(TAG, "Bluetooth scan permission denied. Requesting...");
requestPermissionLauncher.launch(Manifest.permission.BLUETOOTH_SCAN);
Log.i(TAG, "Permission requested. Awaiting user response");
return;
}
requestPermissionLauncher
在练习中定义为fallows:
private ActivityResultLauncher<String> requestPermissionLauncher =
registerForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> {
if (isGranted) {
Log.i(TAG, "Requested permission granted!");
scanLeDevice();
} else {
Log.e(TAG, "Requested permission denied!");
Toast.makeText(this, "Permission denied! Sorry, we can't continue.", Toast.LENGTH_LONG);
}
});
某些选定的Logcat消息将作为fallows:
---------------------------- PROCESS STARTED (4871) for package com.example.ble_imu_data_viewer ----------------------------
...
2023-06-11 19:57:01.623 4871-4871 important_info com.example.ble_imu_data_viewer I Bluetooth scan permission denied. Requesting...
2023-06-11 19:57:01.648 4871-4871 important_info com.example.ble_imu_data_viewer I Permission requested. Awaiting user response
2023-06-11 19:57:01.709 4871-4871 ActivityThread com.example.ble_imu_data_viewer D add activity client record, r= ActivityRecord{af555b6 token=android.os.BinderProxy@5980385 {com.example.ble_imu_data_viewer/com.example.ble_imu_data_viewer.MainActivity}} token= android.os.BinderProxy@5980385
2023-06-11 19:57:01.720 4871-4871 ZrHung.AppEyeUiProbe com.example.ble_imu_data_viewer D notify runnable to start.
2023-06-11 19:57:01.737 4871-4871 OpenGLRenderer com.example.ble_imu_data_viewer D Skia GL Pipeline
2023-06-11 19:57:01.750 4871-4871 HwAppInnerBoostImpl com.example.ble_imu_data_viewer D set config for com.example.ble_imu_data_viewer BOOST_FLAG=false REPORT_DURATION_CLICK=1000 REPORT_TIMES_CLICK=3 REPORT_DURATION_SLIDE=5000 REPORT_TIMES_SLIDE=16
2023-06-11 19:57:01.753 4871-4871 OpenGLRenderer com.example.ble_imu_data_viewer D HWUI Binary is enabled
2023-06-11 19:57:01.753 4871-4871 OpenGLRenderer com.example.ble_imu_data_viewer D disableOutlineDraw is true
2023-06-11 19:57:01.792 1263-1506 HiDATA_HiNetwork system_server E monitor handleActivityChange curPkgName is com.example.ble_imu_data_viewer curUid is 10174 lastPkgName is :com.huawei.android.launcher
2023-06-11 19:57:01.796 4871-4871 ZrHung.AppEyeUiProbe com.example.ble_imu_data_viewer D stop checker.
2023-06-11 19:57:01.802 1263-1506 HiDATA_HiNetwork system_server E onAppStart packageName is com.example.ble_imu_data_viewer
2023-06-11 19:57:01.803 1263-1506 HiDATA_HiNetwork system_server E contain db file packageName: com.example.ble_imu_data_viewer iscanacce:-1
2023-06-11 19:57:01.806 1730-10535 DollieAdapterService com.huawei.systemserver E notifyActivityState pkg:com.example.ble_imu_data_viewer/com.example.ble_imu_data_viewer.MainActivity state:2 fg:true mUid:10174
...
2023-06-11 19:57:11.906 4871-4871 important_info com.example.ble_imu_data_viewer E Requested permission denied!
2023-06-11 19:57:11.919 4871-4871 ZrHung.AppEyeUiProbe com.example.ble_imu_data_viewer D notify runnable to start.
2023-06-11 19:57:11.936 4871-4871 InputMethodManager com.example.ble_imu_data_viewer W startInputReason = 1
2023-06-11 19:57:11.937 1263-1506 HiDATA_HiNetwork system_server E monitor handleActivityChange curPkgName is com.example.ble_imu_data_viewer curUid is 10174 lastPkgName is :com.example.ble_imu_data_viewer
2023-06-11 19:57:11.938 1730-10535 DollieAdapterService com.huawei.systemserver E notifyActivityState pkg:com.example.ble_imu_data_viewer/com.example.ble_imu_data_viewer.MainActivity state:2 fg:true mUid:10174
...
我已经通过在Manifest文件中声明了所请求的权限BLUETOOTH_SCAN
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" tools:remove="android:maxSdkVersion"/>
完整的源代码和完整的Logcat内容如下:
AndroidManifest.xml
MainActivity.java
build.gradle
Complete Logcat content
1条答案
按热度按时间zazmityj1#
我最终自己解决了这个问题。
虽然我在清单文件中声明了BLUETOOTH_SCAN和BLUETOOTH_CONNECT权限,但它们不是在我的上下文中询问的正确权限。这两个权限只适用于Android 12(API级别31)或更高版本,但我的应用运行在Android 9(API级别28)上。对于等于或低于11(API级别30)的Android版本,应用需要在运行时请求ACCESS_FINE_LOCATION(对于API级别28或更低级别,则为ACCESS_COARSE_LOCATION)权限。
有关更多详细(重要)信息,请参阅Bluetooth permissions | Android Developers