2016-01-31 4 views
1

Я столкнулся эту ошибку:Попытка открыть PDF-файл для Android

E/AndroidRuntime: java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/com.mobgen.androidinterviewtest/files/LaFerrari.pdf 
E/AndroidRuntime:  at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:678) 
E/AndroidRuntime:  at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:377) 
E/AndroidRuntime:  at com.mobgen.interview.SingleCarActivity$1.onClick(SingleCarActivity.java:92) 

Это из-за этой строки кода:

Uri uri = FileProvider.getUriForFile(SingleCarActivity.this, "be.myapplication", file); 

Я следовал за ресурсы, которые я нашел: http://developer.android.com/reference/android/support/v4/content/FileProvider.html

Open file in cache directory with ACTION_VIEW

How to use support FileProvider for sharing content to other apps?

Однако я все еще не мог исправить ошибку, которую у меня есть.

Ниже вы можете увидеть мой код:

SingleCarActivity.java:

File file = new File(getFilesDir(), pdf); //pdf contains "LaFerrari.pdf" 
Uri uri = FileProvider.getUriForFile(SingleCarActivity.this, "be.myapplication", file); 
Intent intent = new Intent(); 
intent.setAction(Intent.ACTION_VIEW); 
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
intent.setDataAndType(uri, "application/pdf"); 
startActivity(intent); 

AndroidManifest.xml:

<provider 
    android:name="android.support.v4.content.FileProvider" 
    android:authorities="be.myapplication" 
    android:exported="false" 
    android:grantUriPermissions="true"> 
    <meta-data 
     android:name="android.support.FILE_PROVIDER_PATHS" 
     android:resource="@xml/file_paths" /> 
</provider> 

file_paths.xml:

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <files-path name="my_pdf" path="assets/"/> 
</paths> 

Ниже можно увидеть скриншот о том, как выглядит моя структура проекта: Ссылка: http://i.imgur.com/4dbhcKF.png

+0

'assets /' - это каталог на вашей машине разработки. Это не каталог на устройстве. 'FileProvider' не может обслуживать активы, а только локальные файлы. Скопировали ли вы эти файлы из активов в подкаталог 'assets /' под 'getFilesDir()'? – CommonsWare

+0

@CommonsWare У меня есть googled. Вы имеете в виду что-то вроде ответа на следующий вопрос? ссылка: http://stackoverflow.com/questions/8474821/how-to-get-the-android-path-string-to-a-file-on-assets-folder – superkytoz

ответ

1

FileProvider не может обслуживать активы напрямую, так как активы не являются файлами. Ваши первичные выборы являются:

  1. Скопируйте актив в файл, в месте, которое вы настроили для FileProvider. Я демонстрирую такую ​​конфигурацию FileProvider в this sample app, но ответы на вопросы the question from your comment делают основы копирования ресурса в файл.

  2. Используйте my StreamProvider, который может обслуживать активы напрямую, без необходимости делать копию.

+0

Я использовал код из вашего примера приложения. Но теперь я столкнулся с этой новой ошибкой: «Никакой активности не найдено для обработки Intent {act = android.intent.action.VIEW dat = content: //be.myapplication/my_pdf/LaFerrari.pdf flg = 0x1}' Это из-за эта строка кода: 'startActivity (i);' у меня googled, и я нашел этот вопрос: http://stackoverflow.com/questions/9157490/android-no-activity-found-to-handle-intent-error-how -it-will-solve Итак, я добавил фильтр намерений SingleCarActivity: http://pastebin.com/9jd2FACK Но я все еще получаю сообщение об ошибке. Я поместил код на ссылку pastebin: http://pastebin.com/NUNGxvcQ – superkytoz

+0

@superkytoz: «Но теперь я столкнулся с этой новой ошибкой» - вам нужно, чтобы на вашем устройстве было установлено приложение просмотра PDF, которое поддерживает 'content: //' 'Uri'. Adobe Reader, Foxit и ezPDF Reader все делают, а другие, вероятно, тоже работают. – CommonsWare

+0

Ах да это работает :). – superkytoz

Смежные вопросы