Android – Фильтр намерений?

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

Я хочу предоставить пользователю возможность выбрать мое приложение, когда он хочет отправить 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>

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

ИЗМЕНИТЬ:

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

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

для смс-сообщения, но что мне использовать для исходящего звонка?

РЕДАКТИРОВАТЬ 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:

альтернативный текст

Поэтому я хочу того же, когда нажимаю «Позвонить на мобильный».


person Donal Rafferty    schedule 01.11.2010    source источник


Ответы (4)


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

<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

person Konrad    schedule 26.11.2010
comment
Кто-нибудь замечал, что это не работает на телефонах HTC? Я добавил тот же фильтр намерений к своей активности, и он работает на некоторых телефонах, но в HTC Incredible моя активность никогда не представляется как вариант для выполнения намерения. - person E-Riz; 20.09.2011

Это связано с тем, что действия и службы не могут сами по себе улавливать внешние намерения. Вам нужно использовать 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.

person AndrewKS    schedule 01.11.2010
comment
Я не думаю, что это правильный способ для меня достичь того, чего я хочу, я хочу зарегистрироваться для намерений SEND и DIAL, отправленных из системы, у меня есть SEND, работающий, как указано выше, когда я нажимаю на текст отправки. Завершить действие с помощью диалогового окна появляется именно то, что я хочу, мне просто нужно иметь возможность сделать то же самое, когда я нажимаю на вызов контакта. - person Donal Rafferty; 01.11.2010
comment
Ах, тогда, возможно, вам нужно указать определенные разрешения, для которых вы хотите, чтобы вашей программе было разрешено использовать. Посмотрите developer.android.com/reference/android/. Я считаю, что вам нужно использовать разрешение CALL_PHONE. - person AndrewKS; 01.11.2010
comment
Да, у меня это тоже есть - ‹uses-permission android:name=android.permission.CALL_PHONE/> Не могу понять, почему оно вообще не работает. - person Donal Rafferty; 01.11.2010

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

   <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>
person Sanda    schedule 22.02.2012

Вам нужно добавить приоритет в фильтр намерений, чтобы 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>
person Rabi    schedule 19.07.2011