2017-02-16 26 views
0

Я создал один pdf динамически и сохранил во внутренней памяти приложения под одной папкой. Теперь я хочу поделиться этим PDF-письмом или другими доступными опциями совместного доступа.как подключить файл внутренней памяти в android

Я столкнулся

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference 
                       at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:560) 
                       at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:534) 
                       at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:376) 

Ниже один мой код

Manifest File

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

file_paths.xml: она находится под рес/XML/file_paths

<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <files-path name="media"/> 
    <files-path path="app_PDF_Export/" name="Report.pdf" /> 
    <files-path path="/" name="allfiles" /> 
</paths> 

Файл Java

File newFile = new File(getActivity().getApplicationInfo().dataDir + File.separator + Constants.folderName, getActivity().getResources().getString(R.string.pdf_name) + ".pdf"); 
// 
    Uri sharedFileUri = FileProvider.getUriForFile(getActivity().getApplicationContext(), getActivity().getPackageName(), newFile); 
      PackageManager packageManager = getActivity().getPackageManager(); 
      List<ResolveInfo> list = packageManager.queryIntentActivities(emailIntent, PackageManager.MATCH_DEFAULT_ONLY); 
      if (list.size() < 1) { 
       return; 
      } 
      String packageName = list.get(0).activityInfo.packageName; 

      getActivity(). grantUriPermission(packageName, sharedFileUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 

      emailIntent.putExtra(Intent.EXTRA_STREAM, sharedFileUri); 

Любой один предложить мне, где я делаю неправильно Заранее спасибо !!!

+1

Я рекомендую вам редактировать свой вопрос и после полного стека Java след, а не только сообщение об ошибке. – CommonsWare

ответ

1
android:authorities="mypkgName.fileprovider" 

не соответствует:

FileProvider.getUriForFile(getActivity().getApplicationContext(), getActivity().getPackageName(), newFile); 

Как результат, FileProvder не может найти ContentProvider прочитать его метаданных XML. Вам необходимо передать правильную строку полномочий getUriForFile().

Поскольку вы установили android:authorities в "mypkgName.fileprovider", используйте:

FileProvider.getUriForFile(getActivity(), "mypkgName.fileprovider", newFile); 

(getApplicationContext() бессмысленно здесь)

+0

Не могли бы вы дать мне краткое описание над базой кода, его полезно для меня? – Pinki

+0

У меня есть crated file_paths xml находится под res.If мы перевозим под raw, как мы можем получить доступ в файле манифеста – Pinki

+0

@Pinki: см. Обновленный ответ. – CommonsWare