Я пишу приложение, которое открывает текстовый файл через Uri: (getContentResolver (). OpenInputStream (mUri))
, затем, после изменения текста в EditText, нажав кнопку, я пытаюсь сохранить содержимое файла с использованием полученного Uri: (getContentResolver (). openOutputStream (mUri);)
проблема в том, что весь код работает на эмуляторах. Он работает на Honor P9 (Android 7.0.0), но когда я отлаживаю на реальном устройстве (Asus ZE553KL Android 8.0.0), когда я сохраняю его, я получаю ошибку: "java . io.IOException: запись не удалась: EBADF (неверный дескриптор файла) "
Пожалуйста, помогите нам правильно реализовать код. Ниже приведен весь код MainActivity. Спасибо!
package com.aginf.notetohelp;
import androidx.appcompat.app.AppCompatActivity;
import android.content.ContentResolver;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
public class MainActivity extends AppCompatActivity {
private EditText mEditText;
private Uri mUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText) findViewById(R.id.editText);
//////////////////////////////////////
// Получаю Uri только при SCHEME_CONTENT
// и сразу открываю файл и помещаю его в EditText
Intent intent = getIntent();
String action = intent.getAction();
if (action.compareTo(Intent.ACTION_VIEW) == 0) {
String scheme = intent.getScheme();
if (scheme.compareTo(ContentResolver.SCHEME_CONTENT) == 0) {
mUri = intent.getData();
OpenFromUri();
}
}
}
///////////////////////////////////
// Процедура получения содержимого файла по Uri
private void OpenFromUri() {
StringBuilder stringBuilder = new StringBuilder();
Boolean res;
try{
InputStream inputStream = getContentResolver().openInputStream(mUri);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
stringBuilder.append(line + "\n");
}
mEditText.setText(stringBuilder.toString());
inputStream .close();
}catch(Throwable t){
Toast.makeText(getApplicationContext(),"ERROR (open from Uri): "+t.toString(), Toast.LENGTH_LONG).show();
}
}
///////////////////////////////////
// ПСохранение содержимого в файл по Uri
public void onSaveClick(View view) {
try{
OutputStream outputStream = getContentResolver().openOutputStream(mUri);
OutputStreamWriter osw = new OutputStreamWriter(outputStream);
osw.write(mEditText.getText().toString());
osw.close();
outputStream.close();
Toast.makeText(MainActivity.this, "Saved", Toast.LENGTH_SHORT).show();
}catch(Throwable t){
Toast.makeText(getApplicationContext(),"ERROR (save from Uri):"+t.toString(), Toast.LENGTH_LONG).show();
}
}
}