Чтение файла в разных версиях Android API
Есть отрывок кода, который открывает файл через файловый менеджер и считывает его:
public void loadCarMenu (View view) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("text/*");
//intent.addCategory(Intent.CATEGORY_OPENABLE);
startActivityForResult(intent,PICKFILE_RESULT_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch(requestCode){
case PICKFILE_RESULT_CODE:
if(resultCode == RESULT_OK){
String pathFile = data.getData().getPath();
//File inputFile = new File (pathFile);
FileInputStream fin = null;
try {
fin = new FileInputStream(pathFile);
byte [] bytes = new byte[fin.available()];
fin.read(bytes);
String info = new String(bytes);
textView.setText(info);
}
catch (IOException ex) {
}
finally {
try{
if(fin!=null)
fin.close();
}
catch(IOException ex){
}
}
//textView.setText(data.toString());
}
break;
}
}
Суть вопроса в том, что на API версии 29 данный файл не воспринимается, хотя путь до файла отображается верно. Разрешения на чтение и запись в манифесте присутствуют:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
Ответы (2 шт):
Добро пожаловать в Scoped Storage
Суть состоит в том, что начиная с API 29 приложения имеют ограниченный доступ к внешнему хранилищу. Если вкратце доступ к внешним файлам на чтение дается только через InputStream, который можно получить приблизительно так:
Uri uri = intent.getData(); //Intent полученный через `ACTION_OPEN_DOCUMENT/ACTION_CREATE_DOCUMENT`
InputStream is = context.getContentResolver().openInputStream(uri);
Указатель на File при этом получить невозможно. Аналогично можно и писать - через OutputStream
Спасибо Barmaley Red Star за ответ, реализовал таким образом, если кому понадобится:
public void openText(View view) {
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("text/*");
startActivityForResult(intent, PICKFILE_RESULT_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case PICKFILE_RESULT_CODE:
if (resultCode == RESULT_OK) {
Uri uri = data.getData();
TextView textView = (TextView) findViewById(R.id.open_text);
InputStream is = null;
try {
is = this.getContentResolver().openInputStream(uri);
byte[] bytes = new byte[is.available()];
is.read(bytes);
String text = new String (bytes);
textView.setText(text.toString());
}
catch(IOException ex) {
Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
}
finally{
try{
if(is!=null)
is.close();
}
catch(IOException ex){
Toast.makeText(this, ex.getMessage(),Toast.LENGTH_SHORT).show();
}
}
}
}
}