Пользовательская схема данных фильтра намерений Android не разрешает queryIntentActivities - PullRequest
0 голосов
/ 29 февраля 2012

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

<activity android:name=".myMagicActivity">
    <intent-filter>
        <action android:name="com.mydomain.action.MYMAGICTHING"/>
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="mymagicthing" android:host="mydomain.com"/>
   </intent-filter>
</activity>

Мое тестовое приложение работает нормально, и я могу запустить намерение, посмотреть данные, как и ожидалось.Тем не менее, если я попытаюсь сначала проверить наличие намерения, оно потерпит неудачу. Всегда .

Я использую следующий код для проверки

public static boolean isIntentAvailable(Context context, String action) {
    final PackageManager packageManager = context.getPackageManager();
    final Intent intent = new Intent(action);

    intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION);

    List<ResolveInfo> list =
            packageManager.queryIntentActivities(intent,0);
    return list.size() > 0;
}

из блога разработчиков Android Результаты следующие:

02-28 21:56:54.186: V/IntentResolver(150): Resolving type null scheme null of intent Intent { act=com.mydomain.action.MYMAGICTHING flg=0x8 }
02-28 21:56:54.186: V/IntentResolver(150): Action list: null
02-28 21:56:54.186: D/INTENT(17088): Intent MISSING
02-28 21:56:54.186: V/IntentResolver(150): Final result list:

Если я удаляю элемент данных из манифеста, обнаружение намерения работает отлично, но, очевидно, никакие данные не передаются намерению, поскольку оно фактически не запускается.

02-28 22:11:14.886: V/IntentResolver(150): Resolving type null scheme null of intent Intent { act=com.mydomain.action.MYMAGICTHING flg=0x8 }
02-28 22:11:14.886: V/IntentResolver(150): Action list: [ActivityIntentInfo{415df398 com.mydomain.myMagicActivity}]
02-28 22:11:14.886: V/IntentResolver(150): Matching against filter ActivityIntentInfo{415df398 com.mydomain.myMagicActivity}
02-28 22:11:14.886: V/IntentResolver(150):   Filter matched!  match=0x108000
02-28 22:11:14.886: V/IntentResolver(150): Final result list:
02-28 22:11:14.886: D/INTENT(17088): found intent

Любые идеи, что не так

1 Ответ

3 голосов
/ 29 февраля 2012

Может быть много причин для этого

Возможная причина 1 - ДАННЫЕ отсутствуют / неверны в объекте намерения:

В соответствии с « Руководством разработчика по *1007*» для разрешения намерений необходимо пройти тест данных, часть которого гласит:

"Объект Intent, который не содержит ни URI, ни типов данных, проходит тест только в том случае, если фильтр также не указывает какие-либо URI или данные типа ".

Другими словами, здесь у вашего фильтра намерений есть раздел «ДАННЫЕ», который содержит URI, определенный схемой и хостом, но объект намерения, созданный вами для тестирования вашего приложения, не имеет раздела «ДАННЫЕ» (или имеет один что не совпадает с фильтром), и именно поэтому разрешение намерения не удается.

Возможная причина 2 - ТИП ДАННЫХ не указан в объекте намерения и фильтре:

Использует ли ваше приложение схему URI, такую ​​как mailto: или tel :? Если нет (очевидно, вы используете mymagicthing), вам нужно указать ТИП ДАННЫХ в фильтре, иначе разрешение не удастся! Справка:

Объект Intent, который содержит URI, но не имеет типа данных (и типа не может быть выведен из URI) проходит тест, только если его URI соответствует URI в фильтре, и фильтр также не указывает тип. Это будет иметь место только для URI, таких как mailto: и tel: that не ссылаются на фактические данные.

Возможное решение:

Итак, если у вас есть пользовательский URI, вы должны указать ТИП ДАННЫХ вместе с URI (схема, хост и т. Д.). Затем в своем тестовом коде создайте намерение с DATA (как URI, так и TYPE), соответствующее DATA. в фильтре намерений

Объект Intent, который содержит как URI, так и тип данных (или данные тип может быть выведен из URI) передает часть типа данных проверять, только если его тип соответствует типу, указанному в фильтре. Проходит часть URI теста, если его URI совпадает с URI в фильтре или если он имеет URI содержимого: или file: и фильтр не указывает URI. Другими словами, предполагается, что компонент поддерживает контент: и file: data, если в его фильтре указан только тип данных.

Пример: определите тип MIME для ваших данных, например

 <data android:mimeType="video/mpeg"> 

для получения дополнительных примеров см. " Руководство разработчика Intent and Intent Filter "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...