Проблема записи файла на некоторых устройствах через openOutputStream (mUri) - PullRequest
0 голосов
/ 15 января 2020

Я пишу приложение, которое открывает текстовый файл через 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();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...