首页 > 解决方案 > 在导航出设置时检测

问题描述

我正在开发具有辅助功能要求的应用程序。在我的 MainActivity 的 onCreate() 方法中,我每 10 秒调用一次服务检查可访问性是否打开,如果不是,它会发送到 Settings.ACTION_ACCESSIBILITY_SETTINGS 以请求启用。

问题是我需要找到一种方法(关闭辅助功能设置)来了解用户是否已导航出设置页面(例如按主页或返回按钮等),因为当您正要单击时这很烦人ON 按钮它会将您带回一般可访问性页面。

如果用户导航出去,我认为它可以在 onPause() 中完成,但我不知道如何覆盖设置的意图。

这是每 10 秒重复一次的整个课程:

public class AccessibilityWatcher extends Service {
    private static final Intent sSettingsIntent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
    private AlarmManager alarmMgr;
    private AlarmReciever alarmReciever;
    private PendingIntent pendingIntent;
    private int AccessibilityCheckPeriod = 10000; //in miliseconds

    public void onCreate() {
        Log.d("tag", "Accessibility Watcher Created.");
        sSettingsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        sSettingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        sSettingsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

        goToSettings(sSettingsIntent);

        //Setup alarm...
        alarmReciever = new AlarmReciever();
        IntentFilter filter = new IntentFilter("fire");
        registerReceiver(alarmReciever, filter);
        Intent dialogIntent = new Intent("fire");
        alarmMgr = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
        pendingIntent = PendingIntent.getBroadcast(this, 0, dialogIntent, PendingIntent.FLAG_CANCEL_CURRENT);
        Calendar time = Calendar.getInstance();
        Calendar cal_now = Calendar.getInstance();
        Date date = new Date();
        time.setTime(date);
        cal_now.setTime(date);
        alarmMgr.setExact(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);
        Log.d("Alarm","Alarm set to " + time.getTimeInMillis());
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }


    public void goToSettings(Intent sSettingsIntent) {
        Log.d("tag", "Send them to settings and display Toast!");
        Toast.makeText(getApplicationContext(), "Enable access for '" + MainActivity.appName + "'", Toast.LENGTH_LONG).show();
        startActivity(sSettingsIntent);
    }

    //Alarm recevier get and set new Time
    class AlarmReciever extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {

            Log.d("CheckIntent", sSettingsIntent.toString());

            if(!AccessibilityS.isEnabled) {
                //Not Enabled  - Set alarm and send to Settings
                Calendar time = Calendar.getInstance();
                Calendar cal_now = Calendar.getInstance();
                Date date = new Date();
                time.setTime(date);
                cal_now.setTime(date);
                time.set(Calendar.MILLISECOND, AccessibilityCheckPeriod);  //Delay 10 seconds
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);
                } else {
                    alarmMgr.setExact(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), pendingIntent);
                }
                Log.d("Alarm", "New alarm set: " + time.getTimeInMillis());
                Log.i("Accessibility", "Checking permissions.... Result isEnabled is:" + AccessibilityS.isEnabled);
                sSettingsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                sSettingsIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                sSettingsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                goToSettings(sSettingsIntent);
            }
        }
    }

}

标签: android

解决方案


推荐阅读