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>