Android Studio: невозможно открыть файл .txt в EditText – продолжает получать ошибку отказа в разрешенииJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Android Studio: невозможно открыть файл .txt в EditText – продолжает получать ошибку отказа в разрешении

Сообщение Anonymous »


В моем приложении для Android Song_Tracker я хочу открыть файлы txt, которые я скопировал со своего ноутбука — файлы хранятся в папке \Internal Storage\DCIM\. sheet_music, когда я анализирую каталог и загружаю имя файла, я также загружаю файл URI. Я хочу открыть файл txt в поле EditText, чтобы пользователь мог просматривать или редактировать/сохранять. У меня есть имена файлов txt, хранящиеся в моей базе данных SQLite, и в конечном итоге я хочу перейти от одной песни к другой, каждая из которых загружается в RecycleView.

Вот ошибка, которую я получаю:

java.lang.RuntimeException: невозможно начать действие ComponentInfo{com.enetapplications.songtracker/com.enetapplications.songtracker.editsong.NewEditSongActivity}: java.lang.SecurityException: Отказ в разрешении: открытие поставщика com.android.externalstorage.ExternalStorageProvider из ProcessRecord{f235d79 11381:com.enetapplications.songtracker/u0a540} (pid=11381, uid=10540) требует получения доступа с помощью ACTION_OPEN_DOCUMENT или связанных API. Я установил разрешения в Манифесте следующим образом:

... Я пробовал использовать ACTION_OPEN_DOCUMENT, однако при этом открывается средство выбора файлов, которое мне не нужно — я хочу просто щелкнуть или провести пальцем от одного файла txt к другому без необходимости чтобы перейти к средству выбора файлов для каждого файла.

Вот .class, который открывает файл, содержащий советы отсюда. Кажется, код работает правильно, но я не могу этого сказать, поскольку постоянно получаю ошибку отказа в разрешении. Я попытался использовать requestPermissionLauncher в приведенном ниже коде, но та же ошибка. Я попробовал ContextCompat.checkSelfPermission, все та же ошибка.
пакет com.enetapplications.songtracker.editsong; импортировать android.content.pm.PackageManager; импортировать android.net.Uri; импортировать android.os.Bundle; импортировать android.widget.EditText; импортировать android.widget.TextView; импортировать androidx.activity.result.ActivityResultLauncher; импортировать androidx.activity.result.contract.ActivityResultContracts; импортировать androidx.appcompat.app.AppCompatActivity; импортировать androidx.core.app.ActivityCompat; импортировать androidx.core.content.ContextCompat; импортировать com.enetapplications.songtracker.R; импортировать java.io.BufferedReader; импортировать java.io.FileNotFoundException; импортировать java.io.IOException; импортировать java.io.InputStream; импортировать java.io.InputStreamReader; публичный класс NewEditSongActivity расширяет AppCompatActivity { частный статический финал int PERMISSION_REQUEST_CODE = 123; // Определите свой собственный код запроса EditText EditTextSongContent; TextView textViewSongName; Ури песняУри; // Сохраняем URI, чтобы он был доступен во всем классе частный ActivityResultLauncher requestPermissionLauncher = RegisterForActivityResult(new ActivityResultContracts.RequestPermission(), isGranted -> { если (isGranted) { // Разрешение получено, приступаем к открытию файла openFile (songUri); } еще { // Разрешение отклонено, обработайте эту ситуацию (например, покажите сообщение или скорректируйте поведение приложения) // Например: showToast("В разрешении отказано. Невозможно открыть файл."); } }); @Override protected void onCreate (Bundle saveInstanceState) { super.onCreate(saveInstanceState); setContentView(R.layout.activity_new_edit_song); editTextSongContent = findViewById(R.id.editTextSongContent); textViewSongName = findViewById(R.id.textViewSongName); // Получаем URI файла, который нужно открыть String uriString = getIntent().getStringExtra("song_uri"); если (uriString != ноль) { songUri = Uri.parse(uriString); // Проверяем разрешение READ_EXTERNAL_STORAGE if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { // Разрешение получено, приступаем к открытию файла openFile (songUri); } else if (ActivityCompat.shouldShowRequestPermissionRationale(this, android.Manifest.permission.READ_EXTERNAL_STORAGE)) { // Объясните, почему вашему приложению требуется это разрешение и какие функции отключаются в случае отклонения. // Образовательный пользовательский интерфейс должен быть показан пользователю // Например: showInContextUI("Пояснение для доступа к внешнему хранилищу"); } еще { // Запрашиваем разрешение с помощью ActivityResultLauncher requestPermissionLauncher.launch(android.Manifest.permission.READ_EXTERNAL_STORAGE); } } } частный недействительный openFile (Uri uri) { //Открываем файл и читаем его содержимое Входной поток inputStream = ноль; пытаться { inputStream = getContentResolver().openInputStream(uri); } catch (FileNotFoundException e) { выдать новое RuntimeException(e); } Читатель BufferedReader = новый BufferedReader (новый InputStreamReader (inputStream)); Струнная линия; в то время как (истина) { пытаться { if ((line = readLine()) == null) перерыв; } catch (IOException e) { выдать новое RuntimeException(e); } editTextSongContent.append(строка); } // Закрываем файл пытаться { inputStream.close(); } catch (IOException e) { выдать новое RuntimeException(e); } } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»