как использовать android.intent.action.CALL_PRIVILEGED и android.intent.action.NEW_OUTGOING_CALL? - PullRequest
3 голосов
/ 25 ноября 2011

Я не могу найти документацию для:

android.intent.action.CALL_PRIVILEGED

Я видел, что она используется, например, в csipsimple для обработки вызова.

Я хотел бы лучше понять, как использоватьЭто.Например: каковы отношения между android.intent.action.CALL_PRIVILEGED и android.intent.action.NEW_OUTGOING_CALL?

Я добавил:

         <intent-filter>
             <action android:name="android.intent.action.CALL_PRIVILEGED" />
             <category android:name="android.intent.category.DEFAULT" />
             <data android:scheme="tel" />
         </intent-filter>

в AndroidManifest для моего проекта.Когда вызов начинается с родного номеронабирателя, моя деятельность вызывается, но если в onResume я выполняю getIntent (). GetAction (), то результат равен нулю

EDIT

Я заставил его работать как с onNewIntent, так и с onCreate.OnResume получает намерение без действия (отправляемое по умолчанию обработчиком onNewIntent, я полагаю).

Проблема состоит в том, что для проверки, является ли действие CALL_PRIVILEGED, мне пришлось жестко кодировать строку "android.intent.action.CALL_PRIVILEGED ", потому что действие CALL_PRIVILEGED скрыто.

Я попытался зарегистрировать действие только для ACTION_CALL, и оно не сработало

Ответы [ 3 ]

11 голосов
/ 08 декабря 2011

Намерение с действием android.intent.action.CALL_PRIVILEGED вызывается при выполнении вызова из телефонной книги следующим образом: Телефонная книга-> Контакт-> Длинный Клик по номеру телефона -> Выберите сделать вызов из выпадающего меню. Следующий код должен быть в Манифесте:

<activity>
  <intent-filter>
    <action android:name="android.intent.action.CALL_PRIVILEGED" />
    <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>
</activity>

Для HTC есть некоторые изменения:

<activity>
  <intent-filter>
    <action android:name="android.intent.action.CALL_PRIVILEGED" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="vnd.android.cursor.item/phone" />
    <data android:mimeType="vnd.android.cursor.item/phone_v2" />
    <data android:mimeType="vnd.android.cursor.item/person" />
  </intent-filter>
</activity>

Когда этот код добавляется в Manifest и вы пытаетесь выполнить вызов, как описано выше, вы можете получить Application Chooser и таким образом перехватить вызов и продолжить выполнение вызова выбранным приложением.

Что касается android.intent.action.NEW_OUTGOING_CALL , который используется в BroadcastReceivers, когда вы хотите получить уведомление об исходящем звонке. Например, если вы хотите, чтобы вы поместили следующий код в Manifest:

<receiver android:name=".CallReceiver"> 
  <intent-filter> 
    <action android:name="android.intent.action.NEW_OUTGOING_CALL" /> 
  </intent-filter> 
</receiver>

и создайте:

public class CallReceiver extends BroadcastReceiver{
    private static final String TAG = "Call_Receiver";

    @Override
    public void onReceive(Context context, Intent intent) {

        Bundle bundle = intent.getExtras();
        //Notification there
        ....
        }
}

Используя это, вы будете получать уведомления все время, когда исходящий звонок происходит.

Основное различие между этими пунктами, которые первыми перехватывают намерение, а вторые только получают результат, который что-то случилось.

4 голосов
/ 20 декабря 2011

Вы не можете использовать это намерение. Он имеет особый уровень защиты, который позволяет выбирать приложения только для его выдачи. Более подробная информация здесь: http://code.google.com/p/android/issues/detail?id=10344 Это намерение и многие другие недоступны для сторонних приложений, но вы можете использовать их другими способами.

Например, вы можете поймать их. Но если вы не будете осторожны, это будет означать, что никакие вызовы не могут быть начаты с приложением Android Dialer по умолчанию, так как большинство из них используют это намерение. Если вы поймаете это, вы можете переслать его как простое намерение ACTION_CALL, которое будет работать.

3 голосов
/ 28 января 2012

В ответе Николая Никифорчука уже указано, но, возможно, явно не подчеркнуто, что разница в том, что если вы обрабатываете только CALL_PRIVILEGED, ваше приложение будет указано в качестве опции для начала вызова. Поэтому перед началом вызова платформа спросит пользователя, какое приложение следует использовать для выполнения операции.

Если вы обрабатываете только NEW_OUTGOING_CALL, фреймворк будет использовать стандартную звонилку, но набранный номер будет передан получателю вашего приложения, который сможет сбросить вызов и обработать его, либо изменить номер телефона и затем передать его через другой зарегистрированный получатель.

...