Подтвердить что ты не робот

Зарегистрировать приложение по умолчанию для настраиваемого типа файла

Зарегистрируйтесь, чтобы иметь возможность открывать файлы настраиваемого типа. Скажем, у меня есть файлы .cool, и если пользователь попытается открыть его, Android спросит, хотят ли они открыть его с моим приложением. Как?

4b9b3361

Ответ 1

Я думаю, что вы этого не выбираете. Это ручка системы. То же самое, когда вы отправляете намерение работать с картой. Если у вас есть skyfire, например, система всплывает окно, вы можете выбрать приложение и выбрать, хотите ли вы всегда открывать этот файл.
Если, конечно, если ваше приложение является единственным, кто может открыть этот файл.

Edit
Я думаю, если вы хотите, чтобы ваше приложение говорило "эй, я могу открыть эти файлы .cool", вам нужно настроить <intent-filters> с тегом <data> и указать mimeType или Uri. Подробнее здесь.

Ответ 2

Вы можете добавить следующее в файл AndroidManifest.xml внутри действия, которое должно открыть файл (pdf в нашем случае)

        <intent-filter >
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.DEFAULT" />
            <data android:mimeType="application/pdf" />
        </intent-filter>

Убедитесь, что вы указали правильный формат mime. Пользователю будет предложено выбрать ваше приложение, если она хочет открыть файл "pdf".

Также проверьте фильтр намерений Android: добавьте приложение с расширением файла для более подробной информации.

Ответ 3

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

Зарегистрируйте тип файла, который вы можете обрабатывать

Добавьте intent-filter к вашей деятельности в манифесте. В моем случае это ReaderActivity которое будет отображать текстовый файл. mimeType говорит, что я приму любой текстовый файл. Смотрите это для конкретных расширений файлов.

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

Обрабатывать намерение

Получите данные о намерениях в вашей деятельности следующим образом:

public class ReaderActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reader);

        handleIntent();
    }

    private void handleIntent() {

        Uri uri = getIntent().getData();
        if (uri == null) {
            tellUserThatCouldntOpenFile();
            return;
        }

        String text = null;
        try {
            InputStream inputStream = getContentResolver().openInputStream(uri);
            text = getStringFromInputStream(inputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (text == null) {
            tellUserThatCouldntOpenFile();
            return;
        }

        TextView textView = findViewById(R.id.tv_content);
        textView.setText(text);
    }

    private void tellUserThatCouldntOpenFile() {
        Toast.makeText(this, getString(R.string.could_not_open_file), Toast.LENGTH_SHORT).show();
    }

    public static String getStringFromInputStream(InputStream stream) throws IOException {
        int n = 0;
        char[] buffer = new char[1024 * 4];
        InputStreamReader reader = new InputStreamReader(stream, "UTF8");
        StringWriter writer = new StringWriter();
        while (-1 != (n = reader.read(buffer))) writer.write(buffer, 0, n);
        return writer.toString();
    }

}

Вы получаете данные из намерения с помощью getData() чтобы получить URI к файлу. Затем вы используете распознаватель содержимого, чтобы открыть поток ввода. Вы используете распознаватель содержимого, поскольку в противном случае у вас может не быть прямого доступа к файлу. Благодаря этому ответу за метод преобразования входного потока в строку.

Ответ 4

Один из возможных ответов показан здесь. Используйте это внутри одного из ваших тегов активности, и он будет открыт, когда файл будет нажат. Я протестировал его с помощью штатного файлового менеджера Android в Oreo.

<intent-filter android:priority="999">
    <action android:name="android.intent.action.VIEW" />

    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <category android:name="android.intent.category.OPENABLE" />

    <data android:host="*" />
    <data android:mimeType="application/octet-stream" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\..*\\.yourextension" />
    <data android:pathPattern=".*\\.yourextension" />
    <data android:scheme="content" />
</intent-filter>

Ответ 5

Suragch ответ - работа, я проверил это 5 минут назад. Спасибо Сурагч за помощь