簡體   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