Adobe Reader не открывает некоторые допустимые PDF-файлы из Intent and content:/// на Android

Я пытаюсь реализовать способ открытия PDF Reader для некоторых файлов, расположенных в /Android/data/package.name/files/. Мне не удалось использовать правильный FileProvider, но я обнаружил, что просто добавленное содержимое: // сделало работу. Но по какой-то причине он не может открыть некоторые из них, и я не могу понять, почему.

File file=new File("Direct path to file as string");

if(file.exists()){  ///Yes, File Exists
            try {

                Intent intent = new Intent(Intent.ACTION_VIEW);
                Log.v("Authority", context.getApplicationContext().getPackageName());
                Log.v("URI", Util.UriForFile(context, file).toString());
                intent.setDataAndType(Util.UriForFile(context, file), "application/pdf");
                intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
                context.startActivity(intent);


            } catch (ActivityNotFoundException e) {
                parent.alert(context.getString(R.string.error_nopdfreader));
            }
}

и собственно метод Util.UriForFile:

public static Uri UriForFile(Context context, File file){
    return Uri.parse("content://"+file.getAbsolutePath());
//        if(context==null)
//            Log.v("Util", "Context is null");
//
//        if(file==null)
//            Log.v("Util", "File is null");
//
//        if(context.getApplicationInfo()==null)
//            Log.v("Util", "getApplicationInfo is null");
//
 //        return FileProvider.getUriForFile(context,  context.getApplicationInfo().packageName+".provider", file);
}

person Myoch    schedule 28.11.2016    source источник
comment
Я обнаружил, что просто добавленное содержимое: // сделало работу — это будет работать примерно с нулевыми приложениями. Если это работает с Adobe Reader, это ошибка в Adobe Reader. Это недопустимый Uri (например, у него нет строки полномочий). Мне не удалось использовать правильный FileProvider — рассмотрите возможность задать отдельный вопрос о переполнении стека, где вы предоставляете минимальный воспроизводимый пример и подробно объясните, что значит неудавшийся.   -  person CommonsWare    schedule 29.11.2016
comment
Что ж, половина моей проблемы с FileProvider описана здесь: .com/questions/40318116/. Помимо этого, я также хочу, чтобы пользователь мог указать другой каталог за пределами папки Android/data и даже во вторичном хранилище, но единственное, что сработало, это использование содержимого:///.   -  person Myoch    schedule 29.11.2016
comment
И даже если FileProvider находится во внутренней памяти, Adobe не открывает некоторые определенные файлы. Похоже, что не открываемые файлы — это файлы с %20 в фактическом имени файла (нет пробела, но настоящие символы %20, которые FileProvider кодирует в %2520).   -  person Myoch    schedule 29.11.2016


Ответы (1)


Хорошо, я «волшебным образом» решил проблему, вернувшись к использованию FileProvider (раскомментировав строки) и выполнив 2 модификации:

  1. добавление FLAG_GRANT_READ_URI_PERMISSION во флаги намерения
  2. добавление «недокументированного» пути к файлу (для доступа к файлам за пределами Android/данных):

      <root-path path="/storage/" name="root_test" />
    
person Myoch    schedule 29.11.2016
comment
У меня была аналогичная проблема. Все приложения PDF смогли открыть файл с помощью Intent, кроме Adobe Reader. Однако моя проблема заключалась в имени файла. В конце не было .pdf. Не уверен, почему это не было проблемой для других приложений. - person AliAvci; 08.10.2019