Зарегистрируйтесь, чтобы быть приложением по умолчанию для пользовательского типа файла - PullRequest
16 голосов
/ 12 августа 2010

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

Ответы [ 4 ]

12 голосов
/ 16 февраля 2012

Вы можете добавить следующее в файл 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: связать приложение с расширением файла для получения более подробной информации.

11 голосов
/ 12 августа 2010

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

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

1 голос
/ 08 сентября 2018

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

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

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

<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 к файлу. Затем вы используете распознаватель содержимого, чтобы открыть поток ввода. Вы используете распознаватель содержимого, поскольку в противном случае у вас может не быть прямого доступа к файлу. Спасибо за этот ответ за метод преобразования входного потока в строку.

0 голосов
/ 03 мая 2019

Один из возможных ответов показан здесь .Используйте это внутри одного из ваших тегов активности, и он будет открыт, когда файл будет нажат.Я протестировал его с помощью штатного файлового менеджера 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>
...