2010-11-01 3 views
13

Я пытаюсь зарегистрировать свою деятельность так, чтобы ее можно было использовать в Chooser/picker Activity, позволяя пользователю выбирать, выбирать ли мое приложение/действие, чтобы выполнить то, что они пытаются сделать.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, но то, что я могу использовать для исходящего вызова?

EDIT 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 на?

Edit 3:

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

alt text

Так я хочу то же самое, когда я нажимаю Позвони с мобильного

ответ

9

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

<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

+1

Кто-нибудь заметил, что это не работает на телефонах HTC? Я добавил тот же фильтр намерений в свою деятельность, и он работает на некоторых телефонах, но на HTC Incredible моя деятельность никогда не представляется как выбор для завершения намерения. –

3

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

Расширение класса BroadcastReceiver Android, как так:

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/Остальные блоки в методе onReceive.

+1

Я не думаю, что это правильный путь для меня, чтобы достичь того, чего я хочу, я хочу, чтобы зарегистрироваться для отправки и ДИАЛ намерений, посланные из системы , У меня есть SEND, работающий, как указано выше, когда я нажимаю на текст отправки, появляется диалоговое окно «Полное действие с использованием», которое именно то, что я хочу, мне просто нужно сделать то же самое, когда я нажимаю на контакт. –

+2

А может быть, вам нужно указать определенные разрешения, для которых вы хотите, чтобы ваша программа была разрешена для использования. Посмотрите на http://developer.android.com/reference/android/Manifest.permission.html. Я считаю, что вам нужно использовать разрешение CALL_PHONE. – AndrewKS

+0

Да, у меня тоже есть - Не могу понять, почему он вообще не работает. –

1

Вам необходимо добавить приоритет в фильтр намерений, чтобы 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> 
2

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

<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> 
Смежные вопросы