Android - Intent Filter?

Я пытаюсь зарегистрировать свою активность, чтобы ее можно было использовать с помощью выбора/выбора для действий, позволяющего пользователю выбирать, выбирать ли мое приложение/действие для выполнения того, что они пытаются сделать.

Я хочу предоставить пользователю возможность выбрать мое приложение, когда они захотят отправить SMS-сообщение, и когда они захотят разместить исходящий звонок, чтобы попытаться это сделать, я добавил следующие фрагменты кода внутри мои теги активности в моем манифесте:

<intent-filter>
<action android:name="android.intent.action.SENDTO" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>

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

Однако выбор активности не появляется и собственные приложения используются без выбора пользователя. Может ли кто-нибудь увидеть, где я ошибаюсь?

EDIT:

Я понял, что мне нужно добавить

<data android:scheme="sms" />
<data android:scheme="smsto" />

для SMS-сообщения, но что я использую для исходящего вызова?

ИЗМЕНИТЬ 2:

Я попробовал следующее для исходящего вызова:

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

Но опять же, не повезло, было ли это заблокировано с 1.6 на?

Изменить 3:

Это то, что происходит, когда я нажимаю Text Mobile:

alt text

Итак, я хочу то же самое, когда я нажимаю Call mobile

Ответы

Ответ 1

Я думаю, это должно помочь вам

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

Протестировано на Android 2.1

Ответ 2

Это связано с тем, что действия и услуги не могут самостоятельно захватывать собственные намерения. Вам нужно использовать BroadcastReceiver. Чтобы реализовать это, сделайте следующее:

Расширьте класс Android BroadcastReceiver следующим образом:

public class MyReceiver extends BroadcastReceiver {

 @Override
 public void onReceive(Context context, Intent intent) {
        Context context = getApplicationContext();
  Intent sendIntent = new Intent();
  if ( intent.getAction().equals(Intent.NEW_OUTGOING_CALL) ) {
   sendIntent.setClass(context, MyActivity.class);
   context.startActivity(sendIntent);
  }
        else if ( intent.getAction().equals(Intent.SOME_OTHER_INTENT) {
            sendIntent.setClass(context, MyService.class);
   context.startService(sendIntent);
        }
        // More else ifs for more intents you want to catch.
 }

}

Затем вам нужно объявить получателя в своем манифесте следующим образом:

<receiver android:name="MyReceiver">
  <intent-filter>
    <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
        // more intents you want to catch here
  </intent-filter>
</receiver>

Только намерения, объявленные в манифесте, будут пойманы вашим ресивером, поэтому, если вы хотите поймать несколько намерений, брошенных системой или другими программами, и хотите сделать то же самое, когда их намерения пойманы, тогда укажите эти намерения здесь манифест и пропустить блоки if/else в методе onReceive.

Ответ 3

это сработало для меня

   <activity
        android:label="@string/app_name"
        android:name=".TestIntentActivity" >            
      <intent-filter> 
         <action android:name="android.intent.action.CALL" />
         <category android:name="android.intent.category.DEFAULT" />
         <action android:name="android.intent.action.CALL_PRIVILEGED" />
         <data android:scheme="tel" />
      </intent-filter>
    </activity>

Ответ 4

Вам нужно добавить приоритет в фильтр намерений, чтобы Android учитывал его. Например:

 <activity android:name="YourActivity">
   <intent-filter android:priority="100">
      <action android:name="android.intent.action.CALL_PRIVILEGED" />
      <category android:name="android.intent.category.DEFAULT" />
      <data android:mimeType="text/plain" />
   </intent-filter>
 </activity>