我已经迁移了我的Android应用程序尝试Android O(26)。
我已在Android Beta计划中注册了我支持的设备,我正在使用Google PIXEL XL(OPP3.170518.006)进行测试
我的应用程序中的功能需要"显示在其他应用程序上#34;。
流程如下: -
1)。用户尝试使用需要"显示在其他应用上的功能"并且它没有被授予。
2)。活动按如下方式请求权限: -
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, RC_PERMISSION_MANAGE_OVERLAY_PERMISSION);
3)。在onActivityResult
内我检查用户是否授予了权限并启动了我的相关流程。
这一系列事件在迁移到Android O之前一直运行良好。
我现在唯一能让它工作的方法是在onActivityResult()中使用一个带有postDelay 3秒的处理程序来启动我的关联进程。
如何立即检测授予的权限而不必等待3秒?
我开发了以下研究应用来说明这个问题
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_physical);
img = findViewById(R.id.spring_button);
img.setOnClickListener(this);
Log.d(TAG, "onCreate: " + Settings.canDrawOverlays(Physical.this));
}
@Override
public void onClick(View view) {
final Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, RC_PERMISSION_MANAGE_OVERLAY_PERMISSION);
}
@Override
protected void onPostCreate(@Nullable Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
Log.d(TAG, "onPostCreate: " + Settings.canDrawOverlays(Physical.this));
}
@Override
protected void onPostResume() {
super.onPostResume();
Log.d(TAG, "onPostResume: " + Settings.canDrawOverlays(Physical.this));
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart: " + Settings.canDrawOverlays(Physical.this));
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: " + Settings.canDrawOverlays(Physical.this));
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: " + Settings.canDrawOverlays(Physical.this));
}
@Override
public void onBackPressed() {
super.onBackPressed();
Log.d(TAG, "onBackPressed: " + Settings.canDrawOverlays(Physical.this));
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause: " + Settings.canDrawOverlays(Physical.this));
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.d(TAG, "onNewIntent: " + Settings.canDrawOverlays(Physical.this));
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: " + Settings.canDrawOverlays(Physical.this));
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case RC_PERMISSION_MANAGE_OVERLAY_PERMISSION:
Log.d(TAG, "onActivityResult: " + Settings.canDrawOverlays(Physical.this));
break;
}
}
Logcat输出如下: -
D/Physical: onCreate: true
D/Physical: onStart: true
D/Physical: onPostCreate: true
D/Physical: onResume: true
D/Physical: onPostResume: true
D/Physical: onPause: true
D/Physical: onStop: false
D/Physical: onActivityResult: false
D/Physical: onStart: false
D/Physical: onResume: false
D/Physical: onPostResume: false
我的申请已被授予" Display over other apps
"许可,例如与" Allow display over other apps
"相关联的切换开关这些日志生成的整个时间都是ON
。
那么为什么Settings.canDrawOverlays(Physical.this)
,onStop
,onActivityResult
,onStart
和onResume
对onPostResume
的调用会返回false?