Отсутствуют метаданные android.support.FILE_PROVIDER_PATHS

Я пытаюсь открыть файл PDF, который я загрузил и сохранил во внешнем хранилище. Но когда я открываю свое приложение, оно выходит из строя и показывает следующую ошибку;

08-31 00:58:31.304 1807-1807/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: medimanage.corporate.mobile, PID: 1807
    java.lang.RuntimeException: Unable to get provider android.support.v4.content.FileProvider: java.lang.IllegalArgumentException: Missing android.support.FILE_PROVIDER_PATHS meta-data
    at android.app.ActivityThread.installProvider(ActivityThread.java:5856)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:5445)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5384)
    at android.app.ActivityThread.-wrap2(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
      Caused by: java.lang.IllegalArgumentException: Missing android.support.FILE_PROVIDER_PATHS meta-data
    at android.support.v4.content.FileProvider.parsePathStrategy(FileProvider.java:586)
    at android.support.v4.content.FileProvider.getPathStrategy(FileProvider.java:557)
    at android.support.v4.content.FileProvider.attachInfo(FileProvider.java:375)
    at android.app.ActivityThread.installProvider(ActivityThread.java:5853)
    at android.app.ActivityThread.installContentProviders(ActivityThread.java:5445) 
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5384) 
    at android.app.ActivityThread.-wrap2(ActivityThread.java) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545) 
    at android.os.Handler.dispatchMessage(Handler.java:102) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6119) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776) 

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

package myPackageName.common.postData;    
public class DownloadFileFromURL extends AsyncTask<String, String, String> {

        private ProgressDialog Dialog;
        private Context mContext;
        private String folder_main; //= "TermCondition";
        private String fileName;//= "termCondition.pdf";
        String urlString;

        public DownloadFileFromURL(Context mContext, String folderName) {
            this.mContext = mContext;
            this.folder_main = folderName;
            Dialog = new ProgressDialog(this.mContext);
        }

        @Override
        protected String doInBackground(String... f_url) {
            try {
                urlString = f_url[0];
                URL url = new URL(f_url[0]);
                File folder = new File(Environment.getExternalStorageDirectory(), this.folder_main);
                if (folder.exists()) {
                    folder.mkdirs();
                } 
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.connect();
                InputStream inputStream = urlConnection.getInputStream();
                FileOutputStream fileOutputStream = new FileOutputStream(Environment.getExternalStorageDirectory() + "/" + "default.pdf");
                int totalSize = urlConnection.getContentLength();
                byte[] buffer = new byte[AccessibilityNodeInfoCompat.ACTION_DISMISS];
                while (true) {
                    int bufferLength = inputStream.read(buffer);
                    if (bufferLength <= 0) {
                        break;
                    }
                    fileOutputStream.write(buffer, 0, bufferLength);
                }
                fileOutputStream.close();
            } catch (FileNotFoundException e) {
                FileLog.e(mContext.getClass().getName(), e);
            } catch (MalformedURLException e2) {
                FileLog.e(mContext.getClass().getName(), e2);
            } catch (IOException e3) {
                FileLog.e(mContext.getClass().getName(), e3);
            }
            return null;
        }

        public void showPdf() {
            try {

                File file = new File(Environment.getExternalStorageDirectory() + "/" + "default.pdf");

                try {
                    Intent intent = new Intent();
                    intent.setAction(Intent.ACTION_VIEW);
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                        intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                        Uri contentUri = FileProvider.getUriForFile(mContext, "medimanage.corporate.mobile.fileprovider", file);
                        intent.setDataAndType(contentUri, "application/pdf");
                    } else {
                        intent.setDataAndType(Uri.fromFile(file), "application/pdf");
                    }
                    mContext.startActivity(intent);
                } catch (ActivityNotFoundException anfe) {
                    Toast.makeText(mContext, "No activity found to open this attachment.", Toast.LENGTH_LONG).show();
                }

            } catch (Exception e) {
                FileLog.e(mContext.getClass().getName(), e);
            }
        }

        @Override
        protected void onPreExecute() {
            Dialog.setMessage("Downloading...");
            Dialog.setCancelable(false);
            Dialog.setCanceledOnTouchOutside(false);
            Dialog.show();
        }

        @Override
        protected void onPostExecute(String s) {
            this.Dialog.dismiss();
            showPdf();
            super.onPostExecute(s);
        }

    }

Ниже приведен AndroidManifest.xml.

<application
...>
  <provider
      android:name="android.support.v4.content.FileProvider"
      android:authorities="myPackageName.fileprovider"
      android:exported="false"
      android:grantUriPermissions="true">
          <meta-data
             android:name="android.support.FILE_PROVIDE_PATHS"
             android:resource="@xml/provider_paths" />
  </provider>
</application>

И provider_paths.xml, имеющий следующий код:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="Android/data/" name="files_root" />
    <external-path path="." name="external_storage_root" />
</paths>

Я пытаюсь запустить приведенный выше код в API 19 и API 25, но на обоих устройствах происходит сбой. Я не могу понять, в чем я ошибаюсь.

Я сослался на этот вопрос, а также на и эту ссылку, но мне не удалось найти решение моей проблемы.


