1

我正在对以前的项目进行修改,该项目基本上是为儿童和青少年开发的。text messaging, emails, calls and internet当用户以大于 16 MPH 的速度行驶时,它会阻塞。该服务通过 激活SMS。由于该应用程序不适用于Android v4.1及更高版本,因此需要进行修改。我在PlayStore名为Safely Go上看到了一个应用程序。这个应用程序有一个点击按钮,状态更改为驾驶。在这种模式下,如果用户单击拨号器、消息传递、设置或浏览器,则会打开他们自己的活动,而不是默认行为。简而言之,在这种模式下,除了用户在驾驶期间选择使用的那些应用程序之外,用户无法访问任何东西。

根据我的要求,该服务将通过SMS. 一旦服务被激活,并且用户的速度达到超过 16 MPH,我希望当用户点击时Dialer,我的活动应该打开,它会显示一条警告消息,而不是打开拨号盘。我不知道如何完成此功能。由于服务与用户没有直接交互,因此android系统无法捕获服务中的关键事件。或者,有没有其他方法可以做到这一点。

我只是想知道如何覆盖默认行为拨号程序。如果有人有任何信息,请分享,因为这对我有很大帮助。

4

1 回答 1

0

在我在问题中提到的应用程序中,没有覆盖默认行为。那是我的错误,我采取了错误的方式。使用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;
}
}

此代码来自我的虚拟应用程序。实际应用中有很多条件,还有很多事情需要实现。但是,我实际上需要的东西会以这种方式工作。

于 2013-04-30T11:00:36.530 回答