Ошибка mimeType-check в Android 7.0 Nougat? (фильтр намерений манифеста android)

Кажется, приложение android Мои файлы не работает со следующей конфигурацией AndroidManifest.xml:

  <intent-filter>
     <data android:scheme="file" />
     <data android:pathPattern=".*\\.myext" />
     ...

Некоторые онлайн-источники рекомендуют использовать

  <intent-filter>
     <data android:scheme="content" />
     <data android:mimeType="application/octet-stream" />
     ...

Это означает, что ваше приложение будет пытаться открыть все двоичные файлы. Что не идеально, но прекрасно, пока оно работает...

Что ж, неожиданное удивление перестает работать, когда вы устанавливаете последние обновления Android и обновляете до 7.0 Nougat.

Чтобы решить эту проблему, я попытался использовать:

  <intent-filter>
     <data android:scheme="content" />
     <data android:mimeType="*/*" />
     ...

и посмотрите, что тип mime пуст. Итак, кажется, что версия Nougat не только скремблирует исходный URL-адрес и скрывает его расширение, но также теряет тип mime?!

Кто-нибудь видел какие-либо рабочие примеры пользовательских расширений файлов (ассоциация расширения файлов) на Android 7.0 Nougat? Как настроить XML-манифест Android? Какую targetSdkVersion следует использовать?

Ответ 1

В соответствии с эта часть в файле изменений Nugat от Android, они внесли следующие изменения в способ совместного использования файлов:

Для приложений с таргетингом на Android 7.0 платформа Android применяет политику StrictMode API, которая запрещает выставлять файлы://URI за пределами ваше приложение. Если намерение, содержащее URI файла, покидает ваше приложение, приложение с ошибкой FileUriExposedException.

Чтобы обмениваться файлами между приложениями, вы должны отправить контент://URI и предоставить разрешение на временное доступ к URI. Самый простой способ предоставить это разрешение с помощью класса FileProvider. Для большего информацию о разрешениях и общих файлах, см. раздел "Совместное использование файлов".

Вы уже упоминали все необходимые изменения intent-filter, которые вам нужно было бы сделать - наиболее важными из которых являются следующие строки: -

<data android:scheme="content"/>

В дополнение к изменениям в intent-filter, я думаю, вам придется немного изменить свой код, чтобы принять и работать с URI содержимого, вместо URI файла. Что-то вроде этого должно делать: -

Uri uriOfData = getIntent().getData();
    File file = null;
    String scheme = uriOfData.getScheme();
    String fileName = uriOfData.getEncodedPath();
    file = new File(filename);

    try {
        InputStream inputStream;
        if (file != null) inputStream = new FileInputStream(file);
        else inputStream = getContentResolver().openInputStream(uriOfData);
        InputStreamReader reader = new InputStreamReader(inputStream);
        }
    }

Ответ 2

Изменен Intent Filter От Nougat

Итак, у нас могут быть разные типы и схемы

<intent-filter>
    <action android:name="android.intent.action.SEND"/>
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="text/plain"/>
    <data android:scheme="file" />
</intent-filter>

если u хочет получить текст, тогда вы можете перейти на текст /*, что означает, что все текстовые файлы

Примечание. Совместимость типов MIME в платформе Android зависит от регистра, в отличие от формальных определений RFC. В результате вы всегда должны пишите эти элементы строчными буквами или используйте normalizeMimeType (String), чтобы обеспечить их преобразование в нижнее случай.

 compileSdkVersion 25
 buildToolsVersion "25.3.1"
 defaultConfig {
     applicationId "com.example"
     minSdkVersion 16
     targetSdkVersion 25
     versionCode 1000
     versionName "3.0.6"
}

И также зависит от версии сборки Android, на которую вы хотите настроить цель