Как прервать вызов и закрыть номеронабиратель после запуска моей активности?

Насколько я помню, защита от кражи Avast позволяет вам установить «секретный пин-код», который вы можете набрать, чтобы открыть пользовательский интерфейс. Что происходит, когда я набираю его, так это то, что вызов не проходит, затем номеронабиратель немедленно закрывается и открывается пользовательский интерфейс (или пользовательский интерфейс выходит за пределы действия номеронабирателя. Я забыл).

Я как-то реализовал это, но вместо прерывания вызова он уходит в фон (зеленая строка состояния, звонит телефон и т. д.), а моя активность идет впереди него.

Как прервать вызов, открывая свою собственную активность, когда я набираю определенный номер?

Некоторый код в моем подходе:

Широковещательный приемник для звонков:

public class OutgoingCallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {

        // Match if action is outgoing call.

            Intent i = new Intent();
            i.setAction(HelperClass.ACTION_NEW_OUTGOINGCALL);
            i.setClassName(HelperClass.PACKAGE_NAME, HelperClass.CLASS_NAME_OUTGOING);
            i.putExtra(HelperClass.CONTACT_KEY, "contact");
            i.putExtra(HelperClass.CLIENT_DEVICE_KEY, "DUMMY");
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            startActivity(i);

            // Apparently, this doesn't work
            abortBroadcast();





// --------------- FAILED ATTEMPT ---------------------

//        if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {
//            TelephonyManager tm = (TelephonyManager) context
//                    .getSystemService(Context.TELEPHONY_SERVICE);
//            try {
//                // Java reflection to gain access to TelephonyManager's
//                // ITelephony getter
//                Log.v(HelperClass.TAG, "Get getTeleService...");
//                Class c = Class.forName(tm.getClass().getName());
//                Method m = c.getDeclaredMethod("getITelephony");
//                m.setAccessible(true);
//                com.android.internal.telephony.ITelephony telephonyService =
//                        (ITelephony) m.invoke(tm);
//            } catch (Exception e) {
//                e.printStackTrace();
//                Log.e(TAG,
//                        "FATAL ERROR: could not connect to telephony subsystem");
//                Log.e(TAG, "Exception object: " + e);
//            }
        }
    }
}

Неудачная попытка: ITelephony не найден. Неудачная попытка исходила из https://stackoverflow.com/a/5314372/3979290.

ОБНОВЛЕНИЕ: Пытался реализовать, не удалось. Не знаете, как реализовать: Как повесить исходящий вызов в Android?

Также просмотрено: Как прервать исходящий вызов после фиксированного количества секунд?


person Aloha    schedule 24.05.2016    source источник


Ответы (1)


Обновление: добавление setResultData(null); к широковещательному приемнику сработало. Тут же закончился звонок.

Образец:

public class OutgoingCallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Immediately cancels the call since this sets the number to null.
        setResultData(null);

        // Launch activity here/other stuff you want to do
        // Example:
        //     Intent i = new Intent(context, MyActivity.class);
        //     i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //     context.startActivity(i);
    }
}

Манифест:

...
        <receiver
            android:name=".OutgoingCallReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter android:priority="2147483647">
                <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
            </intent-filter>
        </receiver>
...
person Aloha    schedule 24.05.2016