Android 10:如何从Android系统通知中检测用户是否接受/拒绝了CHANGE_WIFI_STATE权限?

Ber*_*tel 5 android android-wifi kotlin android-permissions android-10.0

我正在Android 10 上使用此文档参考addNetworkSuggestions自动连接到现有 Wifi 接入点。

\n

我正在使用以下代码:

\n
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager;\n\nval status = wifiManager.addNetworkSuggestions(suggestionsList);\nif (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0// do error handling here\n}\n\n// Optional (Wait for post connection broadcast to one of your suggestions)val intentFilter = IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION);\n\nval broadcastReceiver = object : BroadcastReceiver() {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0override fun onReceive(context: Context, intent: Intent) {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0if (!intent.action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0return;\n        }\n        // do post connect processing here\n    }\n};\ncontext.registerReceiver(broadcastReceiver, intentFilter);\n
Run Code Online (Sandbox Code Playgroud)\n

我使用的是 Android 10 设备,并且收到一条通知,邀请用户允许或不允许该权限:

\n

安卓权限通知

\n

根据文档,这是 Android 10 上的正确行为:

\n
\n

在 Android 11(API 级别 30)及更高版本上,如果应用程序在前台运行,用户会看到一个对话框;如果应用程序在后台运行,用户会看到一条通知。

\n
\n
\n

在 Android 10(API 级别 29)上,无论应用程序是在前台还是后台运行,用户都会看到通知。

\n
\n

如果权限尚未被接受,我想显示一些文本邀请用户接受权限通知。但如果用户已经接受了权限通知,我会隐藏此文本。

\n

问题是:如何在Android系统通知中检测用户是否接受/拒绝了权限?

\n

我已尝试以下操作:

\n
    \n
  • 我已经检查了wifiManager.addNetworkSuggestions方法的结果,但STATUS_NETWORK_SUGGESTIONS_SUCCESS即使尚未授予权限,它也会返回。
  • \n
\n
val status = wifiManager.addNetworkSuggestions(suggestionsList);\nif (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {\n    // this is not triggered even though the user didn\'t accept the permission notification\n}\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • ActivityCompat.checkSelfPermission
  • \n
\n
ActivityCompat.checkSelfPermission(this, Manifest.permission.CHANGE_WIFI_STATE)\n
Run Code Online (Sandbox Code Playgroud)\n

但它总会回归true

\n
    \n
  • AppOpsManager.unsafeCheckOp
  • \n
\n

这个问题

\n
appOpsManager.unsafeCheckOp("android:change_wifi_state", Process.myUid(), applicationContext.packageName) == AppOpsManager.MODE_ALLOWED\n
Run Code Online (Sandbox Code Playgroud)\n

true即使尚未接受/拒绝许可,它也会返回。但当false用户拒绝权限时它会返回。\n这只适用于用户拒绝 Android 权限通知的情况。

\n
    \n
  • 根据德斯蒙德的建议,我尝试requestPermissions使用Manifest.permission.CHANGE_WIFI_STATE. 我正确地收到了该PackageManager.PERMISSION_GRANTED值。但我不断收到通知许可。
  • \n
\n
\n

我在清单中拥有以下权限:

\n
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />\n<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />\n
Run Code Online (Sandbox Code Playgroud)\n