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