Почему следующие Ordered Broadcast не работает в Android Oreo, если я специально не установил пакет имя?
final Intent vrIntent = new Intent(RecognizerIntent.ACTION_GET_LANGUAGE_DETAILS);
// Setting the package it will work. Omitting, it will fail
// vrIntent.setPackage("com.google.android.googlequicksearchbox");
getContext().sendOrderedBroadcast(vrIntent, null, new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
// final Bundle bundle = intent.getExtras();
final Bundle bundle = getResultExtras(true);
if (bundle != null) {
if (bundle.containsKey(RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES)) {
Log.i("TAG", "onReceive: EXTRA_SUPPORTED_LANGUAGES present");
final ArrayList<String> vrStringLocales = bundle.getStringArrayList(
RecognizerIntent.EXTRA_SUPPORTED_LANGUAGES);
Log.i("TAG", "onReceive: EXTRA_SUPPORTED_LANGUAGES size: " + vrStringLocales.size());
} else {
Log.w("TAG", "onReceive: missing EXTRA_SUPPORTED_LANGUAGES");
}
} else {
Log.w("TAG", "onReceive: Bundle null");
}
}, null, 1234, null, null);
Если имя пакета не задано, EXTRA_SUPPORTED_LANGUAGES
будет отсутствовать.
Недавно я задал вопрос о вознаграждении, где мой "устаревший код", который не задавал имя пакета, не работал в Oreo. , но успешно работал на предыдущих версиях Android.
Проверив все поведенческие изменения в API 26 Я не вижу ничего, что могло бы это объяснить.
Может ли кто-нибудь пролить свет на возможную причину, пожалуйста?
Примечание. В примере кода и проблеме предполагается, что на устройстве установлено Приложение Google Now, установленное для предоставления RecognitionService
sendOrderedBroadcast()
ничего не вызывает, то это будет проблемой в любой части Android, которая должна реагировать наACTION_GET_LANGUAGE_DETAILS
. - person CommonsWare   schedule 07.02.2018EXTRA_SUPPORTED_LANGUAGES
будет отсутствовать. - person brandall   schedule 07.02.2018Intent
пусто? Код результата по-прежнему 1234 (не знаю, где вы узнали...)? В последнее время я мало играл с заказными трансляциями, не говоря уже об Android 8.0+. Но я вижу, где Android может оказаться, просто вызвав ваш последнийBroadcastReceiver
, после того, как не найдет действительных получателей для неявной трансляции. - person CommonsWare   schedule 07.02.2018Intent
пуст. Код результата по-прежнему 1234. Хотя установка имени пакета предполагает, что оно становится «явным», получатель по-прежнему будет неявным по своей природе, учитывая несколькоSpeechRecognizers
, которые могут присутствовать на устройстве? - person brandall   schedule 07.02.2018setPackage()
имеет тенденцию делатьIntent
достаточно явным для многих целей, в том числе для того, чтобы обойти запрет на неявноеIntents
. Однако вместо того, чтобы жестко кодировать это имя пакета, вы можете попробовать упорядоченный вариант метода обходаsendImplicitBroadcast()
, который у меня есть ближе к концу это сообщение в блоге о запрете. Кстати, поскольку я не нашел его в документах... где этот код результата доставляется вам? Я хотел бы провести несколько экспериментов. - person CommonsWare   schedule 07.02.2018getResultCode()
внутри приемника. Я прочитаю ваш блог и проверюsendImplicitBroadcast()
, с которым я не знаком. Спасибо за совет. Кстати, не по теме, если вам когда-нибудь будет скучно за кофе, я бы хотел посмотреть, что вы думаете о моем проекте github.com/brandall76/Saiy-PS :) - person brandall   schedule 07.02.2018Intent
и пытался выяснить, где он хранится, но ничего не нашел. Большое спасибо! Что касается вашего проекта, спасибо за документацию. Я глубоко обеспокоен виртуальными помощниками как категорией, поэтому я не особенно хороший человек, чтобы давать отзывы о самом проекте. И спасибо за добрые слова! - person CommonsWare   schedule 07.02.2018