Может ли кто-нибудь подтвердить, что Adobe Reader работает с поставщиком пользовательского контента?

Я реализовал пользовательский поставщик контента, обслуживающий PDF-документы как ParcelFileDescriptor. Файлы хранятся в локальном хранилище с пометкой PRIVATE. На основе URI документы затем передаются выбранному приложению PDF.

Это работает для всех приложений просмотра PDF, кроме 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 всегда пишет: «Неверный путь к файлу».

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


person Kay    schedule 05.02.2012    source источник
comment
Вам это помогает? stackoverflow.com/a/7887891/1024132   -  person AsTheWormTurns    schedule 05.02.2012
comment
Спасибо за ответ. Проблема в том, что Adobe Reader даже не работает с моей реализацией поставщика контента. Как мне передать файл в Adobe Reader?   -  person Kay    schedule 05.02.2012


Ответы (2)


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

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

person plinehan    schedule 03.12.2014

У меня также есть проблемы с 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

person xsveda    schedule 23.09.2016
comment
Не могли бы вы поподробнее рассказать, как вы решили проблему. - person Simar; 23.01.2017