Ошибка: неизвестный элемент <intent-filter> найден после обновления до Android 3.1
Сегодня я обновился до Android Studio 3.1.4 и у меня первая ошибка
The option 'android.enableAapt2' is deprecated and should not be used anymore.
Use 'android.enableAapt2=true' to remove this warning.
It will be removed at the end of 2018..
Тогда я меняю android.enableAapt2
к истине, как это предполагает.
После этого у меня новая ошибка AAPT2 error
error: unknown element <intent-filter> found.
Message{kind=ERROR, text=error: unknown element <intent-filter> found., sources=[C:\FILE\Android Studio\UltraGreek\UltraGreekv.4.7\app\build\intermediates\manifests\full\debug\AndroidManifest.xml:37], original message=, tool name=Optional.of(AAPT)}
Мой манифест в app/srs/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ultragreek.ultragreek">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ultrasidelogo"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<activity android:name=".ActivitySecond"/>
<activity android:name=".ActivityAbout"/>
<activity android:name=".WebViewer"/>
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
<activity
android:name=".ActivityStats"
android:label="Στατιστικά">
</activity>
</application>
</manifest>
3 ответа
AAPT2 является заменой AAPT. Если вы что-то связываете с AAPT2, Google предложит вам отключить его. Не делай этого. Он устарел и планируется удалить, что означает, что вы все равно получите эти ошибки.
Ради обучения давайте разберем сообщение об ошибке. Он отформатирован как JSON, что означает, что каждый знак равенства обозначает новый элемент. Вот два соответствующих:
text=error: unknown element <intent-filter> found.
sources=[C:\FILE\Android Studio\UltraGreek\UltraGreekv.4.7\app\build\intermediates\manifests\full\debug\AndroidManifest.xml:37]
Это означает, что у вас есть исключение в манифесте в строке 37, относящееся к фильтру намерений. Он отображается как неизвестный элемент, если элемент находится в неправильном месте. Смотрите руководство по миграции.
Теперь у меня нет номеров строк, потому что переполнение стека не включает их. Но если вы посмотрите внутрь application
тег, вы увидите это:
<activity android:name=".WebViewer"/>
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
Проблема в том, что тег активности закрыт, что означает, что он на самом деле выглядит так (псевдокод):
<application ...>
<activity android:name=".WebViewer"/>
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</application>
<intent-filter>
разрешено только для действия и (из руководства по миграции, связанного ранее):
В предыдущих версиях AAPT элементы, вложенные в неправильные узлы в манифесте Android, либо игнорируются, либо выдают предупреждение. [...]
Что означает, что неправильные узлы теперь мешают компиляции. Вот почему вы получаете ошибку с активированной AAPT2, но не с AAPT.
Решение состоит в том, чтобы двигаться <intent-filter>
на поддерживающий узел, что означает, что вам нужно обернуть его внутри тега активности. Я не знаю, какой вы хотите, поэтому я не собираюсь предоставлять точный код для этого. Но intent-filter
тег должен быть внутри тега активности, например так:
<activity android:name="" android:label="">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
Это произошло потому, что мы не закрываем вкладку активности перед фильтром намерений, вы должны убедиться, что это будет после фильтра намерений.