Android: как переопределить поведение звонилки по умолчанию

Я делаю модификации в предыдущем проекте, который в основном разработан для детей и подростков. Это блокирует text messaging, emails, calls and internet когда пользователь едет со скоростью более 16 миль в час. Сервис активируется через SMS, Требуется изменение, так как приложение не работает на Android v4.1 и выше. Я видел приложение на PlayStore названный Safely Go. Это приложение имеет кнопку, при нажатии которой статус меняется на вождение. В этом режиме, если пользователь нажимает на номеронабиратель, сообщения, настройки или браузер, вместо его поведения по умолчанию открывается его собственная активность. Короче говоря, в этом режиме пользователь не может получить доступ ни к чему, кроме тех приложений, которые пользователь выбрал для использования во время вождения.

Согласно моему требованию, услуга будет активирована через SMS, Как только служба активируется, и скорость пользователя достигает более 16 миль в час, я хочу, чтобы, когда пользователь нажимает на Dialer, моя активность должна открыться, которая будет показывать предупреждающее сообщение, вместо открытия клавиатуры набора номера. Я не понимаю, как я могу выполнить эту функцию. Поскольку сервис не имеет прямого взаимодействия с пользователем, система Android не может отловить ключевое событие в сервисе. Или есть ли другой способ сделать это.

Я просто хочу знать, как я могу переопределить поведение по умолчанию номеронабирателя. Если у кого-то есть какая-либо информация, пожалуйста, поделитесь, так как это было бы очень полезно для меня.

1 ответ

Решение

В приложении, которое я упоминал в своем вопросе, поведение по умолчанию не было переопределено. Это была моя ошибка, я понял это неправильно. Та же функциональность может быть достигнута с помощью Handler. В моем приложении я использовал сервис, который запускается по нажатию кнопки. Внутри службы я использовал хендлер. Ниже я выкладываю фрагмент кода.

public class DialerService extends Service {
ActivityManager am;
List<RunningAppProcessInfo> mAppProcessInfosList;
private Runnable myRunnable;
boolean threadDone = true;
Handler mHandler;
boolean isLockedAppRunning = false;

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

public void onCreate() {
    am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    mAppProcessInfosList = new ArrayList<ActivityManager.RunningAppProcessInfo>();
    mHandler = new Handler();
    Log.v("Dialer Service", "onCreate called");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    myRunnable = new Runnable() {

        @Override
        public void run() {
            isRestrictedAppRunning();
        }
    };

    new Thread(new Runnable() {
        public void run() {
            while (threadDone) {

                try {
                    mHandler.post(myRunnable);
                } catch (Exception e) {

                }
            }
        }
    }).start();
    return START_STICKY;
}

private void isRestrictedAppRunning() {
    mAppProcessInfosList = am.getRunningAppProcesses();
    for (int i = 0; i < mAppProcessInfosList.size(); i++) {
        if (mAppProcessInfosList.get(i).processName
                .equals("com.android.phone")
                || mAppProcessInfosList.get(i).processName
                        .equals("com.android.email")
                || mAppProcessInfosList.get(i).processName
                        .equals("com.android.mms")) {
            isLockedAppRunning = true;
            Intent dialogIntent = new Intent(getBaseContext(),
                    TestActivity.class);
            dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            getApplication().startActivity(dialogIntent);
        }
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    this.threadDone = false;
}
}

Этот код взят из моего фиктивного приложения. В реальном приложении намного больше условий, но многое еще нужно реализовать. Но то, что мне нужно, на самом деле будет работать таким образом.

Другие вопросы по тегам