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;
}
}
Этот код взят из моего фиктивного приложения. В реальном приложении намного больше условий, но многое еще нужно реализовать. Но то, что мне нужно, на самом деле будет работать таким образом.