AccessibilityService请求权限遇空指针,如何正确传入Activity参数?
AccessibilityService请求SYSTEM_ALERT_WINDOW权限问题排查
问题场景
我参考示例在AccessibilityService中请求权限,代码如下:
class MyAccessibilityService : AccessibilityService() { override fun onServiceConnected() { when (ContextCompat.checkSelfPermission( this as Context, Manifest.permission.SYSTEM_ALERT_WINDOW )) { PackageManager.PERMISSION_GRANTED -> { Log.v(TAG, "SYSTEM_ALERT_WINDOW") } else -> { // 直接请求权限 requestPermissions( MainActivity(), arrayOf(Manifest.permission.SYSTEM_ALERT_WINDOW), 0 ) } } } }
报错信息
运行后触发空指针异常:
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.freedom.android.debug, PID: 2716 java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.PackageManager android.content.Context.getPackageManager()' on a null object reference at android.content.ContextWrapper.getPackageManager(ContextWrapper.java:98) at android.app.Activity.requestPermissions(Activity.java:5273) at androidx.core.app.ActivityCompat$Api23Impl.requestPermissions(ActivityCompat.java:850) at androidx.core.app.ActivityCompat.requestPermissions(ActivityCompat.java:520) at com.freedom.android.service.MyAccessibilityService.onServiceConnected(MyAccessibilityService.kt:215) at android.accessibilityservice.AccessibilityService.dispatchServiceConnected(AccessibilityService.java:501) at android.accessibilityservice.AccessibilityService.access$100(AccessibilityService.java:220) at android.accessibilityservice.AccessibilityService$2.onServiceConnected(AccessibilityService.java:1625) at android.accessibilityservice.AccessibilityService$IAccessibilityServiceClientWrapper.executeMessage(AccessibilityService.java:1852) at com.android.internal.os.HandlerCaller$MyHandler.handleMessage(HandlerCaller.java:44) at android.os.Handler.dispatchMessage(Handler.java:110) at android.os.Looper.loop(Looper.java:219) at android.app.ActivityThread.main(ActivityThread.java:8668) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)
疑问点
- 正确的Activity参数传入方式是什么?
- 这种场景下能不能使用MainActivity?
- 如果不能用MainActivity该怎么处理?
- 补充:当前使用Jetpack Compose,设备是Android 10。
尝试的初步方案(第一次编辑)
我创建了一个EmptyActivity:
class EmptyActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent{ Surface( // color = Color.Transparent ) { Text( fontSize = 50.sp, modifier = Modifier.padding(2.dp), text = "Hello World" ) } } // requestPermissions( // arrayOf(Manifest.permission.SYSTEM_ALERT_WINDOW), // 0 // ) } }
在AndroidManifest.xml中配置:
<activity android:name=".EmptyActivity"></activity>
然后在AccessibilityService中启动这个Activity:
startActivity(Intent(this, EmptyActivity::class.java).addFlags(FLAG_ACTIVITY_NEW_TASK))
内容的提问来源于stack exchange,提问作者SageJustus
相关产品推荐
相关产品推荐

