Может кто-нибудь подтвердить, что Adobe Reader работает с поставщиком нестандартного контента - PullRequest
4 голосов
/ 05 февраля 2012

Я реализовал пользовательский контент-провайдер, обслуживающий документы в формате PDF как ParcelFileDescriptor.Файлы хранятся в локальном хранилище, помеченном как ЧАСТНОЕ.На основе URI документы затем передаются в выбранное приложение PDF.

Это работает для всех приложений PDF Viewer, кроме Adobe Reader.Может кто-нибудь подтвердить, что Adobe Reader не работает с контент-провайдерами?Код ниже:

Когда документ загружен:

private void loadDocInReader(String doc) throws ActivityNotFoundException, Exception 
{
    Uri uri = Uri.parse(doc);   

    logger.debug("PDF Application ID is: " + pdfAppID);

    if (this.pdfAppID != null && this.pdfAppID.length() > 0) 
    {
        boolean pdfApplicationIsInstalled = checkPDFApplicationIsInstalled(this.pdfAppID);

        if(pdfApplicationIsInstalled) {
            Intent intent = new Intent();
            intent.setPackage(pdfAppID);
            intent.setData(uri);
            intent.setType("application/pdf");
            startActivity(intent);
        }
        else {
            logger.error("Please install Adobe Reader first!");
        }
    }
    else {
        Intent intent = new Intent();
        intent.setData(uri);
        intent.setType("application/pdf");
        startActivity(intent);
    }
}

Все другие приложения для просмотра PDF вызывают этот метод, кроме Adobe Reader:

public class DocumentProvider extends ContentProvider 
{
@Override
public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException 
{
    File file = null;

    try {

        file = new File(uri.getPath());
        logger.debug("Delivering ParcelFileDescriptor for path: " + file.getPath());
        return ParcelFileDescriptor.open(file,   ParcelFileDescriptor.MODE_READ_ONLY);

    } catch (FileNotFoundException e) {
        logger.error("Error loading Document: ",e);
    } finally {
        if(file.exists()) {
        file.delete();
        }
    }
    return null;
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    return 0;
}
}

Adobe Reader всегда заявляет:«Неверный путь к файлу»

Заранее спасибо !!!Кей.

Ответы [ 2 ]

1 голос
/ 03 декабря 2014

Насколько я могу судить, Adobe Reader имеет нестабильную поддержку чтения файлов из ContentProviders. В моем случае метод openFile вызывается и возвращает допустимый ParcelFileDescriptor, но Adobe Reader сообщает: «Не удалось открыть документ». Мой поставщик контента прекрасно работает с «Drive PDF Viewer», «PDF Reader» и «qPDF Reader», которые являются одними из лучших программ просмотра PDF в Play Store.

Adobe Reader может открывать вложения в формате PDF в Gmail с помощью поставщика содержимого Gmail, но я не могу определить, как и почему это работает.

0 голосов
/ 23 сентября 2016

У меня также есть проблемы с тем, что Adobe Acrobat Reader не работает с моим пользовательским провайдером, и, наконец, он заработал.Моя проблема заключалась в том, что файлы в файловом пространстве приложения локально зашифрованы, а их имена хэшированы.Таким образом, Uri был примерно таким:

content://my.app.provider/08deae8d9ea9bc0b84f94475d868351830e9f7e7

. Он работает с любым приложением для просмотра PDF, которое я тестировал, кроме Adobe Reader.Сегодня я сделал последнюю попытку добавить расширение .pdf к Content Uri (что определенно не требуется), и когда Adobe вызывает функцию openFile(), я удаляю расширение.ВОЙЛА, это работает !!!

Обновление

Пожалуйста, убедитесь, что также _display_name столбец, который ваш ContentProvider возвращает как результат query(Uri, String[], String, String[], String) запроса также содержит .pdf расширение !!!

Примечание

Протестировано с Adobe Acrobat Reader версия 16.3

...