Android O(OPP3.170518.006):更改系统设置时为什么会出现延迟?

时间:2017-06-29 14:48:03

标签: android-permissions android-8.0-oreo

我已经迁移了我的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)onStoponActivityResultonStartonResumeonPostResume的调用会返回false?

0 个答案:

没有答案