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