person priyanka kamthe    schedule 31.08.2017    source источник
comment
проверьте этот stackoverflow.com/a/24111284/7666442, а также это stackoverflow.com/questions/31345275/ и этот stackoverflow.com/questions/20263428/   -  person AskNilesh    schedule 31.08.2017
comment
@NileshRathod В соответствии с вашими ссылками я заменяю следующие строки в файле provider_paths.xml; <paths> <files-path path="/storage/emulated" name="files_root" /> <files-path path="." name="external_storage_root" /> </paths>, но по-прежнему рушится.   -  person priyanka kamthe    schedule 31.08.2017
comment
получилось это или нет @priyanka kamthe   -  person AskNilesh    schedule 31.08.2017
comment
нет, это не работает для меня   -  person priyanka kamthe    schedule 31.08.2017
comment
stackoverflow .com / questions / 20263428 /.   -  person AskNilesh    schedule 31.08.2017
comment
android:name="android.support.FILE_PROVIDE_PATHS" ??? R отсутствует! Если вы поймаете это исключение, ваше приложение не выйдет из строя.   -  person greenapps    schedule 31.08.2017
comment
@greenapps Я не могу понять, R отсутствует?   -  person priyanka kamthe    schedule 31.08.2017
comment
PROVIDE + R Я бы сказал, что у вас опечатка.   -  person greenapps    schedule 31.08.2017
comment
@greenapps thnx. Очень глупая ошибка. Теперь работает.   -  person priyanka kamthe    schedule 31.08.2017
comment
Я использовал .provider в моем авторитетном имени, и это принято, только тот факт, что если у меня более 1 провайдера, то сначала должен быть объявлен провайдер файлов.   -  person Ashish John    schedule 25.10.2017


Ответы (10)


В вашем файле AndroidManifest есть небольшая опечатка в метаданных:

<meta-data
    android:name="android.support.FILE_PROVIDER_PATHS" <-- HERE!!!
    android:resource="@xml/provider_paths" />

Вам нужно использовать FILE_PROVIDER_PATHS вместо FILE_PROVIDE_PATHS.

person Skeeterdrums    schedule 05.01.2018
comment
Вы имеете в виду, что FILE_PROVIDE_PATHS правильный? Я так не думаю. - person Mahmood Dehghan; 23.03.2020

Пожалуйста, сделайте недействительными кеши и перезапустите функцию в студии Android, скорее всего, так и будет.

После этого перестройте и запустите приложение. В моем случае это сработало отлично.

person Musthafa    schedule 13.02.2018

Похоже, что-то настроено неправильно. Компилятор не находит android.support.FILE_PROVIDER_PATHS, поэтому он выдает эту ошибку, проверьте, все ли правильно установлено в вашем файле gradle, если вы измените пакет android.support, это исключение может возникают.

После исправления выполните очистку, перестройку или очистку и аннулирование кеша в Android Studio.

person Ben Levi    schedule 25.12.2017

это часто вызвано опечаткой, когда вы можете использовать android: value вместо android: resource в теге метаданных, указав file_paths.xml файл. Например, у вас может быть:

android:value="@xml/file_paths"

вместо

android:resource="@xml/file_paths"
person krishnakeshan    schedule 23.07.2018

Поставщик в AndroidManifest.xml, если вы используете библиотеку AndroidX.

  <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="com.yourdomain.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
person Rahul Khatri    schedule 04.11.2019

При использовании раньше (на той же тестовой машине) проблем не было, но внезапно возникла эта проблема, я не знаю, в чем причина. Я просмотрел несколько ссылок, изменил суффикс, и проблема была решена

Предыдущий код

android:authorities="${applicationId}.provider"

Модифицированный код

android:authorities="${applicationId}.fileprovider"
person jiawei.guo    schedule 10.12.2019

Недавно я столкнулся с той же проблемой. и никакое другое решение не помогло мне. Я закрыл проект из Android Studio, а затем вручную удалил файлы .gradle и .idea, и он работал как шарм :). А раньше у меня была проблема с властями - укажите на файлового провайдера, который вы используете со своим applicationId. Надеюсь, это кому-то поможет.

person pramod_m    schedule 02.07.2019

Иногда с вашим кодом все в порядке, но вы переключаете ветки, и старые промежуточные звенья сборки используются повторно, и это происходит. Для меня просто удаление каталога build/intermediates, а затем повторное создание и запуск приложения сработало. Это почти эквивалентно (но быстрее) очистке и восстановлению вашего проекта.

person Michał Klimczak    schedule 19.08.2020

Android: преобразовать значение + ресурс = @ xml / file_paths "

person Master Ahlong    schedule 19.03.2019
comment
Попытайтесь предоставить более подробную информацию. Вроде в чем была проблема? Как ваш подход работает лучше или отличается от принятого ответа и так далее. - person Nabil Farhan; 19.03.2019

У меня была эта проблема, просто удалите все .gradle и папку сборки, а затем перестройте приложение.

person farid    schedule 22.07.2019
comment
Вероятно, вам следует быть более точным, отвечая на вопросы, с объяснением источника проблемы. - person Clément Berthou; 22.07.2019