web-dev-qa-db-ja.com

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で上記のコードを実行しようとしていますが、両方のデバイスでクラッシュします。どこがおかしいのかわかりません。

this question &also this link も参照しましたが、私の問題の解決策が見つかりません。

6
priyanka kamthe

AndroidManifestファイルでは、メタデータにわずかなタイプミスがあります。

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

FILE_PROVIDE_PATHSではなくFILE_PROVIDER_PATHS。

9
Skeeterdrums

キャッシュを無効にして、Android studioで関数を再起動してください。

その後、アプリを再構築して実行します。私の場合、それは完璧に機能しました。

3
Musthafa

何かが間違って設定されているようです、コンパイラはAndroid.support.FILE_PROVIDER_PATHSを見つけられないため、このエラーがスローされ、Android.supportのパッケージを変更すると、この例外が発生する可能性があります発生します。

修正後、Android studio。でキャッシュを消去、再構築、または消去して無効にします。

1
Ben Levi

これは、タイプミスが原因であることが多く、メタデータタグでAndroid:resourceの代わりにAndroid:valueを使用する場合がありますfile_paths.xmlファイルを指定します。たとえば、次のようになります:

Android:value="@xml/file_paths"

の代わりに

Android:resource="@xml/file_paths"
1
krishnakeshan

AndroidXライブラリを使用している場合は、AndroidManifest.xmlのプロバイダー。

  <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>
0
Rahul Khatri

私は最近同じ問題に直面しました。そして、他の解決策は私には役に立たなかった。 Android Studioからプロジェクトを閉じた後、手動で.gradleおよび.ideaファイルを削除しました。これは魅力的でした:)。そして以前、私は当局に問題がありました-applicationIdで使用するファイルプロバイダーを指摘してください。これが誰かを助けることを願っています。

0
pramod_m

Android:値の変換+ resource = @ xml/file_paths」

0
Master Ahlong