Как открыть файл во внешнем хранилище из приложения?(Android) - PullRequest
1 голос
/ 05 мая 2019

Я добавил в свое приложение кнопку, которая должна открывать папку загрузки телефона, и оттуда вы сможете нажимать на файлы, которые там хранились, из того же приложения.Сейчас я сохраняю там некоторые данные.

Проблема в том,Я не могу открыть сохраненные файлы в папке.Я вижу файлы, хранящиеся прямо там, но когда я нажимаю один из них, вы сразу же возвращаетесь к приложению, а не к файлу, который вы нажали.

Есть ли что-то, чего мне не хватает?Разве вы не должны открывать файлы, хранящиеся во внешнем хранилище, из другого приложения?

Я пытался добавить разрешения в манифест и checkSelfpermission для проверок во время выполнения, но безуспешно.

Вот кнопкадля открытия папки загрузки:

private void openSavedLocation(){
    if (ContextCompat.checkSelfPermission(ExportAndImport.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
    {
        ActivityCompat.requestPermissions(ExportAndImport.this, new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
    }

    Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
    Uri uri = Uri.parse(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getPath());
    intent.setDataAndType(uri, "text/xml");
    startActivity(Intent.createChooser(intent, "Open Folder"));}

Я могу открыть файл идеально, когда я открываю его вне приложения, а не через этот «createChooser».Чего мне не хватать?Любая помощь приветствуется.

1 Ответ

0 голосов
/ 05 мая 2019

, но когда я нажимаю одну из них, вы сразу же возвращаетесь к приложению, а не к файлу, который вы нажали

Это то, что делает ваш код.ACTION_GET_CONTENT говорит "пусть пользователь выберет часть контента".Здесь не написано «открыть этот фрагмент контента в каком-либо другом приложении».Не существует единственного Intent действия, позволяющего сказать «пусть пользователь выберет фрагмент контента, а затем откроет этот фрагмент контента в каком-либо другом приложении».

Есть что-то, чего я пропускаю?

Если вы хотите открыть XML в другом приложении:

  • Используйте startActivityForResult(), а не startActivity(), для запроса ACTION_GET_CONTENT (и получитеизбавиться от createChooser() бит)
  • Переопределить onActivityResult(), чтобы получить результат по выбору пользователя
  • Если пользователь что-то выбрал (т. е. вы получите RESULT_OK в onActivityResult())создайте ACTION_VIEW Intent, обернутый вокруг Uri, который вы получите от Intent, переданного в onActivityResult(), и позвоните startActivity() на ACTION_VIEW Intent

Если вместо этого ваша цель - открыть этот XML в вашем приложении, вы бы:

  • использовали startActivityForResult(), а не startActivity(), для вашего ACTION_GET_CONTENT запроса(и избавиться от createChooser() бита)
  • Переопределить onActivityResult(), чтобы получить результат по выбору пользователя
  • Если пользователь что-то выбрал (т. е. вы получите RESULT_OK in onActivityResult()), получите Uri продолжениеиз Intent, переданного в onActivityResult(), затем используйте ContentResolver, чтобы сделать что-то полезное с этим Uri (например, openInputStream() для чтения содержимого)

Вот кнопка для открытия папки загрузки

ACTION_GET_CONTENT использует тип MIME.Это не обязательно будет соответствовать вашей поставленной начиная Uri.

...