繁体   English   中英

Android:如何覆盖拨号程序的默认行为

[英]Android: How to override default behavior of dialer

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

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

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

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

这段代码来自我的虚拟应用程序。 实际应用中还有很多条件,仍然需要执行很多事情。 但是,实际上我需要的将以这种方式工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM