how to use android.intent.action.CALL_PRIVILEGED a

2020-01-29 17:12发布

问题:

I can't find the documentation for:

android.intent.action.CALL_PRIVILEGED

I saw it is used for example in csipsimple to handle the call.

I would like to better understand how to use it. For example: what's the relationship between android.intent.action.CALL_PRIVILEGED and android.intent.action.NEW_OUTGOING_CALL?

I added:

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

in the AndroidManifest for my project. When a call is start from the native dialer, my activity is called but if in the onResume I do getIntent().getAction() the result is null

EDIT

I made it working handling the onNewIntent as well as onCreate. The onResume receives an intent without an action (sent by the default onNewIntent handler I suppose).

The problem is that to check whether the action is CALL_PRIVILEGED I had to hard-code the string "android.intent.action.CALL_PRIVILEGED" because the action CALL_PRIVILEGED is hidden.

I tried to register the activity for ACTION_CALL only and it did not work

回答1:

Intent with action android.intent.action.CALL_PRIVILEGED is called when you making a call from phonebook using following way: Phone Book->Contact->Long Click on the phonenumber -> Choose make call from dropdown menu. Following code should be place in Manifest:

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

For HTC some changes there:

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

When this code is added to Manifest and you try to make call as described above you can get Application Chooser and this way to intercept the call and continue making call by the choosen application.

As for android.intent.action.NEW_OUTGOING_CALL it used in BroadcastReceivers, when you want to get notification about outgoing call. For example if you want to to that you should put following cod to Manifest:

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

and create:

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
        ....
        }
}

Using this will you get notification all times when outgoing call happend.

The main difference beеween this items that first intercept intent and second only get a result that something happend.



回答2:

You cannot use that intent. It has a special protection level that allows only select applications to issue it. More info here: http://code.google.com/p/android/issues/detail?id=10344 That intent and many others are not available to third party apps, but you can harness them in other ways.

For example, you can catch them. But if you are not careful, this will mean that no calls can be started with the default Android Dialer application as most of those use this intent. If you catch it, you can forward it as a simple ACTION_CALL intent, that will work.



回答3:

It is already stated in Nikolay Nikiforchuk's answer but maybe not explicitly underlined that the difference is that if you handle only CALL_PRIVILEGED your application will be listed as an option to start the call. So before starting the call the framework will ask the user which application should be used to perform the operation.

If you handle only NEW_OUTGOING_CALL the framework will use the standard dialler but the dialled number will be passed to your application broadcast receiver that will have a chance to drop the call and handle it or to modify the phone number and than pass it through the other registered receiver.