2013-04-24 2 views
1

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

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

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

ответ

0

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

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; 
} 
} 

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

Смежные вопросы